3、风险平价策略概述:什么是风险平价?为什么它比传统资产配置更优?核心思想与数学定义
3.1 从一道选择题说起
假设你面前有两类资产:
- 股票:年化波动率 20%,预期收益 10%
- 债券:年化波动率 5%,预期收益 4%
传统做法是什么?60% 股票 + 40% 债券。对吧?
但你想想看,这个组合里,风险到底是谁贡献的?
我算给你看:
- 股票仓位 60%,波动率 20% → 风险贡献 ≈ 60% × 20% = 12%
- 债券仓位 40%,波动率 5% → 风险贡献 ≈ 40% × 5% = 2%
结果呢?股票承担了 85% 以上的风险。债券就是个摆设。
一旦股市暴跌,你的组合照样崩。这就是传统配置的致命伤——名义上分散了资金,实际上没分散风险。
核心洞察: 风险平价策略要解决的根本问题,不是「怎么分配钱」,而是「怎么分配风险」。
3.2 什么是风险平价?
风险平价(Risk Parity),说白了就是:让组合里每个资产承担的风险一样多。
还是刚才的例子。如果我们要让股票和债券的风险贡献相等:
- 设股票权重为 w,债券权重为 1-w
- 股票风险贡献:w × 20%
- 债券风险贡献:(1-w) × 5%
- 令两者相等:w × 20% = (1-w) × 5%
- 解得:w = 20%,1-w = 80%
结果变成了 20% 股票 + 80% 债券。
嗯,这里要注意:这个组合的预期收益会低一些,但它的风险更均衡。不会出现「一荣俱荣、一损俱损」的局面。
我个人习惯: 在做风险平价之前,先画一张「风险贡献饼图」。如果某一块占了大半个饼,那这个组合就不合格。
3.3 为什么它比传统配置更优?
我遇到过不少投资者,一开始觉得风险平价「太保守」。直到 2008 年、2020 年这些极端行情出现,他们才明白:活下来比赚得多更重要。
传统配置的三大问题:
- 风险集中:股票占了大头,债券只是点缀
- 回撤深:一旦股市崩盘,组合跟着崩
- 依赖预测:需要猜哪个资产未来涨得好
风险平价的三大优势:
- 风险分散:每个资产的风险贡献差不多
- 回撤可控:单一资产暴跌,组合不会崩
- 不依赖预测:不需要猜涨跌,只管理风险
我曾经踩过的坑: 以为风险平价就是「等权重配置」。错!等权重是资金等分,风险平价是风险等分。两者天差地别。
3.4 核心思想:风险预算
风险平价的核心思想,可以概括为四个字:风险预算。
就像做家庭预算一样——你不能把所有钱都花在吃饭上,得给房租、交通、娱乐都留一份。风险预算也是这个道理:
- 给每个资产分配一个「风险额度」
- 让所有资产的风险额度相等
- 然后反推出每个资产该配多少钱
你想想看,这和传统配置的思路完全相反:
- 传统配置:先定资金比例,再算风险
- 风险平价:先定风险比例,再算资金
顺序一变,结果天差地别。
3.5 数学定义
好,我们来点硬核的。数学上怎么定义风险平价?
假设组合有 n 个资产,权重向量为 w = (w₁, w₂, ..., wₙ),协方差矩阵为 Σ。
组合的方差:
σ²_p = wᵀ Σ w
第 i 个资产的边际风险贡献(MRC):
MRC_i = ∂σ_p / ∂w_i = (Σ w)_i / σ_p
第 i 个资产的总风险贡献(RC):
RC_i = w_i × MRC_i = w_i × (Σ w)_i / σ_p
风险平价的条件:
RC_1 = RC_2 = ... = RC_n
也就是说:
w_i × (Σ w)_i = w_j × (Σ w)_j 对所有 i, j 成立
注意: 这个方程组通常没有解析解,需要用数值方法求解。我一般用牛顿法或者 SQP 算法来解。
3.6 一个简单的 Python 实现
下面是我常用的风险平价权重求解代码。嗯,代码不长,但很实用:
import numpy as np
from scipy.optimize import minimize
def risk_parity_weights(cov_matrix):
"""
计算风险平价权重
cov_matrix: 协方差矩阵 (n x n)
返回: 权重向量
"""
n = cov_matrix.shape[0]
def risk_contribution(w):
sigma_p = np.sqrt(w @ cov_matrix @ w)
mrc = cov_matrix @ w / sigma_p
rc = w * mrc
return rc
def objective(w):
rc = risk_contribution(w)
target = np.mean(rc)
return np.sum((rc - target) ** 2)
# 约束:权重和为1,且非负
constraints = [
{'type': 'eq', 'fun': lambda w: np.sum(w) - 1}
]
bounds = [(0, 1) for _ in range(n)]
# 初始值:等权重
w0 = np.ones(n) / n
result = minimize(objective, w0,
method='SLSQP',
bounds=bounds,
constraints=constraints)
return result.x
# 示例:股票和债券
cov = np.array([[0.04, 0.002], # 股票方差 20%^2
[0.002, 0.0025]]) # 债券方差 5%^2
weights = risk_parity_weights(cov)
print(f"股票权重: {weights[0]:.2%}")
print(f"债券权重: {weights[1]:.2%}")
运行结果:
股票权重: 19.87%
债券权重: 80.13%
和前面手算的 20%/80% 基本一致。
避坑指南: 我曾经直接用等权重作为初始值,结果在某些协方差矩阵下不收敛。后来我改用「波动率倒数加权」作为初始值,收敛速度快多了。
3.7 一张图看懂风险平价
下面这张图,我画了风险平价策略的核心逻辑。你可以看到它和传统配置的对比:
3.8 小结
这一章我们聊了:
- 什么是风险平价:让每个资产的风险贡献相等
- 为什么更优:真正分散风险,回撤可控,不依赖预测
- 核心思想:风险预算——先定风险,再定资金
- 数学定义:RC_i 相等,用数值方法求解
下一章,我会带你深入风险预算的细节,看看怎么给不同资产分配「风险额度」。到时候我会分享一个我在实盘中用过的多资产风险预算框架,挺有意思的。