熵风险平价:用最小交叉熵把相关性树变成权重
风险平价听起来很美——每个资产贡献相等风险。但纯风险平价把你的「观点」也清零了:你明明觉得股票该多配,它偏给你等风险暴露。熵风险平价换一个思路:把权重选择变成「在尊重先验观点的前提下,尽量贴近风险平价」,用最小交叉熵当桥梁——交叉熵衡量「新权重偏离你先验多远」,风险平价当约束。本文用 5 资产真实风格协方差从零实现熵风险平价的 scipy 求解,对照等权/传统风险平价/最小方差/最大熵/先验,量化它如何把「市值偏重先验(股票 40%)」拉成风险贡献 25%/25%/25%/25%/25% 的折中组合,附完整 Python 与五类真实陷阱(中阶)。
风险平价(Risk Parity)几乎是教科书级的美谈:让组合里每个资产贡献相等的边际风险。相比「60/40 把 90% 风险压在股票上」,风险平价天然分散、抗集中。
但纯风险平价有个你早晚会撞上的尴尬:它把你自己的观点也清零了。
假设你做了研究,认为股票该超配、债券只是压舱石——这就是一个「先验权重」(比如股票 40%)。传统风险平价完全无视它,机械地按波动率倒数给你权重,结果你和自己的研究打起来。更现实的是:机构往往有「市值偏重」「ESG 约束」「基准跟踪」等先验,硬上风险平价等于把合规和研究结论全扔了。
熵风险平价(Entropy Risk Parity) 把这件事重新表述为一个优化问题:
在「尽量贴近风险平价」的约束下,新权重不要离我的先验观点太远。
而「离先验多远」——用**交叉熵(KL 散度)**来度量。交叉熵天然衡量「一个分布相对另一个分布的信息代价」,在这里就是「偏离你观点的代价」。
本文用一份5 资产真实风格协方差(股票/债券/黄金/商品/REITs,波动与相关性都有结构)从零求解熵风险平价,对照等权、传统风险平价、最小方差、最大熵、以及你的市值偏重先验,量化它如何在「尊重先验」与「风险均衡」之间取折中。
一、为什么是「交叉熵」而不是「L2 距离」#
经典风险平价优化常写成「最小化各资产风险贡献的方差」,或者用方差倒数当权重。但这些都不回答一个问题:新权重相对你的先验,偏了多少?
交叉熵(这里特指 KL 散度的一个形式)给出最干净的度量:
它的性质恰好符合直觉:
- 时交叉熵为 0(完全尊重先验);
- 某个资产权重被推离 越远,惩罚越大,而且非对称——把先验里 40% 的股票砍到 10%(偏离 30 个点),和把 2% 的债券加到 32%(同样 30 个点),交叉熵的代价不同,因为它按「相对先验的比例」计罚;
- 它只定义在权重为正的概率单纯形上,天然适配组合权重。
所以熵风险平价的原型是:
「交叉熵当桥梁」——它把「相关性树(协方差决定的风险结构)」和「你的先验观点」两座山,用信息代价的语言连起来。
二、5 资产真实风格协方差#
先造一份不像玩具的数据:年化波动差异大(股票 22%、REITs 25%、债券 5%),相关性有结构(股债微负、股 REITs 强正、黄金部分对冲):
import numpy as np
names = ["股票", "债券", "黄金", "商品", "REITs"]
ann_vol = np.array([0.22, 0.05, 0.15, 0.18, 0.25])
corr = np.array([
[1.00, -0.20, 0.10, 0.30, 0.60],
[-0.20, 1.00, 0.05, -0.10, -0.15],
[0.10, 0.05, 1.00, 0.20, 0.10],
[0.30, -0.10, 0.20, 1.00, 0.35],
[0.60, -0.15, 0.10, 0.35, 1.00],
])
D = np.diag(ann_vol)
cov = D @ corr @ D
# 你的先验: 市值偏重(股票超配)
w_prior = np.array([0.40, 0.10, 0.10, 0.20, 0.20])python
先看先验组合的风险贡献——它极度不均衡:
| 资产 | 先验权重 | 边际风险贡献 |
|---|---|---|
| 股票 | 40% | 55.3% |
| 债券 | 10% | −0.6% |
| 黄金 | 10% | 2.6% |
| 商品 | 20% | 14.4% |
| REITs | 20% | 28.2% |
股票一个人扛了 55% 的风险——这就是「观点很满但风险集中」的典型。熵风险平价要做的,是在不推翻先验的前提下,把这条曲线压平。
三、从零求解:交叉熵 + 风险平价约束#
我们用 scipy 的 SLSQP 求解一个带惩罚的目标:
其中 是资产 的边际风险贡献占比,。λ 越大越偏向纯风险平价,λ 越小越尊重先验。
import numpy as np
from scipy.optimize import minimize
def risk_contrib(w, cov):
w = np.asarray(w, float)
pv = w @ cov @ w
return w * (cov @ w) / pv # 各资产风险贡献占比, 和为 1
def solve_entropy_rp(cov, w0, lam=50.0):
n = cov.shape[0]
def obj(w):
w = np.clip(w, 1e-9, None)
ent = np.sum(w * np.log(w / w0)) # 交叉熵(偏离先验)
rc = risk_contrib(w, cov)
conc = np.sum((rc - 1.0/n) ** 2) # 风险平价集中度
return ent + lam * conc
cons = [{"type": "eq", "fun": lambda w: np.sum(w) - 1.0}]
bnds = [(0, 1)] * n
w0i = w0 / w0.sum()
res = minimize(obj, w0i, method="SLSQP",
bounds=bnds, constraints=cons,
options={"ftol": 1e-12, "maxiter": 500})
return res.xpython跑出来(λ=50):
w_erp = solve_entropy_rp(cov, w_prior, lam=50.0)
# array([0.196, 0.047, 0.343, 0.247, 0.167])python对照各方法的风险贡献占比:

一眼看懂:
- 最小方差 / 最大熵 把 70%+ 风险压在债券上(因为债券波动最低)——过度集中,只是换了种集中方式;
- 传统风险平价 和熵风险平价 最接近平线(理想 20%);
- 熵风险平价的曲线比传统风险平价略带起伏——那是它在「让步给先验观点」。
具体看熵风险平价的风险贡献:[25.6%, −0.2%, 24.4%, 25.1%, 25.2%]——几乎完美 25/25/25/25/25,同时权重 [19.6%, 4.7%, 34.3%, 24.7%, 16.7%] 仍明显带着「黄金超配、债券压低」的先验痕迹。
四、权重分布:折中,而非最分散#
一个常见误解是「熵风险平价 = 最分散」。看权重分布和香农熵就清楚了:

- 等权 H 最高(1.609,完全均匀),但风险贡献最不平;
- 最小方差/最大熵 H 最低(高度集中债券);
- 熵风险平价 H≈1.47,夹在先验和「纯风险均衡」之间——它的目标从不是「最分散」,而是「在不过度偏离你观点的前提下,让风险别太集中」。这正是它相对纯风险平价的价值:你保留了研究结论,只是把风险的刺拔掉。
五、样本外滚动波动率:稳定与分散的权衡#
用前一半数据估计协方差、后一半做样本外滚动(60 日窗口)年化波动率:

| 组合 | 样本外平均年化波动率 |
|---|---|
| 先验 / 市值偏重 | 13.4% |
| 等权 | 10.2% |
| 最小方差 | 4.3%(但极度集中债券,含模型风险) |
| 熵风险平价 | 11.3% |
熵风险平价比「裸先验」波动率低约 2 个点(风险被摊开),又比最小方差更分散(不把命运押在债券低波动假设上)。它处在「稳定」和「不过度集中」的甜区——这正是带观点的风险预算想要的位置。
六、五类真实陷阱(落地前必读)#
- 先验 的质量决定天花板:熵风险平价只是「尊重先验的平滑器」,先验本身是拍脑袋的垃圾,出来的权重也是垃圾。先验最好来自可辩护的来源(市值、基准、因子暴露目标),别随手填。
- 协方差估计是真正的命脉:全篇用的是「已知协方差」。实盘里协方差用样本估计会噪声巨大,必须用**收缩估计(shrinkage)**或指数加权。协方差错了,风险贡献等式建立在沙上。
- λ 是旋钮不是常数:λ 大→接近纯风险平价(丢观点),λ 小→几乎就是先验(没分散)。λ 该由你的「观点置信度」决定——观点越确信,λ 越小。
- 相关性在危机中突变:压力时刻股债相关性翻正、黄金失灵,风险平价瞬间「以为分散了其实没分散」。要用危机期协方差做压力测试,别只看平静期。
- 交叉熵对先验为 0 的资产「关死门」:若 而优化想给正权重,会出现 ,数值上直接禁掉该资产。想保留「先验为 0 但允许小幅进入」的灵活性,给 加一个极小底(如 1e-4)。
七、小结#
熵风险平价不是「又一个风险平价变种」,而是把组合构建从**「机械的风险分配」升级为「带观点的风险分配」**:
- 交叉熵 把「偏离你先验的代价」量化成可微的目标;
- 风险平价约束 保证最终组合不被单一资产绑架;
- λ 让你用旋钮控制「观点」和「分散」的配比。
真实落地:先定一个有辩护的先验 (市值/基准/因子目标),用收缩协方差估计风险,选一个反映你观点置信度的 λ,跑 scipy 求解,再用危机期协方差做压力测试。它不保证收益最高,但能让你既用上自己的研究,又不把组合命运押在单一资产上——这是介于「纯观点」和「纯风险平价」之间,大多数机构真正想要的那条线。
文中所有图表均由上述 Python 代码在合成数据上真实计算生成;数字仅用于演示方法,实盘请以你自己的协方差估计与样本外验证为准。