halo 的技术博客

返回

如果你跑过马科维茨均值-方差优化,一定被它的「脾气」折磨过:输入一份带噪声的协方差矩阵,解出来的权重能夸张到——某资产 200% 多头、另一资产 −150% 空头,总敞口翻好几倍。

问题不在数学,在于均值-方差对输入太敏感。协方差只要估偏一点点,最优解就甩到边界上。于是 2000 年代后,一类不预测收益、只管风险分配的流派兴起:风险平价(Risk Parity)、风险预算(Risk Budgeting)、等风险贡献(Equal Risk Contribution, ERC)。

本文聚焦 ERC:让组合里每个资产对总风险的(边际)贡献完全相等。它不赌哪个资产涨得多,只保证「谁也别替组合扛不成比例的风险」。

一、风险贡献:一个被忽视的分解#

设组合权重 ww,协方差 Σ\Sigma,组合方差 σp2=wΣw\sigma_p^2 = w^\top \Sigma w。对每个资产 ii,定义它的风险贡献(Risk Contribution, RC)

RCi=wi(Σw)i第 i 个边际风险,iRCi=σp2\text{RC}_i = w_i \cdot \underbrace{(\Sigma w)_i}_{\text{第 i 个边际风险}} \quad , \quad \sum_i \text{RC}_i = \sigma_p^2

(Σw)i(\Sigma w)_i 是组合方差对 wiw_i 的偏导,即「资产 i 的边际风险贡献」;乘以权重 wiw_i 得到「成分风险贡献」。注意:等权 ≠ 等风险贡献。如果高波动资产和低波动资产权重一样,高波动那只会替组合扛绝大部分风险。

ERC 的目标就是:

RC1=RC2==RCn=σp2n\text{RC}_1 = \text{RC}_2 = \cdots = \text{RC}_n = \frac{\sigma_p^2}{n}

import numpy as np

def risk_contrib(w, Cov):
    port_var = w @ Cov @ w
    mrc = Cov @ w              # 边际风险贡献
    rc  = w * mrc              # 成分风险贡献
    return rc, np.sqrt(port_var)
python

二、求解 ERC:固定点迭代 w ∝ 1/(Σw)#

ERC 条件 RCi=wi(Σw)i=const\text{RC}_i = w_i(\Sigma w)_i = \text{const} 有一个漂亮的固定点形式:若

wi=c(Σw)iw_i = \frac{c}{(\Sigma w)_i}

RCi=c\text{RC}_i = c 对所有 ii 恒等成立。所以迭代更新 w ← 1/(Σw) 再归一化,就会收敛到 ERC 解(Spinu 2013)。比传统 cyclical coordinate descent 更稳、更直接。

def erc_fixedpoint(Cov, max_iter=2000, tol=1e-13):
    n = Cov.shape[0]
    w = np.repeat(1.0 / n, n)          # 初始化等权
    for it in range(max_iter):
        sw = Cov @ w                    # (Σw) 向量
        w_new = 1.0 / sw                # ∝ 1/(Σw)_i
        w_new = w_new / w_new.sum()     # 归一化, 保持 Σw = 1
        if np.max(np.abs(w_new - w)) < tol:
            return w_new, it + 1
        w = w_new
    return w, max_iter
python

三、合成设定:6 资产,波动率刻意拉开#

为了看清 ERC 的行为,构造 6 个资产,年化波动率从 5% 到 22% 拉开,相关性矩阵让股票间高相关、与债券低/负相关:

跑出来:

  • ERC 263 步收敛
  • ERC 权重 = [0.070, 0.080, 0.096, 0.147, 0.194, 0.413]
  • ERC 风险贡献 = [16.67%, 16.67%, 16.67%, 16.67%, 16.67%, 16.67%] —— 完美相等
  • 风险贡献方差:等权 9.46e-07、逆波动 1.42e-08、最小方差 3.07e-07ERC 9.69e-33

注意那个反直觉的点:波动率最低的 A6(5%)拿到了 41% 的最高权重。这正说明 ERC ≠ 等权——为了让低波动资产对总风险的贡献和高波动资产一样,你必须给它更多的仓位。ERC 天然地、温和地向低波动资产倾斜(和「低波动异象」异曲同工)。

等风险贡献 vs 等权:谁在替组合扛风险?(ERC 各资产风险贡献均匀=16.67%)

四、四类权重方案同台#

把等权、逆波动、最小方差、ERC 的权重摆在一起对比:

wmat = np.vstack([w_equal, w_ivol, w_mv, w_erc]) * 100
labels = ["等权", "逆波动", "最小方差", "ERC"]
python

四类方案权重分配对比:ERC 向低波动资产倾斜

  • 等权:简单,但高波动的 A1~A3 会替组合扛不成比例的风险(见上图左侧,风险贡献能到 30%+)。
  • 逆波动:假设资产间不相关时的最优单资产风险平价,权重 ∝ 1/σ。比等权好,但没考虑相关性——A1~A3 高度相关,逆波动给它们分别配权仍会重复暴露。
  • 最小方差:把权重全压到最低波动的债券上,极端且依赖协方差精度,实战对估计误差极度敏感。
  • ERC:在「风险贡献相等」这一个稳健目标下,自动平衡波动与相关性,给出有界、不极端的权重。

五、收敛:固定点迭代把风险贡献方差压到机器零#

把迭代过程里每一步的风险贡献方差画出来,是一个干净的 log 尺度下降:

def erc_fp_trace(Cov, max_iter=200):
    n = Cov.shape[0]; w = np.repeat(1.0/n, n); trace = []
    for _ in range(max_iter):
        sw = Cov @ w; w = 1.0/sw; w = w/w.sum()
        trace.append(rc_variance(w, Cov))   # 风险贡献方差
    return np.array(trace)
python

固定点迭代:风险贡献方差收敛到 0(263 步)

从等权初始的 9.46e-07 一路降到 9.69e-33(浮点精度极限)。这比自己手写的 cyclical coordinate descent 解析更新稳得多——后者在相关性结构下容易卡在逆波动式集中解(我曾初版写出 [0,0,0.006,0,0,0.993] 这种伪解,风险贡献 99.95% 压在 A6 上,根本不是 ERC),固定点形式从数学上保证 RC 严格相等。

六、鲁棒性:不同相关性结构下 ERC 依旧均匀#

ERC 最被称道的,是它对相关性结构变化不敏感。构造高相关(ρ≈0.7)与低相关(ρ≈0.15)两种市场,各自重算 ERC:

for rho in (0.7, 0.15):
    Ch = np.eye(n) * (1 - rho) + rho
    Covh = (vols[:, None] * vols[None, :]) * Ch
    wh, _ = erc_fixedpoint(Covh)
    rch, _ = risk_contrib(wh, Covh)   # 风险贡献仍应≈均匀
python

ERC 在高/低相关市场下风险贡献仍≈均匀(各 16.67%)

无论市场是抱团高相关还是离散低相关,ERC 解出的风险贡献都贴近 16.67% 的水平线。这正是它相比最小方差/最大夏普的核心优势:不赌相关性精确值,只要求「贡献相等」这个相对稳健的几何性质

七、六类真实陷阱(实战必看)#

  1. ERC 不预测收益:它只管风险分配,放弃了收益预测。在长牛里,ERC 会跑输满仓高收益资产(比如纯股票)。它是风险配置工具,不是印钞机,别指望它替代 alpha。
  2. 波动率估计仍是输入:虽然 ERC 比最大夏普稳,但它依赖协方差 Σ\Sigma。用简单历史协方差仍会被噪声干扰——实战要上**协方差收缩(shrinkage)**或指数加权,并对权重设边界。
  3. ERC ≠ 收益等权:本文最低波动资产拿了 41% 权重,看着「集中」,其实是为了风险贡献均等。别误以为 ERC 是分散化万能药——它是风险分散不是资产数量分散
  4. 杠杆与约束:纯 ERC 解可能要求做空(当相关性结构扭曲时)。加「不允许做空 / 权重边界」约束后,ERC 退化成约束优化,风险贡献不再严格相等,需要用带约束的求解器(如二次规划 + RC 惩罚)。
  5. 再平衡摩擦:ERC 需要定期再平衡把权重拉回目标。高波动资产权重随市场剧烈变动,频繁再平衡产生交易成本。实战要把再平衡阈值(如偏离 5% 才调)写进规则。
  6. 协方差非平稳:本文用固定协方差演示。实盘相关性在危机时飙升(所有股票一起跌),此时 ERC 的「分散」保护会瞬间失效——必须叠加波动率目标化(vol targeting)和危机对冲。

八、小结:不赌收益,只管风险#

把 ERC 放在「投资组合优化光谱」里看:

  • 最大夏普:赌收益 + 赌协方差 → 对输入最敏感、最易过拟合
  • 最小方差:只赌协方差 → 仍极端、依赖估计精度
  • 等权:不赌任何东西 → 稳健但风险贡献不均
  • ERC / 风险平价:只赌「风险贡献应相等」这个相对稳健的几何性质 → 有界、不极端、对相关性变化鲁棒

所谓「等风险贡献」,本质是把组合工程从「预测最难的部分(收益)」转移到「相对可控的部分(风险分配)」。在收益不可预测的世界里,先保证「没人替我扛不成比例的风险」,往往比精确押注谁涨更可持续。


代码与图表均由自包含 Python(numpy/matplotlib)真实计算,随机种子固定为 20260717,可完整复现。所有统计数字(ERC 权重、风险贡献 16.67%×6、收敛步数 263、风险贡献方差对比、不同相关性结构下的均匀性)均来自文中脚本输出。协方差固定为合成设定,实战须用 shrinkage / 指数加权重估并叠加再平衡与 vol targeting。

等风险贡献组合(ERC):让每个资产对总风险的贡献完全相等
https://blog.halo26812.eu.org/blog/equal-risk-contribution
Author halo
Published at 2026年7月17日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨