期权定价模型之经典--BS模型

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模型_第1张图片
期权定价模型之经典--BS模型_第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.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期权一分钟高频数据进行实证。
数据一览
期权定价模型之经典--BS模型_第3张图片

# 看涨期权
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模型_第4张图片
从图中可以看出,BS模型对期权实际价格的预测情况差强人意,预测初期和预测末期的精准度不错,而预测中期则波动较大。

2.预测误差分析

对预测结果进行误差分析。误差分析指标如下

均方误差(Mean Square Error)
均方根误差(Root Mean Square Error)
平均绝对误差(Mean Absolute Error)
平均绝对百分比误差(Mean Absolute Percentage Error)
以上指标越小表明误差越小。

期权定价模型之经典--BS模型_第5张图片

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('期权内在价值')

期权定价模型之经典--BS模型_第6张图片
可以看出,期权的内在价值取决于到期日当天的标的资产价格水平。

实际数据
上证50ETF期权一分钟高频数据分析
期权定价模型之经典--BS模型_第7张图片
通过图可以看出,实际数据中,标的资产价格大于行权价,其内在价值大于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('期权内在价值')

期权定价模型之经典--BS模型_第8张图片

四、期权的时间价值

在这里插入图片描述
期权的时间价值等于期权价格减去期权的内在价值。
例子

# 例子
# 时间价值
# 期权参数
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()

期权定价模型之经典--BS模型_第9张图片
从图中可以看出,期权的时间价值在指数价格等于行权价时达到最高,此后开始逐渐衰减。

实际数据

# 时间价值
# 期权参数
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模型_第10张图片

总结

本章对期权定价的经典模型BS模型进行了简介,并且对模型的定价进行python量化。此外,本章还对期权的时间价值、内在价值进行了介绍。

你可能感兴趣的:(期权量化,机器学习,概率论,线性代数)