第四节:等风险贡献(ERC)模型
各位同学,今天我们来聊一个我特别喜欢的模型——等风险贡献(ERC)。
说实话,在量化交易里,很多人一上来就想着怎么赚钱。但我做了这么多年,发现一个残酷的事实:活下来比赚钱更重要。而ERC模型,就是帮你「活下来」的一把好手。
一、ERC的核心思想
等风险贡献,英文叫Equal Risk Contribution。名字已经说得很明白了——让每个资产对组合的风险贡献相等。
你想想看,传统的等权重模型,是让每个资产的钱一样多。但这样有个问题:如果某个资产波动特别大,它实际上承担了组合里大部分的风险。一旦出事,整个组合就崩了。
ERC的思路不一样。它说:「我不在乎你投了多少钱,我只在乎你贡献了多少风险。」
举个例子。我有两个资产:
- 资产A:波动率10%
- 资产B:波动率30%
如果等权重各投50%,资产B的风险贡献可能是资产A的3倍。这合理吗?我个人觉得不合理。ERC的做法是:让资产B少投点,资产A多投点,最终让两者的风险贡献相等。
核心思想总结:
- 等权重:每个资产分配相同的资金
- 等风险:每个资产分配相同的风险
二、数学推导——其实没那么可怕
很多同学看到数学就头疼。别怕,我尽量讲得通俗点。
首先,组合的总风险(用方差表示)是:
σ²_p = wᵀ Σ w
其中w是权重向量,Σ是协方差矩阵。
那么,第i个资产对组合的风险贡献(RC)是:
RC_i = w_i × (Σw)_i / σ_p
这个公式怎么理解?说白了,就是「这个资产的权重」乘以「它和其他资产的协方差总和」,再除以组合总风险。
ERC的目标是让所有RC_i相等:
RC_1 = RC_2 = ... = RC_n = σ_p / n
嗯,这里要注意:这个等式不是直接能解出来的。我们需要用数值优化方法。
我习惯用梯度下降法来求解。目标函数是:
min Σ (RC_i - σ_p/n)²
让每个资产的风险贡献尽可能接近平均值。
避坑指南:我曾经在实盘里直接用历史协方差矩阵做ERC,结果发现协方差矩阵不稳定,导致权重频繁跳变。后来我改用指数加权协方差,效果好了很多。
三、ERC vs 等权重——一个真实对比
咱们用数据说话。假设有3个资产:
| 资产 | 年化波动率 | 与其他资产相关性 |
|---|---|---|
| 股票 | 20% | 与债券0.2,与商品0.3 |
| 债券 | 5% | 与股票0.2,与商品0.1 |
| 商品 | 25% | 与股票0.3,与债券0.1 |
等权重下,各投33.3%。但风险贡献呢?
- 股票:约45%
- 债券:约10%
- 商品:约45%
看到了吗?债券几乎没起到分散作用,因为它的风险太小了。而股票和商品承担了绝大部分风险。
ERC模型给出的权重可能是:
- 股票:25%
- 债券:50%
- 商品:25%
这样每个资产的风险贡献都接近33.3%。组合更稳健了。
注意:ERC不是万能的。如果资产之间的相关性很高,ERC的效果会大打折扣。我见过有人把高度相关的两个资产做ERC,结果权重分配和等权重差不多,白费功夫。
四、Python实现——手把手教你写
好了,理论讲完了,咱们上代码。这是我常用的ERC实现:
import numpy as np
from scipy.optimize import minimize
def erc_weights(cov_matrix):
"""
计算等风险贡献权重
cov_matrix: 协方差矩阵
"""
n = cov_matrix.shape[0]
# 目标函数:让每个资产的风险贡献相等
def objective(w):
w = w / np.sum(w) # 确保权重和为1
port_var = w @ cov_matrix @ w
port_vol = np.sqrt(port_var)
# 计算每个资产的风险贡献
rc = w * (cov_matrix @ w) / port_vol
# 目标:每个RC尽可能接近平均值
target = port_vol / n
return np.sum((rc - target) ** 2)
# 初始权重:等权重
w0 = np.ones(n) / n
# 约束条件:权重和为1,且每个权重大于0
constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
bounds = [(0, 1) for _ in range(n)]
result = minimize(objective, w0, method='SLSQP',
bounds=bounds, constraints=constraints)
weights = result.x / np.sum(result.x)
return weights
# 使用示例
cov = np.array([
[0.04, 0.002, 0.015],
[0.002, 0.0025, 0.00125],
[0.015, 0.00125, 0.0625]
])
weights = erc_weights(cov)
print("ERC权重:", weights)
这段代码的核心逻辑很简单:
- 定义目标函数,让每个资产的风险贡献尽可能相等
- 用scipy的优化器求解
- 返回归一化后的权重
我的经验:实际使用时,我建议加上权重上下限约束。比如单个资产不超过40%,不低于5%。这样能避免极端情况。
五、ERC的优缺点
最后,咱们客观评价一下ERC模型。
优点:
- 风险分散更均匀,不会出现某个资产「绑架」组合的情况
- 对波动率变化敏感,能自动调整权重
- 数学上优雅,逻辑清晰
缺点:
- 依赖协方差矩阵的估计,估计不准时效果会打折扣
- 计算成本比等权重高,需要数值优化
- 在极端市场环境下,可能不如最小方差模型稳健
我个人觉得,ERC是一个很好的「中间方案」。它不像等权重那么粗糙,也不像最小方差那么激进。如果你刚开始做风险预算,从ERC入手是个不错的选择。
一句话总结:等权重管钱,等风险管命。想活得久,试试ERC。
公众号:蓝海资料掘金营,微信deep3321