期权专题11:期权希腊字母greek

目录

1.公式定义

1.1 delta

1.2 gamma

1.3 vega

1.4 theta

1.5 rho

2.代码复现

3.趋势图

3.1 看涨期权

3.2看跌期权


本文主要分享期权的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,对应得到的趋势图为:

关于希腊字母,还可以探讨买入和卖出方向,实值平值虚值以及参数(波动率,到期期限,利率等)对应的变化。本文只是简单复现代码,提供基础性代码,不做深入的分析。后续如果时间允许的情况下,会做进一步的分享。

本期分享结束,有何问题欢迎交流。

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值