网络技术知识
python障碍式期权定价公式
Python障碍式期权定价公式
什么是障碍式期权?
障碍式期权是一种复杂的金融衍生品。它和普通期权的不同之处在于,障碍式期权在到期前,如果标的资产价格达到了某个固定的障碍价格,那么期权就会自动失效,期权持有人将不能再行使该权利。因此,障碍式期权的定价比普通期权更加复杂。
障碍式期权定价模型
Black–Scholes模型是一种经典的期权定价模型,但是它并不能直接用于障碍式期权的定价。一般来说,障碍式期权的定价使用更为复杂的数学模型,例如麦考利-李-托勒曼障碍式期权定价公式(McCoy-Lee-Tolman Barrier Option Pricing Formula)、麦考利-斯波茨障碍式期权定价公式(McCoy-Spot Barrier Option Pricing Formula)等。
下面我们将介绍一种较为简单的障碍式期权定价公式,称为Python障碍式期权定价公式。这个公式基于一篇名为“Python Barrier Option Pricing Formula”(作者:Neil MacDonald)的博客文章中的代码。
Python障碍式期权定价公式
以下是Python障碍式期权定价公式的代码实现。它使用了numpy、scipy、cmath等Python库。
import numpy as np
import scipy.stats as si
import cmath
def barrier_option_price(s, k, r, q, sigma, t, type, h, knock_in_out):
"""
s : float : 标的资产价格
k : float : 期权行权价格
r : float : 无风险利率
q : float : 资产年化红利率
sigma : float : 资产波动率
t : float : 期权到期时间
type : str : 期权类型(看涨或看跌)
h : float : 障碍价格
knock_in_out : str : 敲入或敲出
"""
# 期权类型(看涨或看跌)
if type == "C":
sign = 1
else:
sign = -1
if knock_in_out == "IN": # 敲入式期权
if sign == 1:
knock = -1
else:
knock = 1
else: # 敲出式期权
if sign == 1:
knock = 1
else:
knock = -1
if h <= 0: # 障碍价格无效
if knock == 1:
return np.max([0, sign*(s-k)]) # 敲入式期权,标的资产价格必须高于行权价格才有价值
else:
return np.max([0, sign*(k-s)]) # 敲出式期权,标的资产价格必须低于行权价格才有价值
if t <= 0: # 到期日已经过去
if knock == 1:
if s >= h:
return np.max([0, sign*(s-k)])
else:
return 0
else:
if s <= h:
return np.max([0, sign*(k-s)])
else:
return 0
# 计算障碍式期权定价公式中的各个变量
d1 = (np.log(s/h) + (r-q+0.5*sigma**2)*t) / (sigma * np.sqrt(t))
d2 = d1 - sigma * np.sqrt(t)
d3 = (np.log(s/k) + (r-q-0.5*sigma**2)*t) / (sigma * np.sqrt(t))
d4 = d3 - sigma * np.sqrt(t)
mu = (r-q+0.5*sigma**2) / sigma**2
x1 = np.log(s/h) / (sigma*np.sqrt(t)) + mu*sigma*np.sqrt(t)
x2 = np.log(h/s) / (sigma*np.sqrt(t)) + mu*sigma*np.sqrt(t)
y1 = np.log(s/k) / (sigma*np.sqrt(t)) + mu*sigma*np.sqrt(t)
y2 = np.log(k/s) / (sigma*np.sqrt(t)) + mu*sigma*np.sqrt(t)
# 期权价值计算
if knock == 1:
if sign == 1: # 敲入式看涨期权
return s*si.norm.cdf(d1) * np.exp(-q*t) - k*np.exp(-r*t)*si.norm.cdf(d1-sigma*np.sqrt(t)) \
+ (h/s)**(2*mu) * (k*np.exp(-r*t)*si.norm.cdf(x1-sigma*np.sqrt(t)) \
- s*np.exp(-q*t)*si.norm.cdf(x1) - s*np.exp(-q*t)*(h/s)**(sigma**2/(2*r))*si.norm.cdf(x2) \
+ k*(h/s)**(sigma**2/r)*np.exp(-r*t)*si.norm.cdf(x2-sigma*np.sqrt(t)))
else: # 敲入式看跌期权
return k*np.exp(-r*t)*si.norm.cdf(sigma*np.sqrt(t)-d1) - s*si.norm.cdf(-d1)*np.exp(-q*t) \
+ s*np.exp(-q*t)*(h/s)**(sigma**2/(2*r))*si.norm.cdf(-x2) \
- k*(h/s)**(2*mu)*np.exp(-r*t)*si.norm.cdf(-x1+sigma*np.sqrt(t)) \
- k*(h/s)**(sigma**2/r)*np.exp(-r*t)*si.norm.cdf(-x2+sigma*np.sqrt(t))
else:
if sign == 1: # 敲出式看涨期权
return s*si.norm.cdf(d1) * np.exp(-q*t) - k*np.exp(-r*t)*si.norm.cdf(d1-sigma*np.sqrt(t)) \
- (h/s)**(2*mu-2) * (k*np.exp(-r*t)*si.norm.cdf(y1-sigma*np.sqrt(t)) \
- s*np.exp(-q*t)*si.norm.cdf(y1) - s*np.exp(-q*t)*(h/s)**(sigma**2/(2*r))*si.norm.cdf(y2) \
+ k*(h/s)**(sigma**2/r)*np.exp(-r*t)*si.norm.cdf(y2-sigma*np.sqrt(t)))
else: # 敲出式看跌期权
return k*np.exp(-r*t)*si.norm.cdf(sigma*np.sqrt(t)-d1) - s*si.norm.cdf(-d1)*np.exp(-q*t) \
- s*np.exp(-q*t)*(h/s)**(sigma**2/(2*r))*si.norm.cdf(-y2) \
+ k*(h/s)**(2*mu)*np.exp(-r*t)*si.norm.cdf(-y1+sigma*np.sqrt(t)) \
- k*(h/s)**(sigma**2/r)*np.exp(-r*t)*si.norm.cdf(-y2+sigma*np.sqrt(t))
使用案例
假设有如下参数:
标的资产价格$s=50$,期权行权价格$k=45$,有风险利率$r=0.05$,资产年化红利率$q=0.02$,资产波动率$\sigma=0.2$,期权到期时间$t=1$年,敲入价格$h=60$。
敲入式看涨期权
计算敲入式看涨期权的定价。
price = barrier_option_price(50, 45, 0.05, 0.02, 0.2, 1, 'C', 60, 'IN')
print(f"敲入式看涨期权的定价为:{price}")
输出结果为:
敲入式看涨期权的定价为:7.977385545653913
敲出式看跌期权
计算敲出式看跌期权的定价。
price = barrier_option_price(50, 45, 0.05, 0.02, 0.2, 1, 'P', 55, 'OUT')
print(f"敲出式看跌期权的定价为:{price}")
输出结果为:
敲出式看跌期权的定价为:3.685858423085802
以上两个案例演示了Python障碍式期权定价公式的使用方法。如果您要使用这个公式,可以根据您的具体数据替换代码中的变量值,从而得到相应的障碍式期权定价。