3. 风险分解方法:方差分解、协方差分解与边际风险贡献(MRC)
组合风险归因的核心在于将总风险拆解到各个资产或因子层面,从而回答“风险从何而来”。本章系统讲解三种递进的风险分解方法:方差分解(Variance Decomposition)、协方差分解(Covariance Decomposition)以及边际风险贡献(Marginal Risk Contribution, MRC)。三者从简单比例分配到考虑资产间联动,再到衡量微小持仓变动的风险影响,构成了风险归因的完整工具链。
3.1 方差分解:最简单的比例归因
方差分解将组合方差直接按权重平方与方差乘积的比例进行拆分。对于资产 \(i\),其方差贡献为 \( w_i^2 \sigma_i^2 \)。该方法假设资产间完全独立(协方差为零),因此仅适用于初步、粗略的风险概览。
| 特征 | 方差分解 | 协方差分解 | 边际风险贡献(MRC) |
|---|---|---|---|
| 是否考虑协方差 | 否(假设独立) | 是(完全包含) | 是(完全包含) |
| 贡献总和 | 等于组合方差 | 等于组合方差 | 等于组合标准差 |
| 对权重变化的敏感性 | 低(仅平方项) | 中(含交叉项) | 高(一阶导数) |
| 适用场景 | 快速筛查、独立资产池 | 标准归因报告 | 调仓优化、风险预算 |
3.2 协方差分解:纳入资产联动
协方差分解将组合方差拆解为每个资产与所有其他资产的协方差贡献之和。资产 \(i\) 的协方差贡献定义为:
RC_i = w_i * (Σ * w)_i
= w_i * (w_1 * σ_i1 + w_2 * σ_i2 + ... + w_n * σ_in)
其中 \((Σ * w)_i\) 表示协方差矩阵与权重向量乘积的第 \(i\) 个分量。所有资产的 \(RC_i\) 之和恰好等于组合方差 \(\sigma_p^2\)。
协方差分解的优点是完全可加且考虑了所有资产间的相关性,是业界最常用的风险归因方法之一。其局限性在于贡献值可能为负(当某资产与其他资产负相关且权重为正时),需要结合业务逻辑解释。
3.3 边际风险贡献(MRC):从导数视角看风险
边际风险贡献衡量持仓权重微小变动对组合总风险的影响程度。数学上,MRC 是组合标准差 \(\sigma_p\) 对权重 \(w_i\) 的偏导数:
MRC_i = ∂σ_p / ∂w_i
= (Σ * w)_i / σ_p
= (w_1 * σ_i1 + w_2 * σ_i2 + ... + w_n * σ_in) / σ_p
MRC 具有以下重要性质:
- 风险贡献可加性: \( \sum_{i=1}^n w_i \times MRC_i = \sigma_p \)(组合标准差)
- 符号意义:正 MRC 表示增持该资产会增加组合风险;负 MRC 表示增持该资产会降低组合风险(对冲作用)。
- 风险预算基础:在风险平价(Risk Parity)策略中,通过调整权重使各资产 \( w_i \times MRC_i \) 相等。
3.4 三种方法对比与选择建议
以下表格从多个维度对比三种方法,帮助你在实际项目中做出选择:
| 维度 | 方差分解 | 协方差分解 | MRC |
|---|---|---|---|
| 数学基础 | \( w_i^2 \sigma_i^2 \) | \( w_i (\Sigma w)_i \) | \( (\Sigma w)_i / \sigma_p \) |
| 归因对象 | 方差 | 方差 | 标准差 |
| 是否可加 | 是(总和=方差) | 是(总和=方差) | 加权和=标准差 |
| 负值可能性 | 否 | 是 | 是 |
| 对调仓的指导意义 | 弱 | 中 | 强 |
| 计算复杂度 | O(n) | O(n²) | O(n²) |
3.5 Python 实现示例
以下代码演示如何基于历史收益率数据计算三种风险分解指标:
import numpy as np
def risk_decomposition(weights, cov_matrix):
"""
计算组合风险分解:方差分解、协方差分解、MRC
参数:
weights: ndarray, 资产权重向量 (n,)
cov_matrix: ndarray, 协方差矩阵 (n, n)
返回:
dict: 包含 var_decomp, cov_decomp, mrc, portfolio_std
"""
# 组合方差与标准差
port_var = weights @ cov_matrix @ weights
port_std = np.sqrt(port_var)
# 1. 方差分解(假设独立)
var_decomp = weights**2 * np.diag(cov_matrix)
# 2. 协方差分解
sigma_w = cov_matrix @ weights
cov_decomp = weights * sigma_w
# 3. 边际风险贡献 (MRC)
mrc = sigma_w / port_std
# 验证可加性
assert np.abs(np.sum(cov_decomp) - port_var) < 1e-10, "协方差分解不满足可加性"
assert np.abs(np.sum(weights * mrc) - port_std) < 1e-10, "MRC加权和不等于组合标准差"
return {
"var_decomp": var_decomp,
"cov_decomp": cov_decomp,
"mrc": mrc,
"portfolio_std": port_std,
"portfolio_var": port_var
}
# 示例:三资产组合
weights = np.array([0.4, 0.35, 0.25])
cov = np.array([[0.04, 0.012, 0.008],
[0.012, 0.09, -0.006],
[0.008, -0.006, 0.16]])
result = risk_decomposition(weights, cov)
print("组合标准差:", round(result["portfolio_std"], 4))
print("协方差分解贡献:", np.round(result["cov_decomp"], 4))
print("MRC:", np.round(result["mrc"], 4))
3.6 风险归因的常见陷阱
- 协方差矩阵估计误差:使用历史数据估计的协方差矩阵存在抽样误差,尤其在样本量不足时。建议使用收缩估计(Shrinkage)或因子模型降维。
- 忽略非线性风险:上述方法仅适用于线性组合。若组合包含期权等非线性工具,需使用Delta近似或全量重估值。
- 归因频率与再平衡频率不匹配:高频归因配合低频再平衡会导致归因结果与真实调仓行为脱节。
- 负贡献的解释:协方差分解或MRC为负时,应结合资产的对冲角色来解释,而非简单视为“风险降低”。
在实际项目中,建议以协方差分解作为默认的风险归因方法,并在需要调仓决策时补充MRC分析。方差分解仅用于快速筛查或作为教学示例。三种方法结合使用,可以全面理解组合风险的结构与动态变化。