BSM模型可由如下微分方程推导:
∂ f ∂ t + r s ∂ f ∂ S + 1 2 ∂ 2 f ∂ S 2 σ 2 S 2 = r f \frac{\partial f}{\partial t} + rs\frac{\partial f}{\partial S} + \frac{1}{2}\frac{\partial^2 f}{\partial S^2}\sigma^2S^2 = rf ∂t∂f+rs∂S∂f+21∂S2∂2fσ2S2=rf
上式中, f f f 表示期权价格, S S S 表示标的物的价格, r r r 表示连续复利的无风险收益率, σ \sigma σ 表示标的物收益率的波动率, t t t 表示时间变量。上述微分方程的解就是欧式看涨期权的定价公式,其求解过程可以参考这篇文章。
欧式看涨期权的定价公式:
c = S 0 N ( d 1 ) − K e − r T N ( d 2 ) c = S_0N(d_1) - Ke^{-rT}N(d_2) c=S0N(d1)−Ke−rTN(d2)
其中: N ( x ) N(x) N(x) 表示标准正态分布的累积分布函数
由 put-call parity 关系式可推出/欧式看跌期权的定价公式:
c + K e − r T = p + S 0 = = > c + Ke^{-rT} = p + S_0 ==> c+Ke−rT=p+S0==>
p = K e − r T N ( − d 2 ) − S 0 N ( − d 1 ) p = Ke^{-rT}N(-d_2) - S_0N(-d_1) p=Ke−rTN(−d2)−S0N(−d1)
其中:
d 1 = l n ( S 0 K ) + ( r + σ 2 / 2 ) T σ T d_1 = \frac{ln(\frac{S_0}{K}) + (r+\sigma^2/2)T}{\sigma \sqrt{T}} d1=σTln(KS0)+(r+σ2/2)T
d 2 = l n ( S 0 K ) + ( r − σ 2 / 2 ) T σ T = d 1 − σ T d_2 = \frac{ln(\frac{S_0}{K}) + (r-\sigma^2/2)T}{\sigma \sqrt{T}} = d_1 - \sigma \sqrt{T} d2=σTln(KS0)+(r−σ2/2)T=d1−σT
利用Python构建欧式看涨、看跌期权的定价公式
#call的计算
def call_BS(S,K,sigma,r,T):
import numpy as np
from scipy.stats import norm
d1 = (np.log(S/K)+(r+sigma**2/2)*T)/(sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
return S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
#put的计算
def put_BS(S,K,sigma,r,T):
import numpy as np
from scipy.stats import norm
d1 = (np.log(S/K)+(r+sigma**2/2)*T)/(sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
return K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)
call = call_BS(S = 5.29,K=6,sigma=0.24,r=0.04,T=0.5)
put = put_BS(S = 5.29,K=6,sigma=0.24,r=0.04,T=0.5)
print('看涨期权的价格:',round(call,4))
print('看跌期权的价格:',round(put,4))
看涨期权的价格: 0.1532
看跌期权的价格: 0.7443
运用BSM模型的期权定价公式,利用Python程序模拟S与期权价格的关系
# 标的价格的变动
S_list = np.linspace(5,7,100)
call_list1 = call_BS(S = S_list,K=6,sigma=0.24,r=0.04,T=0.5)
put_list1 = put_BS(S = S_list,K=6,sigma=0.24,r=0.04,T=0.5)
#画图展示
plt.figure(figsize=(8,6))
plt.plot(S_list,call_list1,label='看涨期权')
plt.plot(S_list,put_list1,label='看跌期权')
plt.legend()
plt.grid('True')
运用BSM模型的期权定价公式,利用Python程序模拟K与期权价格的关系
# 执行价格的变动
K_list = np.linspace(5,7,100)
call_list1 = call_BS(S = 5.29,K=K_list,sigma=0.24,r=0.04,T=0.5)
put_list1 = put_BS(S = 5.29,K=K_list,sigma=0.24,r=0.04,T=0.5)
plt.figure(figsize=(8,6))
plt.plot(K_list,call_list1,label='看涨期权')
plt.plot(K_list,put_list1,label='看跌期权')
plt.legend()
plt.grid('True')
运用BSM模型的期权定价公式,利用Python程序模拟波动率与期权价格的关系
# 波动率的变动
sigma_list = np.linspace(0.05,0.35,100)
call_list1 = call_BS(S = 5.29,K=6,sigma=sigma_list,r=0.04,T=0.5)
put_list1 = put_BS(S = 5.29,K=6,sigma=sigma_list,r=0.04,T=0.5)
plt.figure(figsize=(8,6))
plt.plot(sigma_list,call_list1,label='看涨期权')
plt.plot(sigma_list,put_list1,label='看跌期权')
plt.legend()
plt.grid('True')
运用BSM模型的期权定价公式,利用Python程序模拟无风险收益率与期权价格的关系
# 无风险收益率的变动
r_list = np.linspace(0.01,0.1,100)
call_list1 = call_BS(S = 5.29,K=6,sigma=0.24,r=r_list,T=0.5)
put_list1 = put_BS(S = 5.29,K=6,sigma=0.24,r=r_list,T=0.5)
plt.figure(figsize=(8,6))
plt.plot(r_list,call_list1,label='看涨期权')
plt.plot(r_list,put_list1,label='看跌期权')
plt.legend()
plt.grid('True')
运用BSM模型的期权定价公式,利用Python程序模拟无风险收益率与期权价格的关系
# 时间的变动
T_list = np.linspace(0.01,3,100)
call_list1 = call_BS(S = 5.29,K=6,sigma=0.24,r=0.04,T=T_list)
put_list1 = put_BS(S = 5.29,K=6,sigma=0.24,r=0.04,T=T_list)
plt.figure(figsize=(8,6))
plt.plot(T_list,call_list1,label='看涨期权')
plt.plot(T_list,put_list1,label='看跌期权')
plt.legend()
plt.grid('True')