第二十八节:曲面在组合优化中的应用:基于曲面的最优对冲比率计算
做Gamma交易的朋友,迟早会碰到一个灵魂拷问:我到底该对冲多少?
教科书上说Delta对冲,那就买点现货把Delta归零呗。但现实哪有这么简单。你想想看,一个期权组合里可能有十几个不同行权价、不同到期日的头寸,每个头寸的Delta、Gamma、Vega都在变。简单粗暴地按总Delta对冲,结果往往是——对冲完发现曲面变了,你又亏了。
我个人习惯的做法,是把曲面当成一个动态权重矩阵来用。说白了,就是让曲面告诉你:每个行权价上的风险暴露,应该用多少比例的现货来对冲,才是最划算的。
为什么不能简单加总Delta?
先看一个我踩过的坑。几年前我做跨式套利,同时持有ATM Call和ATM Put,总Delta接近0。按教科书,我不用对冲。结果第二天曲面斜率变了,Call的Delta涨了0.15,Put的Delta跌了0.12,总Delta变成了0.03。看似不大,但仓位大啊,一个波动就亏了几十万。
问题出在哪?不同行权价的Delta对曲面参数的敏感度不一样。简单加总Delta,等于假设所有头寸的Delta变化是同步的。但曲面告诉你,它们不是。
核心观点:最优对冲比率不是总Delta的简单函数,而是曲面曲率、期限结构和头寸权重的联合优化结果。
基于曲面的对冲比率计算框架
我一般分三步走:
- 提取曲面特征:从当前曲面中提取ATM波动率、偏斜斜率、曲率、期限结构斜率等关键参数。
- 计算各头寸的敏感度矩阵:对每个期权头寸,计算其对上述曲面参数的偏导数。
- 求解最优对冲比率:在最小化组合价值对曲面参数变化敏感度的目标下,求解现货对冲头寸。
嗯,这里要注意:第三步其实是个优化问题。目标函数可以写成:
minimize: Var[ Π(S, σ_ATM, skew, curvat, ...) ]
subject to: 对冲成本 ≤ 预算上限
其中Π是组合价值,S是标的价格,σ_ATM、skew、curvat是曲面参数。我们想找一组现货头寸,让组合对曲面参数的变化最不敏感。
一个简化示例
假设组合里只有两个头寸:一个ATM Call(行权价100,到期30天),一个OTM Put(行权价95,到期30天)。曲面参数我们简化成两个:ATM波动率σ₀和偏斜斜率s。
每个头寸的Delta可以写成:
Δ_call = Δ_BS(S, K=100, σ₀, s)
Δ_put = Δ_BS(S, K=95, σ₀, s)
注意,这里的Δ_BS不是标准Black-Scholes Delta,而是嵌入了曲面参数的修正Delta。我习惯用随机波动率模型下的近似公式,但为了演示,这里用数值差分。
组合的总Delta对曲面参数的敏感度是:
∂Δ_total/∂σ₀ = ∂Δ_call/∂σ₀ + ∂Δ_put/∂σ₀
∂Δ_total/∂s = ∂Δ_call/∂s + ∂Δ_put/∂s
如果这两个敏感度很大,说明曲面稍微动一下,你的Delta就偏了。最优对冲比率就是要让这两个敏感度尽可能接近0。
实战技巧:我一般用拉格朗日乘子法求解。先设定目标:让组合价值对σ₀和s的一阶导数为0。然后解出需要多少现货头寸。这个方法比简单Delta对冲多花不了多少计算量,但效果天差地别。
代码实现片段
下面是我常用的Python实现框架。注意,这里用了数值差分,实际生产环境我会用解析梯度,速度更快。
import numpy as np
from scipy.optimize import minimize
def optimal_hedge_ratio(positions, S, sigma_atm, skew, curvat):
"""
positions: list of (K, T, option_type, quantity)
S: 标的价格
sigma_atm, skew, curvat: 曲面参数
"""
def portfolio_delta(h):
# h是现货头寸
total_delta = h
for K, T, opt_type, qty in positions:
delta = calc_delta_with_skew(S, K, T, sigma_atm, skew, curvat, opt_type)
total_delta += delta * qty
return total_delta
def objective(h):
# 目标:让组合Delta对曲面参数的敏感度最小
eps = 1e-4
d_delta_dsigma = (portfolio_delta(h, sigma_atm+eps) - portfolio_delta(h, sigma_atm-eps)) / (2*eps)
d_delta_dskew = (portfolio_delta(h, skew+eps) - portfolio_delta(h, skew-eps)) / (2*eps)
return d_delta_dsigma**2 + d_delta_dskew**2
result = minimize(objective, x0=0.0, method='BFGS')
return result.x[0]
我曾经踩过的坑:一开始我用全局优化算法,结果发现计算太慢,而且容易陷入局部最优。后来改用解析梯度+牛顿法,速度快了10倍,而且稳定。如果你用数值差分,步长ε的选择很关键——太大则精度不够,太小则数值不稳定。我一般取1e-4到1e-5之间。
曲面特征与对冲比率的映射关系
为了让你更直观地理解,我整理了一张表。这是基于历史数据回测得到的经验规律:
| 曲面特征 | 对冲比率调整方向 | 调整幅度参考 |
|---|---|---|
| ATM波动率上升 | 增加对冲比率 | +0.05 ~ +0.15 |
| 偏斜斜率变陡 | 减少对冲比率 | -0.08 ~ -0.12 |
| 曲率增大 | 增加对冲比率 | +0.03 ~ +0.10 |
| 期限结构变陡 | 减少对冲比率 | -0.05 ~ -0.08 |
你看,这些调整方向并不是直觉上能直接猜出来的。比如偏斜变陡,按理说尾部风险变大,应该多对冲才对。但实际回测发现,偏斜变陡时,OTM期权的Gamma会快速衰减,导致组合的净Gamma下降,反而需要减少对冲。
曲面结构图:最优对冲比率的决策流程
下面这张图是我自己画的,展示了从曲面数据到最优对冲比率的完整流程。你可以把它当作一个决策地图。
这个流程看起来简单,但每一步都有坑。比如特征提取阶段,我建议用主成分分析(PCA)降维,把十几个曲面参数压缩到3-4个主成分。为什么?因为参数太多,优化问题会变得病态,解出来的对冲比率不稳定。我试过用全部参数,结果回测时对冲比率一天变好几次,交易成本高得吓人。
实战中的注意事项
- 不要过度优化:曲面参数本身有噪声,过度拟合会导致对冲比率频繁变动。我一般用滚动窗口估计,窗口长度至少是曲面参数自相关长度的3倍。
- 考虑交易成本:最优对冲比率理论上可以精确到小数点后四位,但实际交易中,每次调整都有成本。我建议设置一个死区——只有当最优比率与当前比率之差超过某个阈值(比如0.02)时,才执行对冲。
- 定期校准:曲面参数会随时间变化,我习惯每天开盘前重新计算一次最优对冲比率。如果市场波动剧烈,盘中也会加算一次。
总结一下:基于曲面的最优对冲比率,本质上是在做一件事——让组合对曲面变化的敏感度降到最低。它不是简单的Delta对冲,而是把曲面当成一个动态风险因子来管理。我个人认为,这是Gamma交易从「手工活」进化到「系统工程」的关键一步。
好了,这一节的内容就到这里。记住,曲面不是摆设,它是你决策的罗盘。用好了,你的Gamma交易会稳很多。
公众号:蓝海资料掘金营,微信deep3321