第四节:等风险贡献(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)

这段代码的核心逻辑很简单:

  1. 定义目标函数,让每个资产的风险贡献尽可能相等
  2. 用scipy的优化器求解
  3. 返回归一化后的权重

我的经验:实际使用时,我建议加上权重上下限约束。比如单个资产不超过40%,不低于5%。这样能避免极端情况。

五、ERC的优缺点

最后,咱们客观评价一下ERC模型。

优点:

  • 风险分散更均匀,不会出现某个资产「绑架」组合的情况
  • 对波动率变化敏感,能自动调整权重
  • 数学上优雅,逻辑清晰

缺点:

  • 依赖协方差矩阵的估计,估计不准时效果会打折扣
  • 计算成本比等权重高,需要数值优化
  • 在极端市场环境下,可能不如最小方差模型稳健

我个人觉得,ERC是一个很好的「中间方案」。它不像等权重那么粗糙,也不像最小方差那么激进。如果你刚开始做风险预算,从ERC入手是个不错的选择。

一句话总结:等权重管钱,等风险管命。想活得久,试试ERC。


公众号:蓝海资料掘金营,微信deep3321