第十二章:风险预算与风险平价在期权组合中的实现

聊到期权组合,很多人第一反应就是「怎么赚钱」。但我在实战中摔过几次跟头之后,才真正明白——活下来比赚多少更重要。风险预算和风险平价,说白了就是帮你「活着」的两套工具。

我个人习惯把风险预算看作「分蛋糕」,把风险平价看作「分风险」。两者目标不同,但底层逻辑相通。今天我们就来拆解一下,怎么在期权组合里落地这两套方法。

12.1 风险预算:先定总风险,再切分

风险预算的核心思路很简单:你愿意亏多少,然后把这个额度分配到各个头寸上

举个例子。假设你管理一个期权组合,总风险预算定在 5% 的 VaR(95% 置信度,1 天)。那么你手头的几个策略——比如做多波动率、卖跨式、日历价差——各自能分到多少风险?

我一般这么干:

  1. 定总风险上限:比如组合最大回撤不超过 5%。
  2. 按策略贡献度分配:波动率大的策略少分点,稳健的策略多分点。
  3. 动态调整:市场变了,预算也得跟着调。

关键点:风险预算不是一成不变的。我见过有人年初定好预算,年底一看早爆了——因为没考虑波动率变化。

具体到期权组合,风险预算的分配可以基于希腊字母。比如:

  • Delta 预算:控制方向性风险,比如不超过组合净值的 2%。
  • Vega 预算:控制波动率风险,比如不超过 1.5%。
  • Gamma 预算:控制曲率风险,这个容易被忽略,但很重要。

我曾经在 2020 年 3 月吃过亏——当时只盯着 Delta 和 Vega,没给 Gamma 留预算。结果市场一波动,Gamma 直接把我打穿了。嗯,从那以后我再也不敢忽视 Gamma 预算了。

12.2 风险平价:让每个头寸「等风险」

风险平价和风险预算不一样。风险平价追求的是每个头寸对组合总风险的贡献相等。说白了,就是不让任何一个头寸「一家独大」。

你想想看,如果组合里 80% 的风险都来自一个卖跨式策略,那这个组合其实很不健康。一旦波动率飙升,你就得吃大亏。

风险平价的做法是:

  1. 计算每个头寸的边际风险贡献(MRC)。
  2. 调整头寸权重,让每个头寸的风险贡献相等。
  3. 定期再平衡。

我的小技巧:风险平价在期权组合里特别适合做「波动率策略组合」。比如同时持有做多波动率和做空波动率的策略,让它们互相制衡。

这里有个数学表达。假设组合有 n 个资产,每个资产的权重为 w_i,协方差矩阵为 Σ。那么资产 i 的风险贡献 RC_i 为:

RC_i = w_i * (Σ * w)_i / sqrt(w^T * Σ * w)

风险平价的目标就是让所有 RC_i 相等。嗯,听起来简单,但实际求解是个优化问题。我一般用 Python 的 scipy.optimize 来解。

12.3 期权组合中的实现细节

期权组合和股票组合不一样。期权的风险是非线性的,所以风险预算和风险平价不能直接套用传统方法。

我建议这么做:

  • 用希腊字母代替价格:把 Delta、Vega、Gamma 当作「风险因子」,然后在这些因子上做风险预算或风险平价。
  • 考虑相关性:不同期权策略之间可能有相关性。比如做多波动率和卖跨式,在波动率飙升时是负相关的。
  • 动态再平衡:期权的时间价值衰减很快,所以风险贡献会随时间漂移。我一般每周做一次再平衡。

注意:风险平价在极端行情下可能失效。因为相关性会突变,协方差矩阵的估计也会失真。我经历过一次,波动率曲面扭曲后,所有头寸的风险贡献同时飙升——那感觉,就像所有鸡蛋都在一个篮子里,但篮子着火了。

12.4 代码实现:一个简单的风险平价优化器

下面是我常用的一个风险平价优化代码。它基于希腊字母的协方差矩阵,求解最优权重。

import numpy as np
from scipy.optimize import minimize

def risk_parity_weights(cov_matrix):
    n = cov_matrix.shape[0]
    
    def risk_contribution(w, cov):
        portfolio_vol = np.sqrt(w @ cov @ w)
        rc = w * (cov @ w) / portfolio_vol
        return rc
    
    def objective(w):
        rc = risk_contribution(w, cov_matrix)
        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, 
                      x0=np.ones(n)/n, 
                      bounds=bounds, 
                      constraints=constraints,
                      method='SLSQP')
    return result.x

# 示例:三个期权策略的协方差矩阵
cov = np.array([[0.04, 0.01, 0.02],
                [0.01, 0.09, 0.03],
                [0.02, 0.03, 0.16]])

weights = risk_parity_weights(cov)
print("风险平价权重:", weights)

这段代码我用了好几年。注意,协方差矩阵的估计是关键。我建议用 EWMA(指数加权移动平均)来估计,而不是简单历史平均。因为期权市场的波动率聚集效应很明显。

12.5 一张图看懂风险预算 vs 风险平价

下面这张 SVG 图展示了两种方法的区别。左边是风险预算,右边是风险平价。

风险预算 vs 风险平价 风险预算 总风险 = 5% VaR 按策略分配风险额度 Delta: 2%, Vega: 1.5%, Gamma: 1%, 其他: 0.5% 风险平价 每个头寸风险贡献相等 策略A: 25%风险 策略B: 25%风险 策略C: 25%风险 策略D: 25%风险

从图上你能看出来:风险预算像是「切蛋糕」,总风险固定,然后分给各个策略;风险平价像是「分风险」,让每个策略的风险贡献一样大。

12.6 实战中的避坑指南

最后,分享几个我在实战中踩过的坑:

  • 别迷信历史数据:协方差矩阵是基于历史估计的,但未来可能完全不同。我建议加入压力测试场景。
  • 注意交易成本:风险平价需要频繁再平衡,交易成本可能吃掉收益。尤其是期权,买卖价差大。
  • 别忽略尾部风险:风险平价在正态分布假设下很完美,但期权市场有肥尾。我一般会额外加一个尾部风险预算。

我的经验:风险预算和风险平价不是二选一。我现在的做法是:先用风险预算定总风险上限,再用风险平价在子策略内部做分配。两者结合,效果更好。

好了,这一章就到这里。记住,风险管理不是束缚,而是让你在市场波动中活得更久。下次我们聊聊怎么用这些工具做动态对冲——嗯,那又是另一个故事了。


公众号:蓝海资料掘金营,微信deep3321