BSM模型是最常用的期权定价模型之一,虽然其假设不合符市场事实,但是该模型的提出奠定了现代金融衍生品法则的基石。
该模型在学界的发展:
早期的期权定价大多采用Black-Scholes(B-S)期权定价模型,B-S模型假定标的资产收益率服从正态分布且波动率是常数,但是这一假定无法解释“波动率微笑”和“杠杆效应”。在随后的研究中,不断有学者对B-S模型进行改进,例如修正常数波动率、重新刻画资产波动率分布等。
随机波动率模型对B-S模型做出了优化,较为著名的模型有Heston、3/2、4/2模型。
除了假设波动率是标的资产和时间的随机过程的随机波动率模型以外,还有一种模型是假设波动率是标的资产和时间的确定性函数的局部波动率。
大量研究表明,随机波动性和价格跳跃是资产价格运动的内在特征。当市场上发生突发情况时,随机波动率模型中需要引入跳过程来描述这种突发情况。
此外,尽管仿射型Heston随机波动模型在期权解析定价上带来极大便利,但是其无法较好地描述金融时间序列的非线性特征。通过在Heston模型方差过程的扩散项中引入非仿射参数建立非仿射随机波动率模型,可以刻画更丰富的资产价格行为。
B-S模型认为期权的标的资产价格服从扩散模型,学者们不断对扩散模型进行改进并得到相应的期权定价模型,如跳扩散期权价格模型、随机波动率模型、非仿射随机波动率期权定价模型等,这些模型统称为基于参数扩散过程的期权定价模型。后有学者把扩散方程设定为非参数形式,建立了基于非参数扩散过程的期权定价模型。
近年来学者们在期权定价模型上取得了长足进步,但是这些改进模型仍然忽略了一些重要的影响股价走势的因素,如大盘指数与个股走势存在着长期的均衡关系。国外学者建立了股灾期间的期权定价模型。
以上的介绍来自于笔者阅读十余篇相关文献整理的资料的一部分。
接下来介绍两中BSM模型
1.不带股利的BSM模型
2.带股利的BSM模型
以不带股利的BSM模型为例,其表达式为:
带股利的模型则是将股利D贴现后,用股票在t时刻的价值减去股利现值。
接下来介绍两种模型的求解方法,使用python求解,代码为:
不带股利的BSM模型
# Black-Scholes-Merton (1973) European Call & Put Valuation
from pylab import plt
plt.style.use('seaborn')
%matplotlib inline
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'
#
# Helper Functions
#
def dN(x):
''' Probability density function of standard normal random variable x. ''' #标准正态随机变量 x 的概率密度函数
return math.exp(-0.5 * x ** 2) / math.sqrt(2 * math.pi)
def N(d):
''' Cumulative density function of standard normal random variable x. '''
return quad(lambda x: dN(x), -20, d, limit=50)[0]
def d1f(St, K, t, T, r, sigma):#设置函数d1
''' Black-Scholes-Merton d1 function.
Parameters see e.g. BSM_call_value function. '''
d1 = (math.log(St / K) + (r + 0.5 * sigma ** 2)* (T - t)) / (sigma * math.sqrt(T - t))
return d1
#
# Valuation Functions
#
#欧式看涨期权函数
def BSM_call_value(St, K, t, T, r, sigma):
''' Calculates Black-Scholes-Merton European call option value.
Parameters
==========
St : float
stock/index level at time t
K : float
strike price
t : float
valuation date
T : float
date of maturity/time-to-maturity if t = 0; T > t
r : float
constant, risk-less short rate
sigma : float
volatility
Returns
=======
call_value : float
European call present value at t
'''
d1 = d1f(St, K, t, T, r, sigma)
d2 = d1 - sigma * math.sqrt(T - t)
call_value = St * N(d1) - math.exp(-r * (T - t)) * K * N(d2)
return call_value
#欧式看跌期权函数
def BSM_put_value(St, K, t, T, r, sigma):
''' Calculates Black-Scholes-Merton European put option value.
Parameters
==========
St : float
stock/index level at time t
K : float
strike price
t : float
valuation date
T : float
date of maturity/time-to-maturity if t = 0; T > t
r : float
constant, risk-less short rate
sigma : float
volatility
Returns
=======
put_value : float
European put present value at t
'''
put_value = BSM_call_value(St, K, t, T, r, sigma) \
- St + math.exp(-r * (T - t)) * K
return put_value
# 赋值
St = 100.00 # initial index level
K = 100.00 # strike level
T = 1. # call option maturity
r = 0.05 # constant short rate
sigma = 0.2 # constant volatility of diffusion
t=0
print('BSM模型求解的看涨期权价格为:',BSM_call_value(St, K, t, T, r, sigma))
print('BSM模型求解的看跌期权价格为:',BSM_put_value(St, K, t, T, r, sigma))
求解后的结果如下:
BSM模型求解的看涨期权价格为: 10.45058357218553
BSM模型求解的看跌期权价格为: 5.573526022256942
带股利的BSM模型
以上程序可以再次运行,修改参数即可
首先求出股票价格减去股利现值后的股票价格
Su=St-D*np.exp(-((t)*r))
Su
然后设置参数
# 赋值
St = 100.00 # initial index level
K = 100.00 # strike level
T = 1. # call option maturity
r = 0.05 # constant short rate
sigma=0.2 # constant volatility of diffusion
t=20/360
D=2
print('BSM模型求解的看涨期权价格为:',BSM_call_value(St, K, t, T, r, sigma))
print('BSM模型求解的看跌期权价格为:',BSM_put_value(St, K, t, T, r, sigma))
结果如下:
BSM模型求解的看涨期权价格为: 10.090922223626734
BSM模型求解的看跌期权价格为: 5.478462396092041
最后,可以根据公式画出期权现值与行权价、到期日、短期利率、波动率的关系
以现值和执行价的代码为例
# C(K) plot现值与执行价的关系
plt.subplot(221)
klist = np.linspace(80, 120, points)
vlist = [function(Su, K, t, T, r, sigma) for K in klist]
plt.plot(klist, vlist)
plt.grid(True)
plt.xlabel('strike $K$')
plt.ylabel('present value')