目录
1. 模型简介
BSM(布莱克-斯科尔特-莫顿)模型是最常见,最流行的期权定价模型之一。模型的假设前提为:
1.标的资产价格呈几何布朗运动。
2.标的资产价格连续变动,不存在跳空缺口。
3.无风险利率是已知常数,可以用无风险利率无限制借贷。
4.标的资产价格的波动率为已知常数。
5.市场无摩擦成本,无套利空间;标的流动性好,可以卖空。
BSM模型的诸多假设都是不切实际的,但是其目的并不是为了精确的计算期权的价格,而是提供一个基准价格,便于我们比较期权价格的相对贵贱。换句话说,BSM模型是一个寻求期权合理价格的优质框架。
2.模型公式
BSM模型仅适用于欧式期权,不考虑股利发放的模型公式如下:
其中,
C:看涨期权的价格;
P:看跌期权的价格;
S0:标的资产价格;
K:期权的执行价;
r:连续复利无风险利率;
σ:标的资产的年化波动率;
T:期权合约的剩余期限(年);
N(*):累积标准正态分布的标准分布
3.代码复现
def get_constant_value(in_value, fix_value):
# 当参数数值未传入时,取默认值
if in_value == None:
out_value = fix_value
else:
out_value = in_value
return out_value
考虑到模型的参数较多,每一次传参比较麻烦。因此设定了一个函数,若未传入该参数,则取默认值。S默认值100,K默认值120,年化波动率默认值20%,无风险利率默认值3%,剩余期限默认值0.5年(此处仅为了后续的参数影响分析时,代码更简洁)。盛
import numpy as np
from scipy.stats import norm
def BSM_option_price(d_type, S = None, K = None, vol = None, T = None, r = None ):
'''
BSM-期权定价模型
----------
d_type:str,期权类型,call/put
S:float,标的资产价格,默认值为100
K:float,行权价格,默认值为120
vol:float,年化波动率,默认值为0.2
T:float,剩余期限(折算成年),默认值为0.5
r:float,连续复利无风险利率,默认值为0.03
-------
'''
S1 = get_constant_value(S, 100)
K1 = get_constant_value(K, 120)
vol1 = get_constant_value(vol, 0.2)
T1 = get_constant_value(T, 0.5)
r1 = get_constant_value(r, 0.03)
value = vol1 * np.sqrt(T1)
d1 = (np.log(S1/K1) + (r1 + 0.5*vol1**2) * T1)/value
d2 = d1 - value
dis_value = K1 * np.exp(-r1 * T1)
if d_type == 'call':
option_value = S1 * norm.cdf(d1) - dis_value * norm.cdf(d2)
elif d_type == 'put':
option_value = dis_value * norm.cdf(-d2) - S1 * norm.cdf(-d1)
out_value = option_value
return out_value
上述主要是BSM模型的主要代码,必传参数为期权的类型,其余参数都可省略。接下来我们分别运行测试一下完整参数和简略参数的函数:
if __name__ == '__main__':
print('call_option_price: ',BSM_option_price('call'))
print('put_option_price: ',BSM_option_price('put'))
new_call = BSM_option_price('call',100,150,0.2,0.5,0.03)
new_put = BSM_option_price('put',100,80,0.2,0.5,0.03)
print('new_call: ',new_call)
print('new_put : ',new_put)
对应得到的结果为:
new_call在默认参数的基础上将执行价格调整为150(默认是120),对应的期权价格有0.89下降至0.01;new_put在默认参数的基础上将执行价格调整为80(默认是120),对应的期权价格有19.10下降至0.23。
4.参数影响
在明确了模型的表达式的基础上,接下来采用控制变量法,模拟出各个变量对期权价格的走势图象,同时分析其对期权价格的影响方向。
if __name__ == '__main__':
variable_name = '标的价格'
variable_list = [x for x in range(0,200)]
call_price_list = []
put_price_list = []
for variable in variable_list:
call_price = BSM_option_price('call', S = variable)
put_price = BSM_option_price('put', S = variable)
call_price_list.append(call_price)
put_price_list.append(put_price)
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False # 防止中文乱码的处理
plt.title(variable_name + '与期权价格的关系')
plt.xlabel(variable_name)
plt.ylabel('期权价值')
plt.plot(variable_list, call_price_list, label= '欧式看涨期权', color='orange')
plt.plot(variable_list, put_price_list, label= '欧式看跌期权 ', color='blue')
plt.legend(loc='best')
plt.show()
上面的代码以标的价格作为举例,如果更换变量,我们只需要将variable_name ,variable_list以及BSM_option_price的参数S进行更换即可;同时variable_list应该根据变量的值设置不同的间距。我们再以执行价格做一个举例,后期就不再逐一展示相应的代码。
if __name__ == '__main__':
variable_name = '执行价格'
variable_list = [x for x in range(50,150)]
call_price_list = []
put_price_list = []
for variable in variable_list:
call_price = BSM_option_price('call', K = variable)
put_price = BSM_option_price('put', K = variable)
call_price_list.append(call_price)
put_price_list.append(put_price)
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False # 防止中文乱码的处理
plt.title(variable_name + '与期权价格的关系')
plt.xlabel(variable_name)
plt.ylabel('期权价值')
plt.plot(variable_list, call_price_list, label= '欧式看涨期权', color='orange')
plt.plot(variable_list, put_price_list, label= '欧式看跌期权 ', color='blue')
plt.legend(loc='best')
plt.show()
S-标的价格
从图中可以看出,其他参数不变的情况下:标的价格与看涨期权价值呈现出非线性正相关趋势,标的价格与看跌期权价格呈现出非线性负相关趋势。该结论结合实际场景,理解起来比较容易。
K-行权价格
从图中可以看出,其他参数不变的情况下:看涨期权价值与标的执行价格呈现出非线性负相关趋势,看跌期权价值与标的执行价格呈现出非线性正相关趋势。这一点理解起来也比较容易,对于看涨期权,执行价越高,到期行权的可能性越低,因此期权价格也越低。
vol-波动率
从图中可以看出,其他参数不变的情况下:波动率与期权价格呈现出非线性正相关趋势,且伴随着波动率的增大,期权价值增加的速率加快。这主要因为,标的波动率变大时,期权由虚值变成市值的概率增大,因此其内含价值也随之增大。
T-剩余期限
上述两个期权皆调整为平值期权(行权价=标的价格=100)。这样处理的目的是更好的展示趋势(若二者非平值,期权价值差异过大,会导致纵坐标的刻度线拥挤,从而出现曲线的趋势度不明朗的情况)。从图中可以发现,剩余期限与期权价格正相关,临近到期的时候,期权价格下跌的速度加快。期权的时间价值主要由两部分组成,波动率带来的时间价值以及资金占用的时间价值。资金占用的时间价值基本是均匀变动,不会随着期权的到期出现明显的变化,因此到期期权价值的衰减加速主要是由波动率带来的时间价值引起。根据布朗运动的性质:期权剩余到期时间内的波动率是时间的一个平方根函数。所以当时间趋于0时,波动率的不确定性会使得时间价值快速衰减。
r-无风险利率
从图中可以看出,其他参数不变的情况下:无风险利率与看跌期权价格呈现出近似线性负相关趋势,无风险利率与看涨期权价格呈现出近似线性正相关趋势。主要是因为:无风险利率越高,看涨期权执行价对应的现值越低,因为看涨期权价值=max{标的价格-执行价格,0},因此看涨期权的价格也就相应越高;另一方面,利率越高,意味着购买标的本身的资金占用成本越高,因此购买看涨期权可以降低成本占用,对看涨期权的购买意愿也就越强烈。看跌期权则是与看涨期权反之。
本期分享到此结束,有疑问欢迎留言。