目录
本文主要分享期权的greek计算以及对应趋势图的代码实现。关于各个期权字母的介绍,网上文章非常多,此处就简单提及。
1.公式定义
根据BSM模型,可以得到d1,d2,对应的公式;再根据复合函数的求导,可以得到:
1.1 delta
含义:标的价格每变动一个单位,期权价格(即权利金)产生的变化,例如:标的价格上涨1美元,期权价格变动0.2美元,对应的Delta为0.2。call的值为正,取值在0到1之间;put的值为负,取值在-1到0之间。平值期权的值为0.5,实值程度越高的期权,值的绝对值越接近1,虚值程度越高的期权,值的绝对值越接近0。值的正负代表了期权的方向性风险。(图像类似“s”,横坐标表示实值虚值的程度)对应的公式为:
1.2 gamma
含义:代表delta对于股票价格的波动率,标的价每波动一个单位,delta值产生的变化,对应delta的一阶导数,例如delta为0.3,gamma为0.2,当标的价格上涨1个单位时,delta将变为0.5(即0.3+0.2*1)。gamma的值都为正,随着时间的流逝,实值和虚值期权的gamma值会减小,平值期权的gamma值会变大(图像类似开口向下的二次函数,横坐标表示实值虚值的程度),平值期权临近到期日时,gamma值会急剧增大。对应的公式为:
1.3 vega
含义:代表波动率每变动1%,对期权价格的影响,例如一个期权的vega值为0.35,当隐含波动率上升1%时,期权的价格增加0.35。vage总是为正,因为波动率不可能为负,期权价值与波动率呈正比例,平值期权,相对于实值和虚值期权,波动更为敏感,到期日越长,对波动率更为敏感。对应的公式为:
1.4 theta
含义:时间流逝对期权价格产生的变化,也即每减少一天,期权价格的变化值就是Theta。例如一个期权合约的Theta值为0.6,则表明在其他条件不变的情况下,这个期权合约每天的价值减少0.6美元。值为负数;行权价附近绝对值越大。对应的公式为:
1.5 rho
含义:代表无风险利率的单位变动对期权价格产生的影响,通常利率的变化较小,因此其对期权价格的影响是最小的。对于call而言,为正值,利率上升,期权价值增加,股票的价格越高,利率的影响越大;对于put来说,为负值,利率上升,期权的价值减小,股票价格越低,利率的影响越大;利率对于实值期权的影响大于虚值期权,随着到期日的临近,利率对期权价值的影响越小。。对应的公式为:
2.代码复现
在代码中,顺便加上了Price函数,基于BSM模型计算的期权价格。
import numpy as np
from scipy.stats import norm
class GREEK(object):
def __init__(self, S=None, K=None, vol=None, T=None, r=None, direction=None):
self.T = T or 1 # 到期期限,默认值为1
self.S = S or 10 # 标的价格,默认值为10
self.K = K or 10 # 执行价,默认值为10
self.r = r or 0.03 # 无风险利率,默认值为3%
self.vol = vol or 0.2 # 波动率,默认值为20%
self.dir = direction or 'call' # 期权方向,默认值为call-看涨
# 衍生的基础数据
self.vol_T = self.vol * np.sqrt(self.T) # 波动率乘根号下的到期期限
self.d1 = (np.log(self.S / self.K) + (self.r + self.vol ** 2 / 2) * self.T) / self.vol_T # d1的值
self.d2 = self.d1 - self.vol_T # d2的值
self.N_d1 = norm.cdf(self.d1) # N(d1)的值
self.N_d1_diff = norm.pdf(self.d1) # N(d1)的求导值
self.N_d2 = norm.cdf(self.d2) # N(d2)的值
def Price(self):
# BSM计算期权的价格
part = self.K * np.exp(-self.r * self.T)
if self.dir == 'call':
price_value = self.S * self.N_d1 - part * self.N_d2
else:
price_value = part * (1 - self.N_d2) - self.S * (1 - self.N_d1)
return price_value
def Delta(self):
# 计算Delta的值
if self.dir == 'call':
delta_value = self.N_d1
else:
delta_value = self.N_d1-1
return delta_value
def Gamma(self):
# 计算Gamma的值
return self.N_d1_diff / (self.S * self.vol_T)
def Vega(self):
# 计算Vega的值
return self.S * self.N_d1_diff * np.sqrt(self.T)
def Theta(self):
# 计算Theta的值
one_part = -self.S * self.N_d1_diff * self.vol / (2 * np.sqrt(self.T))
other_part = self.r * self.K * np.exp(-self.r * self.T) * self.N_d2
if self.dir == 'call':
theta_value = one_part - other_part
else:
theta_value = one_part + other_part
return theta_value
def Rho(self):
# 计算Rho的值
# 计算Rho的值
part = self.K * self.T * np.exp(-self.r * self.T)
if self.dir == 'call':
rho_value = part * self.N_d2
else:
rho_value = -part * (1 - self.N_d2)
return rho_value
对应调试的结果为:
3.趋势图
作图的源代码为(新建的py,调用GREEK):
from option.greek import GREEK
import numpy as np
import pandas as pd
def get_greek_value(S_list, direction):
data_list = []
for value in S_list:
S = round(value, 2)
price = GREEK(S=S, direction=direction).Price()
delta = GREEK(S=S, direction=direction).Delta()
gamma = GREEK(S=S, direction=direction).Gamma()
vega = GREEK(S=S, direction=direction).Vega()
theta = GREEK(S=S, direction=direction).Theta()
rho = GREEK(S=S, direction=direction).Rho()
data_dict = {'S': S, 'price': price, 'delta': delta, 'gamma': gamma,
'vega': vega, 'theta': theta, 'rho': rho}
data_list.append(data_dict)
return data_list
if __name__ == '__main__':
s_list = np.linspace(1, 20, 2000)
direction = 'call'
data = get_greek_value(s_list, direction)
data_df = pd.DataFrame(i for i in data)
name_list = [['price', 'delta'], ['gamma', 'vega'], ['theta', 'rho']] # 分组
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(nrows=3, ncols=2, figsize=(8, 12))
# 循环作图
for row in range(3):
for col in range(2):
name = name_list[row][col]
ax[row, col].plot(data_df['S'], data_df[name])
ax[row, col].legend([direction + '-' + name])
plt.show()
3.1 看涨期权
将direction设置为call,对应得到的趋势图为:
3.2看跌期权
将direction设置为put,对应得到的趋势图为:
关于希腊字母,还可以探讨买入和卖出方向,实值平值虚值以及参数(波动率,到期期限,利率等)对应的变化。本文只是简单复现代码,提供基础性代码,不做深入的分析。后续如果时间允许的情况下,会做进一步的分享。
本期分享结束,有何问题欢迎交流。