13. 波动率曲面与风险平价:构建波动率目标组合
风险平价,这个词在资管圈里被说烂了。但真正把它和波动率曲面结合起来做交易的人,其实不多。
我个人习惯把风险平价看作一种「分蛋糕」的思路——不是按资金量分,而是按风险贡献分。你想想看,如果某个资产天生波动大,你给它分配太多资金,整个组合的波动就会被它牵着鼻子走。风险平价要解决的,就是这个痛点。
13.1 从波动率曲面到风险预算
做波动率指数交易的人,手里通常握着不同期限、不同行权价的期权头寸。这些头寸的风险特征,完全可以用波动率曲面来刻画。
举个例子。你持有一张 VIX 期货的看涨期权,同时卖了一张虚值看跌期权。表面上看,这是个价差组合。但曲面告诉你什么?它告诉你,不同行权价上的隐含波动率不一样,不同期限的 skew 也不一样。这些差异,最终会转化为你的风险敞口。
我在项目中遇到过这样的情况:一个看似中性的 Vega 组合,因为曲面形态变化,一夜之间亏了 3%。原因很简单——短期 skew 变陡了,而我的头寸恰好暴露在这个风险因子上。
所以,构建波动率目标组合的第一步,是把曲面上的风险因子拆解清楚。我一般会拆成三个维度:
- 水平因子:整体波动率水平的变化
- 斜率因子:不同期限之间的价差变化
- 曲率因子:凸度变化,也就是 ATM 和 OTM 之间的相对关系
这三个因子,基本能解释曲面 90% 以上的变动。剩下的,交给残差。
13.2 风险平价的核心逻辑
风险平价不是平均分配资金,而是让每个风险因子对组合的贡献相等。
怎么算?很简单。先算出每个因子对组合波动率的边际贡献,然后调整权重,让这些边际贡献相等。
数学上,组合的方差可以写成:
σ²_p = w' Σ w
其中 w 是权重向量,Σ 是协方差矩阵。每个因子的风险贡献是:
RC_i = w_i * (Σ w)_i / σ_p
风险平价的目标,就是让所有 RC_i 相等。
嗯,这里要注意。直接用历史数据算协方差矩阵,容易出问题。为什么?因为波动率曲面的结构会变。你拿过去一年的数据算出来的相关性,可能跟下个月完全不一样。
我曾经吃过这个亏。2018 年 2 月,VIX 突然飙升,曲面结构瞬间扭曲。我那套基于历史协方差的风险平价模型,直接失效。后来我学乖了——用实时曲面数据来更新协方差矩阵,而不是用固定窗口的历史数据。
13.3 构建波动率目标组合的步骤
下面是我在实际交易中用的流程,你可以参考:
- 定义风险因子:从曲面中提取水平、斜率、曲率三个因子
- 计算因子暴露:对每个头寸,计算它对这三个因子的敏感度
- 构建协方差矩阵:用近期曲面数据,估计因子之间的协方差
- 优化权重:用风险平价算法,求解最优权重
- 回测验证:在历史数据上跑一遍,看看稳定性
这里有个关键点——目标波动率。你不能让组合的波动率随意漂移。我一般会设定一个目标波动率区间,比如 10%-15%。如果组合波动率超出这个区间,就触发再平衡。
核心要点:波动率目标组合不是「买了就不动」的策略。它需要动态调整,因为曲面在变,因子暴露也在变。
13.4 代码实现示例
下面是一个简化的 Python 实现,展示如何用风险平价构建波动率目标组合:
import numpy as np
from scipy.optimize import minimize
def risk_parity_weights(cov_matrix):
"""
计算风险平价权重
cov_matrix: 因子协方差矩阵
"""
n = cov_matrix.shape[0]
def risk_contribution(w):
portfolio_var = w @ cov_matrix @ w
sigma_p = np.sqrt(portfolio_var)
rc = w * (cov_matrix @ w) / sigma_p
return rc
def objective(w):
rc = risk_contribution(w)
target = np.mean(rc)
return np.sum((rc - target) ** 2)
constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
bounds = [(0, 1) for _ in range(n)]
result = minimize(objective,
np.ones(n)/n,
bounds=bounds,
constraints=constraints)
return result.x
# 示例:三个因子的协方差矩阵
cov = np.array([
[0.04, 0.01, 0.005],
[0.01, 0.02, 0.003],
[0.005, 0.003, 0.01]
])
weights = risk_parity_weights(cov)
print(f"风险平价权重: {weights}")
这段代码虽然简单,但核心逻辑都在里面了。实际交易中,你还需要加入交易成本、流动性约束、再平衡频率等细节。
13.5 避坑指南
做波动率目标组合,有几个坑我踩过,分享给你:
- 不要过度优化:风险平价模型对输入参数很敏感。稍微改一下协方差矩阵,权重就大变样。我建议用滚动窗口估计,窗口长度至少 60 个交易日。
- 注意尾部风险:波动率曲面在极端行情下会剧烈变形。你的风险平价模型,最好能加入尾部风险约束。比如,限制单个因子的最大风险贡献不超过 40%。
- 再平衡要谨慎:频繁再平衡会吃掉收益。我一般设定一个阈值,比如当某个因子的风险贡献偏离目标超过 20% 时,才触发再平衡。
警告:风险平价不是万能药。它假设因子之间的相关性是稳定的,但现实中相关性会突变。尤其是在 VIX 飙升的时候,所有因子可能同时放大,导致组合波动率失控。
13.6 知识体系结构图
下面这张图,展示了波动率曲面与风险平价结合的核心逻辑:
个人经验:这套框架我用了三年,效果还不错。但说实话,它最大的价值不是帮你赚钱,而是帮你控制回撤。在波动率交易里,活得久比赚得多更重要。
好了,关于波动率曲面与风险平价的内容,就聊到这里。记住一句话:风险平价不是目的,而是手段。最终的目标,是让你的组合在各种市场环境下都能保持稳定。
公众号:蓝海资料掘金营,微信deep3321