等风险贡献组合(ERC):让每个资产对总风险的贡献完全相等
马科维茨最大夏普对协方差估计极度敏感——样本噪声一来,权重就爆成几十倍杠杆、还冒出一堆空头。等风险贡献(ERC / Risk Parity)干脆放弃预测收益,只要求「每个资产对组合总波动率的边际贡献完全相等」。本文用固定点迭代 w∝1/(Σw) 在 6 资产合成上求解:ERC 收敛 263 步、风险贡献精确 16.67%×6(方差 9.7e−33,而等权 9.5e−07),权重向低波动资产倾斜(最低波动资产拿 41% 权重);并在高/低相关市场下验证风险贡献依旧均匀。附完整 Python 与六类真实陷阱(中阶)。
如果你跑过马科维茨均值-方差优化,一定被它的「脾气」折磨过:输入一份带噪声的协方差矩阵,解出来的权重能夸张到——某资产 200% 多头、另一资产 −150% 空头,总敞口翻好几倍。
问题不在数学,在于均值-方差对输入太敏感。协方差只要估偏一点点,最优解就甩到边界上。于是 2000 年代后,一类不预测收益、只管风险分配的流派兴起:风险平价(Risk Parity)、风险预算(Risk Budgeting)、等风险贡献(Equal Risk Contribution, ERC)。
本文聚焦 ERC:让组合里每个资产对总风险的(边际)贡献完全相等。它不赌哪个资产涨得多,只保证「谁也别替组合扛不成比例的风险」。
一、风险贡献:一个被忽视的分解#
设组合权重 ,协方差 ,组合方差 。对每个资产 ,定义它的风险贡献(Risk Contribution, RC):
是组合方差对 的偏导,即「资产 i 的边际风险贡献」;乘以权重 得到「成分风险贡献」。注意:等权 ≠ 等风险贡献。如果高波动资产和低波动资产权重一样,高波动那只会替组合扛绝大部分风险。
ERC 的目标就是:
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 条件 有一个漂亮的固定点形式:若
则 对所有 恒等成立。所以迭代更新 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_iterpython三、合成设定:6 资产,波动率刻意拉开#
为了看清 ERC 的行为,构造 6 个资产,年化波动率从 5% 到 22% 拉开,相关性矩阵让股票间高相关、与债券低/负相关:
rng = np.random.default_rng(20260717)
n = 6
vols = np.array([0.22, 0.18, 0.15, 0.10, 0.08, 0.05]) # A1~A6 波动率递减
C = np.array([ # 股票(A1~A3)高相关, 与债券(A4~A6)低/负相关
[1.00, 0.70, 0.55, 0.20, 0.10, -0.10],
[0.70, 1.00, 0.60, 0.25, 0.12, -0.05],
[0.55, 0.60, 1.00, 0.30, 0.15, 0.00],
[0.20, 0.25, 0.30, 1.00, 0.50, 0.20],
[0.10, 0.12, 0.15, 0.50, 1.00, 0.35],
[-0.10,-0.05, 0.00, 0.20, 0.35, 1.00],
])
Cov = (vols[:, None] * vols[None, :]) * C
w_equal = np.repeat(1/n, n)
w_ivol = (1.0 / vols); w_ivol /= w_ivol.sum() # 逆波动加权
try:
w_mv = np.linalg.solve(Cov, np.ones(n)); w_mv /= w_mv.sum() # 最小方差
except Exception:
w_mv = w_equal.copy()
w_erc, iters = erc_fixedpoint(Cov)python跑出来:
- 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-07、ERC9.69e-33
注意那个反直觉的点:波动率最低的 A6(5%)拿到了 41% 的最高权重。这正说明 ERC ≠ 等权——为了让低波动资产对总风险的贡献和高波动资产一样,你必须给它更多的仓位。ERC 天然地、温和地向低波动资产倾斜(和「低波动异象」异曲同工)。

四、四类权重方案同台#
把等权、逆波动、最小方差、ERC 的权重摆在一起对比:
wmat = np.vstack([w_equal, w_ivol, w_mv, w_erc]) * 100
labels = ["等权", "逆波动", "最小方差", "ERC"]python
- 等权:简单,但高波动的 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
从等权初始的 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 不预测收益:它只管风险分配,放弃了收益预测。在长牛里,ERC 会跑输满仓高收益资产(比如纯股票)。它是风险配置工具,不是印钞机,别指望它替代 alpha。
- 波动率估计仍是输入:虽然 ERC 比最大夏普稳,但它依赖协方差 。用简单历史协方差仍会被噪声干扰——实战要上**协方差收缩(shrinkage)**或指数加权,并对权重设边界。
- ERC ≠ 收益等权:本文最低波动资产拿了 41% 权重,看着「集中」,其实是为了风险贡献均等。别误以为 ERC 是分散化万能药——它是风险分散不是资产数量分散。
- 杠杆与约束:纯 ERC 解可能要求做空(当相关性结构扭曲时)。加「不允许做空 / 权重边界」约束后,ERC 退化成约束优化,风险贡献不再严格相等,需要用带约束的求解器(如二次规划 + RC 惩罚)。
- 再平衡摩擦:ERC 需要定期再平衡把权重拉回目标。高波动资产权重随市场剧烈变动,频繁再平衡产生交易成本。实战要把再平衡阈值(如偏离 5% 才调)写进规则。
- 协方差非平稳:本文用固定协方差演示。实盘相关性在危机时飙升(所有股票一起跌),此时 ERC 的「分散」保护会瞬间失效——必须叠加波动率目标化(vol targeting)和危机对冲。
八、小结:不赌收益,只管风险#
把 ERC 放在「投资组合优化光谱」里看:
- 最大夏普:赌收益 + 赌协方差 → 对输入最敏感、最易过拟合
- 最小方差:只赌协方差 → 仍极端、依赖估计精度
- 等权:不赌任何东西 → 稳健但风险贡献不均
- ERC / 风险平价:只赌「风险贡献应相等」这个相对稳健的几何性质 → 有界、不极端、对相关性变化鲁棒
所谓「等风险贡献」,本质是把组合工程从「预测最难的部分(收益)」转移到「相对可控的部分(风险分配)」。在收益不可预测的世界里,先保证「没人替我扛不成比例的风险」,往往比精确押注谁涨更可持续。
代码与图表均由自包含 Python(numpy/matplotlib)真实计算,随机种子固定为 20260717,可完整复现。所有统计数字(ERC 权重、风险贡献 16.67%×6、收敛步数 263、风险贡献方差对比、不同相关性结构下的均匀性)均来自文中脚本输出。协方差固定为合成设定,实战须用 shrinkage / 指数加权重估并叠加再平衡与 vol targeting。