第二十三课:波动率曲面在资产配置中的应用
各位同学,今天我们来聊一个实战性很强的话题——怎么把波动率曲面用到资产配置里。
说实话,很多人做资产配置,用的都是历史波动率。比如算个过去60天的年化波动,然后配权重。但我在项目中踩过不少坑,发现历史数据有个致命问题:它只能告诉你过去发生了什么,没法告诉你市场现在怎么想。
波动率曲面就不一样了。它包含了市场对未来波动的一致预期。你想想看,期权交易员每天真金白银在市场上博弈,他们报出的隐含波动率,其实就是对未来不确定性的定价。这个信息,不用白不用。
波动率目标策略
先讲最简单的应用——波动率目标策略。
这个策略的核心思想很朴素:我想让组合的波动率保持在一个固定水平,比如年化15%。市场波动大的时候,我降低仓位;市场波动小的时候,我提高仓位。
传统做法是用历史波动率来调仓。但问题来了——历史波动率是滞后的。市场已经暴跌了,你才反应过来要减仓,黄花菜都凉了。
我个人习惯用波动率曲面来替代历史波动率。具体怎么做?
- 从曲面中提取不同期限的平价隐含波动率
- 用这些隐含波动率构建一个前瞻性的波动率估计
- 根据这个估计动态调整仓位
举个例子。假设你的目标波动率是15%。今天从曲面上看到,1个月平价隐含波动率是25%。那你的仓位就应该降到15%/25% = 60%。
核心公式:
目标仓位 = 目标波动率 / 预期波动率
预期波动率 = f(隐含波动率曲面)
我在做CTA策略的时候就遇到过这种情况。2020年3月,市场波动率突然飙升,VIX冲到80多。如果用历史波动率,至少要等一周才能反应过来。但用隐含波动率,当天就能做出减仓决策。那一波操作,帮我少亏了至少5个点。
小技巧:不要只用单一期限的隐含波动率。我建议用曲面上的多个期限做加权平均,比如1个月、3个月、6个月各取一部分。这样能平滑掉短期噪音。
风险平价策略
风险平价策略,说白了就是让每个资产对组合的风险贡献相等。
传统做法是用历史波动率和相关性矩阵。但这里有个坑——相关性在极端行情下会突变。平时不相关的资产,危机一来全往一个方向跑。
波动率曲面能帮我们做什么?它可以提供更实时的波动率估计,还能通过偏斜度来预判尾部风险。
具体实现上,我一般分三步走:
- 从曲面上提取每个资产的隐含波动率
- 用曲面上的偏斜度来调整风险预算
- 动态再平衡
举个例子。假设你有两个资产:股票和债券。股票曲面的偏斜度很大,说明市场在定价左尾风险(暴跌风险)。这时候我会给股票分配更少的风险预算。
调整后的风险预算公式:
风险预算_i = 1 / (隐含波动率_i * (1 + 偏斜度调整因子_i))
偏斜度调整因子怎么算?我一般用25-delta看跌期权的隐含波动率减去平价波动率。差值越大,说明市场越担心暴跌,我就越要降低这个资产的权重。
注意:偏斜度调整因子不能直接用,需要做归一化处理。我曾经吃过这个亏,直接用原始差值,结果某个资产的权重被压到几乎为零。后来加了个sigmoid函数做映射,效果就好多了。
波动率曲面驱动的配置框架
前面两个策略都是单点应用。现在我们来搭建一个完整的配置框架。
这个框架的核心思想是:把波动率曲面当成一个多维度的信息源,用它来驱动整个配置决策。
我画了一张流程图,方便大家理解:
这个框架的核心逻辑是:从曲面中提取多维特征,然后分别映射到不同的配置决策上。
具体实现时,我建议用Python写一个类来封装:
class VolSurfaceDrivenAllocator:
def __init__(self, target_vol=0.15):
self.target_vol = target_vol
self.surface = None
def update_surface(self, surface_data):
"""更新波动率曲面数据"""
self.surface = surface_data
def extract_features(self):
"""从曲面提取特征"""
features = {}
# 提取平价波动率
features['atm_vol'] = self.surface.get_atm_vol()
# 提取偏斜度
features['skew'] = self.surface.get_skew()
# 提取期限结构斜率
features['term_slope'] = self.surface.get_term_slope()
return features
def compute_vol_target_weights(self, features):
"""波动率目标策略权重"""
expected_vol = features['atm_vol'] * (1 + 0.1 * features['skew'])
weight = self.target_vol / expected_vol
return min(weight, 1.0) # 限制最大杠杆
def compute_risk_parity_weights(self, features_list):
"""风险平价策略权重"""
# 用隐含波动率和偏斜度调整风险预算
total_risk = sum(1/(v['atm_vol'] * (1 + v['skew']))
for v in features_list)
weights = [(1/(v['atm_vol'] * (1 + v['skew'])))/total_risk
for v in features_list]
return weights
这个框架的好处是模块化。你可以单独替换某个模块,比如把波动率目标策略换成别的策略,不影响其他部分。
实战建议:刚开始做的时候,别想着一步到位。我建议先跑回测,看看曲面驱动的配置和传统配置在历史数据上的表现差异。重点关注极端行情下的表现,比如2008年、2020年3月这些时期。
最后说一个我踩过的坑。曲面数据更新频率很高,但资产配置的调仓频率不能太高。你想想看,如果每天调仓,交易成本会吃掉所有收益。我一般建议用周度或月度的频率来调仓,曲面数据取这段时间的平均值。
好了,这节课的内容就到这里。波动率曲面在资产配置中的应用,说白了就是把市场预期融入到配置决策中。这个思路,我个人觉得是未来资产配置的发展方向。
核心要点回顾:
- 波动率目标策略:用隐含波动率替代历史波动率,实现前瞻性仓位管理
- 风险平价策略:用偏斜度调整风险预算,应对尾部风险
- 完整框架:从曲面提取多维特征,驱动配置决策
- 实战注意:调仓频率要合理,避免过度交易