<>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模型代码
# BSM模型 # Black-Scholes-Merton (1973) European Call & Put Valuation import math
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt
from scipy.integrateimport quad mpl.rcParams['font.family'] = 'serif' from
scipy.statsimport 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['标的资产价格'] # initial index level K =data['行权价'] # strike level T
=data['到期天/年'] r = data['无风险利率']/100 # constant short rate sigma =0.02#
constant volatility of diffusion 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['期权价格'] # mape bs_test_mape=np.mean(
np.abs((bs_test_pred-test_label)/test_label)) # rmse bs_test_rmse=np.sqrt(
np.mean(np.square(bs_test_pred-test_label))) # mae bs_test_mae=np.mean(np.abs(
bs_test_pred-test_label)) #MSE 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.legend() 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.legend() plt.grid()
plt.xlabel('标的资产价格') plt.ylabel('期权内在价值')

<>四、期权的时间价值

期权的时间价值等于期权价格减去期权的内在价值。
例子
# 例子 # 时间价值 # 期权参数 St=np.linspace(4000,12000,150) # initial index level K =8000
# strike level T=1 r = 0.025 # constant short rate sigma =0.2# constant
volatility of diffusion 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['标的资产价格'] # initial index level K =data['行权价'] # strike
level T=data['到期天/年'] r = data['无风险利率']/100 # constant short rate sigma =0.02#
constant volatility of diffusion 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量化。此外,本章还对期权的时间价值、内在价值进行了介绍。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信