期权专题6:BSM期权定价

目录

1. 模型简介

2.模型公式

3.代码复现

 4.参数影响

S-标的价格

K-行权价格

vol-波动率

T-剩余期限

r-无风险利率


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},因此看涨期权的价格也就相应越高;另一方面,利率越高,意味着购买标的本身的资金占用成本越高,因此购买看涨期权可以降低成本占用,对看涨期权的购买意愿也就越强烈。看跌期权则是与看涨期权反之。

本期分享到此结束,有疑问欢迎留言。


  • 33
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值