Black-Scholes-Merton模型
前言
Black-Scholes-Merton(三人几乎在同一年同一时间提出该模型)模型又被称为BS模型(事实上,这个叫法更为广泛和流行)。本章内容会对BS模型进行一个简要的介绍,并且基于python进行量化。此外,本章还将介绍期权的时间价值、期权的内在价值等概念。
一、BS模型
1.模型简介
期权定价理论最早的提出者是法国的经济学家 Bachelier,其在 1900 年的一篇文章中首次提出关于期权定价的问题,随后,Boness 将其理论进行补充。在 1973 年,美国的数学家、经济学家 Black 和 Scholes提出了一个较为完整的期权定价模型,称为 Balck-choles 模型。Balck-Scholes 模型是较为理想的欧式期权定价模型,该模型的提出为期权的发展奠定了基础,在理论和实践方面都有着重大的意义。
Black-Scholes 期权的价格模型是建立在严格的假设基础上的,包 括以下几点: 首先,期权标的物的价格服从布朗几何运动,因此股票价格的收 益率必须服从对数正态分布。 第二,商业市场没有摩擦,没有税收,没有卖空限制。 第三,无风险利率不变。 第四,期权不能在到期日之前行使,必须是欧式期权。
2.模型数学公式
二、BS模型的python量化
1.BS模型代码
import math
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy.integrate import quad
mpl.rcParams['font.family'] = 'serif'
from scipy.stats import norm
def BSM_call_value(St, K, t, T, r, sigma):
d1=(np.log(St/K)+(r+0.5*sigma**2)*(T-t))/(sigma*np.sqrt((T-t)))
d2=d1-sigma*np.sqrt((T-t))
return St*norm.cdf(d1)-K*np.exp(-r*(T-t))*norm.cdf(d2)
def BSM_put_value(St, K, t, T, r, sigma):
d1=(np.log(St/K)+(r+0.5*sigma**2)*(T-t))/(sigma*np.sqrt((T-t)))
d2=d1-sigma*np.sqrt((T-t))
return K*np.exp(-r*(T-t))*norm.cdf(-d2)-St*norm.cdf(-d1)
举例
St=100
K=98
T=1
t=0
r=0.015
sigma=0.25
call=BSM_call_value(St, K, t, T, r, sigma)
put=BSM_put_value(St, K, t, T, r, sigma)
print('看涨期权价格',call,'看跌期权价格',put)
实际数据 将上证50ETF期权一分钟高频数据进行实证。 数据一览
St= data['标的资产价格']
K =data['行权价']
T=data['到期天/年']
r = data['无风险利率']/100
sigma =0.02
t=0
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc("font",family='DengXian')
BS_Call_price=BSM_call_value(St, K, t, T, r, sigma)
plt.figure(figsize=(15,10))
plt.plot(np.array(BS_Call_price),label='BS模型')
plt.plot(np.array(data['期权价格']),label='实际期权价格')
plt.legend()
plt.ylabel('价格(元)')
plt.show()
从图中可以看出,BS模型对期权实际价格的预测情况差强人意,预测初期和预测末期的精准度不错,而预测中期则波动较大。
2.预测误差分析
对预测结果进行误差分析。误差分析指标如下
均方误差(Mean Square Error) 均方根误差(Root Mean Square Error) 平均绝对误差(Mean Absolute Error) 平均绝对百分比误差(Mean Absolute Percentage Error) 以上指标越小表明误差越小。
bs_test_pred=BS_Call_price
test_label=data['期权价格']
bs_test_mape=np.mean(np.abs((bs_test_pred-test_label)/test_label))
bs_test_rmse=np.sqrt(np.mean(np.square(bs_test_pred-test_label)))
bs_test_mae=np.mean(np.abs(bs_test_pred-test_label))
bs_test_mse=np.sum((test_label-bs_test_pred)**2)/len(bs_test_pred)
结果如下:
BS模型测试集的mape: 0.07028108461117291 rmse: 0.030983676079028164 mae: 0.024887289528898276 MSE: 0.0009599881833701404
可以看出,BS模型的预测结果还可以,基本符合了预期。
三、期权的内在价值
站在期权合约持有人的角度,可以用期权的内在价值(inner value)刻画到期日时持有人的收益情况: h=max(St-K,0)
例子 假设指数期权行权价为3650,指数在到期日时的收盘价在3500-3800之间。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
K=3650
S=np.linspace(3500,3800,100)
h=np.maximum(S-K,0)
plt.figure(figsize=(12,10))
plt.plot(S,h,lw=2.5)
plt.grid()
plt.xlabel('标的资产价格')
plt.ylabel('期权内在价值')
可以看出,期权的内在价值取决于到期日当天的标的资产价格水平。
实际数据 上证50ETF期权一分钟高频数据分析 通过图可以看出,实际数据中,标的资产价格大于行权价,其内在价值大于0
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
K=data['行权价']
S=data['标的资产价格']
h=np.maximum(S-K,0)
plt.figure(figsize=(12,10))
plt.plot(S,h,lw=2.5)
plt.grid()
plt.xlabel('标的资产价格')
plt.ylabel('期权内在价值')
四、期权的时间价值
期权的时间价值等于期权价格减去期权的内在价值。 例子
St=np.linspace(4000,12000,150)
K =8000
T=1
r = 0.025
sigma =0.2
t=0
h=np.maximum(St-K,0)
BS_Call_price=BSM_call_value(St, K, t, T, r, sigma)
plt.figure(figsize=(12,10))
plt.plot(St,h,'b-.',lw=2.5,label='期权内在价值')
plt.plot(St,BS_Call_price,'r',lw=2.5,label='期权现值')
plt.plot(St,BS_Call_price-h,'g',lw=2.5,label='期权时间价值')
plt.legend()
plt.grid()
plt.show()
从图中可以看出,期权的时间价值在指数价格等于行权价时达到最高,此后开始逐渐衰减。
实际数据
St= data['标的资产价格']
K =data['行权价']
T=data['到期天/年']
r = data['无风险利率']/100
sigma =0.02
t=0
h=np.maximum(St-K,0)
BS_Call_price=BSM_call_value(St, K, t, T, r, sigma)
plt.figure(figsize=(12,10))
plt.plot(h,'b-.',lw=2.5,label='期权内在价值')
plt.plot(BS_Call_price,'r',lw=2.5,label='期权现值')
plt.plot(BS_Call_price-h,'g--',lw=2.5,label='期权时间价值')
plt.legend()
plt.grid()
plt.show()
总结
本章对期权定价的经典模型BS模型进行了简介,并且对模型的定价进行python量化。此外,本章还对期权的时间价值、内在价值进行了介绍。
|