4. 风险分解方法:边际风险贡献、成分风险贡献、百分比风险贡献
在投资组合管理中,仅仅知道组合的总风险是不够的。我们需要将总风险分解到各个资产或因子层面,以理解每个组成部分对整体风险的贡献程度。本节介绍三种最核心的风险分解方法:边际风险贡献(MRC)、成分风险贡献(CRC)和百分比风险贡献(PRC)。
4.1 核心概念与数学定义
假设一个投资组合由 \( n \) 个资产组成,权重向量为 \( \mathbf{w} = (w_1, w_2, ..., w_n)^T \),协方差矩阵为 \( \Sigma \)。组合方差为 \( \sigma_p^2 = \mathbf{w}^T \Sigma \mathbf{w} \),组合波动率为 \( \sigma_p = \sqrt{\mathbf{w}^T \Sigma \mathbf{w}} \)。
| 风险度量 | 数学定义 | 核心含义 |
|---|---|---|
| 边际风险贡献 (MRC) | \( MRC_i = \frac{\partial \sigma_p}{\partial w_i} = \frac{(\Sigma \mathbf{w})_i}{\sigma_p} \) | 资产 \( i \) 权重增加一个微小单位时,组合总风险的瞬时变化率。 |
| 成分风险贡献 (CRC) | \( CRC_i = w_i \times MRC_i = w_i \times \frac{(\Sigma \mathbf{w})_i}{\sigma_p} \) | 资产 \( i \) 对组合总风险的绝对贡献值(以波动率单位计量)。 |
| 百分比风险贡献 (PRC) | \( PRC_i = \frac{CRC_i}{\sigma_p} = \frac{w_i \times (\Sigma \mathbf{w})_i}{\sigma_p^2} \) | 资产 \( i \) 对组合总风险的相对贡献比例(百分比形式)。 |
关键性质: 成分风险贡献具有可加性,即所有资产的 CRC 之和等于组合总风险 \( \sigma_p \)。百分比风险贡献之和等于 100%。这一性质使得 CRC 和 PRC 成为风险归因的标准工具。
4.2 三种方法的对比与适用场景
| 维度 | 边际风险贡献 (MRC) | 成分风险贡献 (CRC) | 百分比风险贡献 (PRC) |
|---|---|---|---|
| 输出形式 | 风险变化率(无量纲) | 风险绝对值(与 \( \sigma_p \) 同单位) | 风险比例(0% ~ 100%) |
| 可加性 | 不可加 | 可加(总和 = \( \sigma_p \)) | 可加(总和 = 100%) |
| 主要用途 | 调仓决策、对冲分析 | 风险归因报告、VaR分解 | 风险预算、绩效归因 |
| 对权重的敏感性 | 高(导数性质) | 中等(权重×导数) | 中等(归一化后) |
实践建议: 在风险预算(Risk Budgeting)策略中,通常使用百分比风险贡献(PRC)来设定目标风险分配。例如,设定每个资产的风险贡献相等(等风险贡献组合)。
4.3 风险分解的数学推导与计算流程
以下是一个完整的计算流程,以 Python 代码示例展示如何从组合权重和协方差矩阵计算三种风险贡献。
import numpy as np
def risk_decomposition(weights, cov_matrix):
"""
计算投资组合的三种风险贡献度量。
参数:
weights (np.array): 资产权重向量,形状 (n,)
cov_matrix (np.array): 协方差矩阵,形状 (n, n)
返回:
dict: 包含 mrc, crc, prc 的字典
"""
# 组合波动率
portfolio_variance = weights.T @ cov_matrix @ weights
portfolio_vol = np.sqrt(portfolio_variance)
# 边际风险贡献 (MRC)
# MRC_i = (Sigma * w)_i / sigma_p
sigma_w = cov_matrix @ weights
mrc = sigma_w / portfolio_vol
# 成分风险贡献 (CRC)
# CRC_i = w_i * MRC_i
crc = weights * mrc
# 百分比风险贡献 (PRC)
# PRC_i = CRC_i / sigma_p
prc = crc / portfolio_vol
return {
"portfolio_vol": portfolio_vol,
"mrc": mrc,
"crc": crc,
"prc": prc
}
# 示例:3个资产的组合
weights = np.array([0.5, 0.3, 0.2])
cov_matrix = np.array([
[0.04, 0.01, 0.005],
[0.01, 0.09, 0.02],
[0.005, 0.02, 0.16]
])
result = risk_decomposition(weights, cov_matrix)
print(f"组合波动率: {result['portfolio_vol']:.4f}")
print(f"MRC: {result['mrc']}")
print(f"CRC: {result['crc']}")
print(f"PRC: {result['prc']}")
print(f"CRC总和: {np.sum(result['crc']):.4f} (应等于组合波动率)")
4.4 风险分解流程图
下图展示了从输入数据到三种风险贡献输出的完整计算流程与逻辑关系。
4.5 实际应用中的注意事项
- 符号问题: 当资产权重为负(做空)或与组合整体走势负相关时,MRC 和 CRC 可能为负值,表示该资产降低了组合风险。
- 协方差矩阵的估计误差: 风险分解对协方差矩阵的输入非常敏感。建议使用去噪、收缩或因子模型来稳定协方差矩阵的估计。
- 时间维度: 风险贡献是时变的。在回测或实盘监控中,应使用滚动窗口计算,观察风险贡献的稳定性。
- 与 VaR 的关系: 成分风险贡献可以直接用于分解 VaR(风险价值),即 \( CVaR_i = CRC_i \times z_\alpha \),其中 \( z_\alpha \) 是置信水平对应的分位数。
常见误区: 不要将边际风险贡献(MRC)直接解释为“该资产贡献了多少风险”。MRC 是导数,表示变化率,而非绝对贡献量。只有成分风险贡献(CRC)和百分比风险贡献(PRC)才具有可加性,适合用于风险归因报告。
4.6 风险预算与等风险贡献组合
百分比风险贡献(PRC)是风险预算策略的核心工具。等风险贡献(Equal Risk Contribution, ERC)组合要求所有资产的 PRC 相等:
# 等风险贡献组合的迭代求解(简化示例)
def risk_parity_weights(cov_matrix, max_iter=100, tol=1e-6):
n = cov_matrix.shape[0]
w = np.ones(n) / n # 初始等权重
for _ in range(max_iter):
sigma_w = cov_matrix @ w
sigma_p = np.sqrt(w @ sigma_w)
# 目标:每个资产的 PRC = 1/n
# 使用牛顿法或梯度下降更新权重
# 此处省略详细优化代码
pass
return w
ERC 组合在分散化程度和稳定性之间取得了良好的平衡,是风险平价策略的经典实现方式。