g

gqzhang

V1

2022/12/06阅读:47主题:默认主题

期权风险的Delta对冲(附Python代码)

上一期我们推导了欧式看涨期权价格的Black-Scholes (BS)公式:

其中, ,以及:

当时间 趋于到期日,即 趋于 的时候,我们可以发现 就是期权的回报函数:

如果我们卖出一个欧式看涨期权,虽然在初始时刻我们可以收到 的期权费,但是在到期日的时候,我们需要付出该期权的回报:

如果未来标的资产价格 飙涨,我们会蒙受巨大损失,因此进行风险对冲是很有必要的。

根据BS公式,我们可以对于卖出期权的风险进行完美的对冲。

首先注意到期权价格是关于时间 和标的资产价格 的一个函数,即:

风险对冲策略可以构造如下:

  • 在初始时刻,我们使用收到的期权费 构造一个包含无风险资产和标的资产的投资组合。
  • 在任意时间 调仓,使得持有的标的资产数量为:
  • 其余资金全部投入无风险资产。

我们接下来说明这个风险对冲投资组合在时间 的价值正好等于我们需要付出的期权回报。

把对冲组合在时间 的价值记为 。那么:

在时间区间 内,对冲组合的价值 的变化由两部分贡献:

  • 由于在时间 ,我们持有的标的资产数量为 ,其价格变化为 ,这会带来 的对冲组合变化。
  • 投入无风险资产的价值为 ,其在 时间内产生的收益为:

因此对冲组合的价值变化为:

对冲组合价值的折现版本具有更为简单的形式,应用伊藤公式到 ,我们有:

代入:

简化可得:

假设:

其中 为标的资产的平均收益率。

因此:

代入

再考虑期权价格的走势。应用伊藤公式:

的公式和 代入可得:

由于折现期权价格 在风险中性测度下为一个鞅,可以推出上式中:

因此:

所以:

注意到

因此:

综上所述,该对冲策略可以完美地保证我们在时间 付出期权持有方要求的回报。

在现实中,我们不可能在连续时间上进行调仓,因此需要对时间进行离散。在离散的时间点上进行调仓,这会带来对冲误差。如果时间步长足够小的话,我们可以预期对冲误差是比较小的。

该对冲策略的代码实现和测试如下:

'''
欧式看涨期权Delta对冲策略Python代码实现
'''


from scipy.stats import norm
import numpy as np

r = 0.01 # 无风险利率
mu = 0.1 # 标的资产的平均增长率
sig = 0.3 # 波动率
S0 = 100 # 初始标的资产价格
T = 1.0 # 期权到期日
K = 100 # 期权执行价格
freq = 252 # 对冲频率
dt = T/freq # 对冲时间步长 
n_paths = 1000 # 测试次数

# 计算期权价格的函数
# 以时间t和当时的标的资产价格S为变量
def BS(t, S):
    d1 = (np.log(S/K) + (r+sig**2/2)*(T-t))/np.sqrt(T-t)/sig
    
    d2 = d1 - sig*np.sqrt(T-t)
    
    return (S*norm.cdf(d1) - K*np.exp(-r*(T-t))*norm.cdf(d2))

# 初始期权费
C0 = BS(0, S0)

# 计算Delta的函数
# 以时间t和当时的标的资产价格S为变量
def Delta(t, S):
    d1 = (np.log(S/K) + (r+sig**2/2)*(T-t))/np.sqrt(T-t)/sig
    
    return norm.cdf(d1)


PnL = np.zeros(n_paths) # 记录每次对冲的收益损失

for n in range(n_paths):
    
    if n%100 == 0
        print('测试:%3d' % n)
    
    # 第n次测试
    X = C0 # 初始价值
    S = S0 # 初始标的资产价格
    dW = np.sqrt(dt)*norm.rvs(size=freq) # 布朗运动增量
    
    for i in range(freq):
        # 第n次测试的第i步
        DT = Delta(i*dt, S) # 持有的标的资产数量
        RF = X - DT*S # 持有的无风险资产
        
        # 经过时间dt之后的资产价格变化
        S = S*np.exp((mu-sig**2/2)*dt + sig*dW[i])
        
        # 经过时间dt之后的对冲组合价值
        X = DT*S + RF*np.exp(r*dt)
        
    # 计算对冲收益/损失
    PnL[n] = X - max(S-K, 0)
    
    # 相对对冲收益/损失
    PnL_rel = PnL/C0

计算完了对冲收益损失,我们就可以对其进行统计。简单起见,我们仅画出直方图。

import matplotlib.pyplot as plt

num_bins = 50

plt.hist(PnL_rel, num_bins, density=True)

plt.show()

每周(freq=52)调仓对冲的结果为:

每日(freq=252)调仓对冲的结果为:

可以看到调仓频率越高,对冲效果越好。

分类:

数学

标签:

数学

作者介绍

g
gqzhang
V1