halo 的技术博客

返回

风险平价(Risk Parity)几乎是教科书级的美谈:让组合里每个资产贡献相等的边际风险。相比「60/40 把 90% 风险压在股票上」,风险平价天然分散、抗集中。

但纯风险平价有个你早晚会撞上的尴尬:它把你自己的观点也清零了

假设你做了研究,认为股票该超配、债券只是压舱石——这就是一个「先验权重」w0w_0(比如股票 40%)。传统风险平价完全无视它,机械地按波动率倒数给你权重,结果你和自己的研究打起来。更现实的是:机构往往有「市值偏重」「ESG 约束」「基准跟踪」等先验,硬上风险平价等于把合规和研究结论全扔了。

熵风险平价(Entropy Risk Parity) 把这件事重新表述为一个优化问题:

在「尽量贴近风险平价」的约束下,新权重不要离我的先验观点太远

而「离先验多远」——用**交叉熵(KL 散度)**来度量。交叉熵天然衡量「一个分布相对另一个分布的信息代价」,在这里就是「偏离你观点的代价」。

本文用一份5 资产真实风格协方差(股票/债券/黄金/商品/REITs,波动与相关性都有结构)从零求解熵风险平价,对照等权、传统风险平价、最小方差、最大熵、以及你的市值偏重先验,量化它如何在「尊重先验」与「风险均衡」之间取折中。

一、为什么是「交叉熵」而不是「L2 距离」#

经典风险平价优化常写成「最小化各资产风险贡献的方差」,或者用方差倒数当权重。但这些都不回答一个问题:新权重相对你的先验,偏了多少?

交叉熵(这里特指 KL 散度的一个形式)给出最干净的度量:

DKL(ww0)=iwilnwiw0iD_{\text{KL}}(w \,\|\, w_0) = \sum_i w_i \ln\frac{w_i}{w_0^{\,i}}

它的性质恰好符合直觉:

  • w=w0w = w_0 时交叉熵为 0(完全尊重先验);
  • 某个资产权重被推离 w0w_0 越远,惩罚越大,而且非对称——把先验里 40% 的股票砍到 10%(偏离 30 个点),和把 2% 的债券加到 32%(同样 30 个点),交叉熵的代价不同,因为它按「相对先验的比例」计罚;
  • 它只定义在权重为正的概率单纯形上,天然适配组合权重。

所以熵风险平价的原型是:

minwiwilnwiw0is.t.各资产风险贡献相等,  iwi=1,  wi0\min_w \sum_i w_i \ln\frac{w_i}{w_0^{\,i}} \quad\text{s.t.}\quad \text{各资产风险贡献相等},\;\sum_i w_i=1,\;w_i\ge 0

「交叉熵当桥梁」——它把「相关性树(协方差决定的风险结构)」和「你的先验观点」两座山,用信息代价的语言连起来。

二、5 资产真实风格协方差#

先造一份不像玩具的数据:年化波动差异大(股票 22%、REITs 25%、债券 5%),相关性有结构(股债微负、股 REITs 强正、黄金部分对冲):

5 资产历史模拟路径:波动与相关性差异巨大

先看先验组合的风险贡献——它极度不均衡

资产先验权重边际风险贡献
股票40%55.3%
债券10%−0.6%
黄金10%2.6%
商品20%14.4%
REITs20%28.2%

股票一个人扛了 55% 的风险——这就是「观点很满但风险集中」的典型。熵风险平价要做的,是在不推翻先验的前提下,把这条曲线压平

三、从零求解:交叉熵 + 风险平价约束#

我们用 scipy 的 SLSQP 求解一个带惩罚的目标:

minwiwiln(wi/w0i)偏离先验的交叉熵+λi(RCi1n)2\min_w \underbrace{\sum_i w_i \ln(w_i / w_0^{\,i})}_{\text{偏离先验的交叉熵}} + \lambda \sum_i \big(RC_i - \tfrac{1}{n}\big)^2

其中 RCiRC_i 是资产 ii边际风险贡献占比RCi=wi(Covw)i/(wCovw)RC_i = w_i (Cov\,w)_i / (w'Cov\,w)。λ 越大越偏向纯风险平价,λ 越小越尊重先验。

跑出来(λ=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 个点(风险被摊开),又比最小方差更分散(不把命运押在债券低波动假设上)。它处在「稳定」和「不过度集中」的甜区——这正是带观点的风险预算想要的位置。

六、五类真实陷阱(落地前必读)#

  1. 先验 w0w_0 的质量决定天花板:熵风险平价只是「尊重先验的平滑器」,先验本身是拍脑袋的垃圾,出来的权重也是垃圾。先验最好来自可辩护的来源(市值、基准、因子暴露目标),别随手填。
  2. 协方差估计是真正的命脉:全篇用的是「已知协方差」。实盘里协方差用样本估计会噪声巨大,必须用**收缩估计(shrinkage)**或指数加权。协方差错了,风险贡献等式建立在沙上。
  3. λ 是旋钮不是常数:λ 大→接近纯风险平价(丢观点),λ 小→几乎就是先验(没分散)。λ 该由你的「观点置信度」决定——观点越确信,λ 越小。
  4. 相关性在危机中突变:压力时刻股债相关性翻正、黄金失灵,风险平价瞬间「以为分散了其实没分散」。要用危机期协方差做压力测试,别只看平静期。
  5. 交叉熵对先验为 0 的资产「关死门」:若 w0i=0w_0^i=0 而优化想给正权重,会出现 ln(wi/0)\ln(w_i/0)\to\infty,数值上直接禁掉该资产。想保留「先验为 0 但允许小幅进入」的灵活性,给 w0w_0 加一个极小底(如 1e-4)。

七、小结#

熵风险平价不是「又一个风险平价变种」,而是把组合构建从**「机械的风险分配」升级为「带观点的风险分配」**:

  • 交叉熵 把「偏离你先验的代价」量化成可微的目标;
  • 风险平价约束 保证最终组合不被单一资产绑架;
  • λ 让你用旋钮控制「观点」和「分散」的配比。

真实落地:先定一个有辩护的先验 w0w_0(市值/基准/因子目标),用收缩协方差估计风险,选一个反映你观点置信度的 λ,跑 scipy 求解,再用危机期协方差做压力测试。它不保证收益最高,但能让你既用上自己的研究,又不把组合命运押在单一资产上——这是介于「纯观点」和「纯风险平价」之间,大多数机构真正想要的那条线。

文中所有图表均由上述 Python 代码在合成数据上真实计算生成;数字仅用于演示方法,实盘请以你自己的协方差估计与样本外验证为准。

熵风险平价:用最小交叉熵把相关性树变成权重
https://blog.halo26812.eu.org/blog/entropy-risk-parity
Author halo
Published at 2026年7月19日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨