delta动态对冲的python代码实现(1)

     最近在一家券商的场外衍生品部门实习,刚做的一个课题是关于delta动态对冲为香草期权定价,参考了John Hull的《期权、期货及其他衍生产品》,发现里面有关于delta对冲的内容,现在先用python来将书上的案例进行还原。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAenIgcnJy,size_20,color_FFFFFF,t_70,g_se,x_16

 

为了对冲卖出的看涨期权带来的风险,需要买入一定的股票进行对冲,买入股票的数量即为该看涨期权的delta值乘上卖出的期权数,在该案例中delta为0.522

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAenIgcnJy,size_20,color_FFFFFF,t_70,g_se,x_16

 

下面是两种对冲的情形,分别对应期权到期日能否行权的两种情况。

第一种情况:到期日股价高于执行价,可以行权,此时的期权复制成本为263300美元。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAenIgcnJy,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAenIgcnJy,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAenIgcnJy,size_20,color_FFFFFF,t_70,g_se,x_16

 第二种情况:到期日股价低于执行价,不能行权,此时的期权复制成本为256600美元。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAenIgcnJy,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAenIgcnJy,size_20,color_FFFFFF,t_70,g_se,x_16

下面是python代码实现

先写一个bsm.py,定义在BSM模型下看涨期权的价值和delta 

from math import log, sqrt, exp
from scipy import stats
import numpy as np

class BSMOptionValuation:
    def __init__(self, S0, K, T, r, sigma,  div=0.0):
        self.S0 = float(S0)
        self.K = float(K)
        self.T = float(T)
        self.r = float(r)
        self.sigma = float(sigma)
        self.div_yield = float(div)
        self.d1 = ((log(self.S0 / self.K) + (self.r - self.div + 0.5 * self.sigma ** 2) * self.T) / (self.sigma * sqrt(self.T)))
        self.d2 = self.d1 - self.sigma * sqrt(self.T)

    def call_value(self):
        call_value = (self.S0 * exp(-self.div * self.T) * stats.norm.cdf(self.d1, 0.0, 1.0) - self.K * exp(-self.r * self.T) * stats.norm.cdf(self.d2, 0.0, 1.0))
        return call_value

    def delta(self):
        delta_call = exp(- self.div * self.T) * stats.norm.cdf(self.d1, 0.0, 1.0)
        delta_put = -exp(- self.div * self.T) * stats.norm.cdf(-self.d1, 0.0, 1.0)
        return delta_call, delta_put

然后进行案例复现

这里我用的是第一种股票走势进行模拟,大家可以测试用第二种来模拟,结果和书上的一样

from math import log, sqrt, exp
import numpy as np
import scipy.stats as si
from scipy.stats import norm
from bsm import *
import pandas as pd

if __name__=='__main__':

    #期权的关键参数
    N = 100000                          # 期权份数
    S1 = [49,48.12,47.37,50.25,51.75,53.12,53,51.87,51.38,53,49.88,48.5,49.88,50.37,52.13,51.88,52.87,54.87,54.62,55.87,57.25]        # 股票价格第一种走势
    S2 = [49,49.75,52,50,48.38,48.25,48.75,49.63,48.25,48.25,51.12,51.5,49.88,49.88,48.75,47.5,48,46.25,48.13,46.63,48.12]           # 股票价格第二张走势
    K = 50                              # 行权价
    r = 0.05                            # 无风险利率
    sigma = 0.2                         # 波动率
    T = 0.3846                          # 期限
    simulation = 20                     # 路径步数
    dt =T / simulation                  # 单位步数

    # 初始结构设定
    expire_time = np.append((np.ones((simulation , 1)) * dt).cumsum()[::-1],0)         # 到期期限的时间序列
    cash = np.zeros(simulation + 1)                                                    # 现金账户
    div = np.zeros(simulation)                                                         # 利息账户
    delta = np.zeros(simulation)                                                       # delta

    #开始对冲
    for step in range(simulation+1):
        # 期初开仓
        if step == 0:
            delta[step] = BSMOptionValuation(S1[step], K, expire_time[step], r, sigma).delta()[0]           # 计算对冲路径上delta
            cash[step] = delta[step] * N * S1[0]                                                            # 期初现金账户
            div[step] = cash[step] * r * dt                                                                # 期初利息账户
        # 中途对冲
        if step in range(1,simulation):
            delta[step] = BSMOptionValuation(S1[step], K, expire_time[step], r, sigma).delta()[0]
            cash[step] = cash[step-1] + div[step-1] + (delta[step] - delta[step - 1]) * S1[step] * N       # 每日结算损益
            div[step] = cash[step] * r * dt
        # 期末结算
        if step == simulation:
            if S1[step] > K:
                cash[step] = cash[step-1] + div[step-1] - N * K
            elif S1[step] <=K :
                cash[step] = cash[step-1] + div[step-1] - delta[step - 1] * S2[step] * N

    print(cash[-1])            # 返回期权复制成本
C:\ProgramData\Anaconda3\envs\untitled\python.exe C:/Users/Administrator/PycharmProjects/pythonProject/deltahedge_clone.py
263061.29677824676

结果非常接近书上的263300美元,误差在于书上的计算都只保留了小数点后一位,我这里没有这样操作,另一种股票走势的结果如下,和书上的256600美元非常接近:

C:\ProgramData\Anaconda3\envs\untitled\python.exe C:/Users/Administrator/PycharmProjects/pythonProject/deltahedge_clone.py
256520.06138881645

后面我了解到,业界往往会用cash delta而非delta来进行动态对冲,同时股票路径可以用蒙特卡洛来进行模拟,下一篇我将展示如何用python来实现基于蒙特卡洛模拟的cash delta动态对冲。

 

 

 

 

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我会尽力回答你的问题。在这里,我将编写一段Python代码实现雪球期权动态对冲。我们将使用蒙特卡罗模拟计算雪球期权价格,并使用Black-Scholes模型计算Delta值,然后根据Delta值进行动态对冲。 ```python import numpy as np import pandas as pd from scipy.stats import norm # 定义函数进行雪球期权定价 def snowball_option_price(S0, K, r, sigma, T, M, N): dt = T / M S = np.zeros((M+1, N+1)) S[0][0] = S0 for i in range(1, M+1): z = np.random.standard_normal(N+1) S[i] = S[i-1] * np.exp((r-0.5*sigma**2)*dt + sigma*np.sqrt(dt)*z) S_max = np.amax(S, axis=0) payoff = np.maximum(S_max - K, 0) option_price = np.exp(-r*T) * np.mean(payoff) return option_price # 定义函数计算delta def delta(S0, K, r, sigma, T): d1 = (np.log(S0/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T)) delta = norm.cdf(d1) return delta # 定义函数进行动态对冲 def dynamic_hedge(S0, K, r, sigma, T, M, N): option_price = snowball_option_price(S0, K, r, sigma, T, M, N) delta_t = delta(S0, K, r, sigma, T) S_t = S0 dS = [0] * (M+1) dS[0] = S0 - K for i in range(1, M+1): z = np.random.standard_normal() S_t = S_t * np.exp((r-0.5*sigma**2)*(T/M) + sigma*np.sqrt(T/M)*z) dS[i] = S_t - K - delta_t * (S_t - S_t*np.exp(r*(T-i/M))) portfolio = pd.DataFrame({'Delta': delta_t, 'Stock Price': S_t, 'Option Price': option_price, 'dS': dS}) return portfolio # 测试代码 S0 = 100 K = 110 r = 0.05 sigma = 0.2 T = 1 M = 252 N = 10000 portfolio = dynamic_hedge(S0, K, r, sigma, T, M, N) print(portfolio) ``` 在上面的代码中,我们通过蒙特卡罗模拟计算了雪球期权的价格,并使用Black-Scholes模型计算了Delta值,然后根据Delta值进行动态对冲。其中,S0表示当前资产价格,K表示期权行权价格,r表示无风险利率,sigma表示资产价格波动率,T表示期权持有时间,M表示动态对冲的步数,N表示模拟路径的数量。 对于每个步数,我们首先计算出当前的Delta值和资产价格,然后根据Black-Scholes模型计算出期权价格,并计算出当前资产价格变化引起的Delta变化,从而计算出需要买卖的股票数量。最后,我们将Delta值、资产价格、期权价格和股票数量保存到一个DataFrame中作为结果返回。 需要注意的是,动态对冲是一种风险管理策略,可以帮助投资者减少持有期权时面临的风险。但是,动态对冲并不能完全消除风险,因为Delta值会随着时间和价格的变化而变化,从而影响到对冲策略的有效性。因此,在实际应用中,我们需要根据市场情况和风险承受能力来确定动态对冲的频率和量级。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zr rrr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值