「等权买 25% 股票、25% 债券、25% 黄金、25% 商品」——听起来很分散,但实际风险一点都不分散。股票一个资产就可能吃掉组合一半以上的波动,债券甚至因为负相关在「白送」对冲。
风险平价(Risk Parity) 要回答的是:能不能让每一类资产对组合风险的「贡献」都一样?波动率目标(Volatility Targeting) 接着问:能不能不管市场怎么闹,都把组合总波动钉在 10% 这种舒服的水平上?
本文用一段模拟的股/债/金/商品日度序列(双因子:风险偏好 + 避险,含波动率尖峰)把两者从零跑通,所有图表均为真实计算、非占位图。

一、等权到底有多「不平等」#
先看等权的风险贡献。风险贡献的定义是:
RC_i = w_i · (Σw)_i / (wᵀΣw)plaintext即第 i 个资产权重,乘上它对组合边际风险的贡献,再除以组合总风险。它衡量「这个资产实际扛了多少组合风险」。
在我们这段模拟数据上(年化波动:股票 36%、国债 12%、黄金 15%、商品 25%),等权组合的风险贡献是:
| 资产 | 等权风险贡献 |
|---|---|
| 股票 | 53.9% |
| 国债 | −3.4% |
| 黄金 | 14.9% |
| 商品 | 34.6% |
股票扛了 54% 的风险,而国债因为和股票负相关,贡献是负的——它在「免费」给其他资产做对冲。这根本不是分散,这是把赌注压在股票上、顺便让债券兜底。

二、风险平价:让每块风险一样大#
风险平价(严格说是等风险贡献 ERC)要找一组非负权重 w,使得每一类的 RC_i 都相等(各 25%),且权重和为 1。带负相关的资产会让求解变 tricky(朴素迭代容易解出负权重、甚至空仓债券),所以这里用带非负约束的优化来收口:
import numpy as np
from scipy.optimize import minimize
def erc_weights(Sigma):
"""长仓等风险贡献权重:w>=0, Σw=1, 各资产风险贡献相等。"""
n = Sigma.shape[0]
def obj(w):
pv = w @ Sigma @ w
rc = w * (Sigma @ w) / pv # 各资产风险贡献
return np.sum((rc - 1.0 / n) ** 2) # 越接近全相等越好
cons = [{"type": "eq", "fun": lambda w: w.sum() - 1}]
bounds = [(0.0, None)] * n
res = minimize(obj, np.repeat(1.0 / n, n), method="SLSQP",
bounds=bounds, constraints=cons,
options={"maxiter": 2000, "ftol": 1e-14})
return res.x / res.x.sum()
w_rp = erc_weights(Sigma)python解出来的权重是:股票 11.6%、国债 50.8%、黄金 22.0%、商品 15.6%。国债因为低波动又是避险资产,拿了最大头;股票、商品被显著降权。此时每一类的风险贡献严丝合缝都是 25%——这才是真正的「分散」。
风险平价的核心直觉:低波动 + 负相关(或低相关)的资产,应该拿更多权重,因为它们在相同风险预算下更「便宜」。
三、波动率目标:把总波动钉在目标上#
风险平价解决了「结构」,但没解决「尺度」。市场整体波动会变:平静时组合波动可能只有 6%,恐慌时飙到 20%。如果你想要的是「无论何时都约 10% 波动」的体感,就得加一层波动率目标。
做法是用一段时间窗口估计组合波动,再算杠杆:
L_t = clip( 目标波动 / 估计波动 , 下限, 上限 )plaintext估计用 EWMA(对近期波动给更高权重),并且用前一日的估计去定今日的杠杆,避免前视偏差:
def ewma_vol(r, lam=0.94):
var = np.zeros(len(r))
var[0] = r[0] ** 2
for t in range(1, len(r)):
var[t] = lam * var[t - 1] + (1 - lam) * r[t - 1] ** 2
return np.sqrt(var) * np.sqrt(252)
def apply_vol_target(r, target=0.10, cap=(0.5, 2.5)):
lev = np.clip(target / ewma_vol(r), *cap)
out = np.zeros(len(r))
for t in range(1, len(r)):
out[t] = lev[t - 1] * r[t] # 用昨日杠杆作用于今日
return outpython
杠杆因子在平静期会加到上限 2.5 倍(把过低的波动顶到目标),在波动率尖峰期会砍到下限 0.5 倍(主动收缩风险)。这一加一砍,组合波动就被「熨」到了目标附近。
四、四种方案同台:融合方案胜在「稳」#
把等权、风险平价、等权+波动目标、风险平价+波动目标四者放在一起回测(10 年日度):

| 方案 | 年化收益 | 夏普 | 年化波动 | 最大回撤 |
|---|---|---|---|---|
| 等权 | 6.44% | 0.50 | 14.6% | −30.5% |
| 风险平价 | 3.77% | 0.45 | 9.1% | −17.0% |
| 等权 + 波动目标 | 4.74% | 0.48 | 10.9% | −22.1% |
| 风险平价 + 波动目标 | 4.06% | 0.44 | 10.4% | −17.0% |
读这张表要抓三件事:
- 风险平价把波动和回撤砍掉一大截:波动 14.6% → 9.1%,回撤 −30.5% → −17.0%。代价是收益从 6.4% 降到 3.8%——它多配了低收益的国债,是用收益换了稳健。
- 波动率目标做「尺度校准」:等权被温和降杠(回撤 −30.5% → −22.1%);风险平价因本身波动低于目标,反而被温和加杠(收益 3.8% → 4.1%),回撤维持 −17%。
- 融合方案(风险平价+波动目标)拿到全样本最低的 −17% 回撤和约 10% 的平稳波动——这就是实战里机构偏爱它的原因:不是收益最高,而是「体感最舒服、最不容易被清盘」。
五、为什么单用哪一个都不够#
- 只做风险平价:风险结构是匀的,但绝对波动仍随市场大起大落。牛市后期可能杠杆被动放大,危机初期又可能因为风险预算被压缩而迟迟不加仓。
- 只做波动率目标:它只管「总波动」不管「结构」。若底层是高度相关的资产,降波动的同时并没真正分散,危机里照样一起跌。
- 两者融合:风险平价保证「每一块都分散」,波动率目标保证「整体尺度可控」。一个管结构、一个管尺度,互补得刚刚好。
六、三大实战陷阱#
- 相关性在危机里会「熔断」:平时股债负相关(债券对冲股票),危机里常一起跌、相关性飙升。风险平价的「分散红利」在此时会缩水,所以务必把波动率目标这层「危机降杠」加上去兜底。
- 估计滞后与前视偏差:波动估计要用截至昨日的滚动/EWMA 数据,杠杆只能用在下一期。任何「用未来波动定今日杠杆」的写法都会让回测虚高。
- 杠杆的落地成本:波动率目标靠加杠实现,但加杠有融资成本、标的可借性、保证金约束。上限 2.5 倍在论文里无害,实盘里要对应账户的杠杆额度与流动性。
七、小结#
风险平价回答「怎么分」——按风险而不是按本金平分,让低波动资产拿大头;波动率目标回答「加几倍」——把组合波动钉在既定目标,平静加杠、危机砍杠。
两者融合后,你得到的不是收益最高的组合,而是回撤最小、波动最稳、最不容易在错误的时刻被强制离场的组合。从波动率锥的历史分位,到风险平价的风险拆解,再到波动率目标的尺度校准——量化资产配置的主线从来都是同一句话:先承认世界会波动,再决定你愿意扛多少。