3. 风险平价模型核心原理:等风险贡献原则、风险预算、组合构建逻辑
好,咱们今天来聊聊风险平价模型的核心原理。说实话,这个模型在量化圈子里火了这么多年,不是没有道理的。我最早接触它是在2015年,当时帮一家资管机构做资产配置方案,传统的60/40组合在极端行情下回撤太大,客户不满意。后来我引入了风险平价,效果确实不一样。
说白了,风险平价的核心思想就一句话:让组合里每个资产对总风险的贡献度相等。你想想看,传统组合里股票占了90%以上的风险,债券虽然配了40%的仓位,但风险贡献微乎其微。这合理吗?当然不合理。风险平价就是要打破这种不平衡。
3.1 等风险贡献原则
等风险贡献,英文叫Equal Risk Contribution,简称ERC。它的数学定义其实很直观:
假设组合有n个资产,每个资产的权重为w_i,组合的波动率为σ_p。那么第i个资产对组合的风险贡献可以写成:
RC_i = w_i × (∂σ_p / ∂w_i) = w_i × (Σw_j σ_ij) / σ_p
等风险贡献要求:
RC_1 = RC_2 = ... = RC_n
嗯,这里要注意。这个等式不是天然成立的,需要迭代求解。我习惯用牛顿法或者SQP算法来解这个优化问题。代码实现大概是这样的:
import numpy as np
from scipy.optimize import minimize
def risk_parity_weights(cov_matrix):
n = cov_matrix.shape[0]
def risk_contribution(w):
sigma_p = np.sqrt(w @ cov_matrix @ w)
return w * (cov_matrix @ w) / sigma_p
def objective(w):
rc = risk_contribution(w)
target = np.mean(rc)
return np.sum((rc - target) ** 2)
constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
bounds = [(0, 1)] * n
w0 = np.ones(n) / n
result = minimize(objective, w0, bounds=bounds,
constraints=constraints, method='SLSQP')
return result.x
我在项目中遇到过一个问题:直接用这个算法算出来的权重,有时候会集中在少数几个资产上。为什么?因为协方差矩阵的条件数太大,数值不稳定。我的解决办法是加入一个正则化项,或者先对协方差矩阵做缩尾处理。
3.2 风险预算
等风险贡献是风险预算的一个特例。风险预算允许你给不同资产设定不同的风险权重。比如你觉得股票应该承担40%的风险,债券承担30%,商品承担30%,那就可以直接设定目标风险贡献向量。
数学上,风险预算模型可以写成:
RC_i = b_i × σ_p
其中b_i是预设的风险预算,满足Σb_i = 1。当b_i = 1/n时,就退化为等风险贡献。
我个人习惯把风险预算分成两类:
- 静态风险预算:固定不变,适合长期配置
- 动态风险预算:根据市场环境调整,适合战术配置
我曾经帮一个客户做动态风险预算,用滚动窗口估计协方差矩阵,每季度调整一次。结果遇到一个问题:调仓太频繁,交易成本吃掉了一部分收益。后来我改成用阈值触发,只有当风险贡献偏离目标超过20%时才调仓,效果好了很多。
3.3 组合构建逻辑
组合构建的逻辑,说白了就是三步走:
- 估计风险参数:主要是协方差矩阵。我建议用指数加权移动平均(EWMA)或者GARCH模型,比简单历史波动率更灵敏。
- 求解权重:用上面提到的优化算法,解出满足风险预算条件的权重向量。
- 执行与再平衡:按照权重买入,定期调整。
这里有个坑,我踩过好几次。协方差矩阵的估计误差会直接传导到权重上。你想想看,如果协方差矩阵不准,算出来的风险贡献就是错的,那整个组合就偏离了目标。我的经验是:用收缩估计(Shrinkage)方法,把样本协方差矩阵向一个结构化矩阵收缩,能显著提高稳定性。
下面这张图展示了风险平价组合的构建流程:
核心要点总结:
- 等风险贡献是风险预算的特例,b_i = 1/n
- 风险预算允许你自定义风险分配比例
- 组合构建的关键是协方差矩阵的准确估计
- 再平衡策略直接影响实际收益
最后说一句,风险平价不是万能的。它适合长期配置,但在趋势行情中可能跑不过简单的60/40组合。不过话说回来,做投资最重要的是活得久,而不是赚得快。风险平价帮你控制住了下行风险,这才是它的价值所在。