2. 方差-协方差方法:协方差矩阵估计、组合方差计算、边际风险贡献
各位同学,咱们今天聊点硬核的。方差-协方差方法,说白了就是现代投资组合理论的「心脏起搏器」。没有它,马科维茨那套理论就是个空架子。我个人习惯把这种方法叫做「风险显微镜」——它能帮你把组合的风险一层层拆开来看,看到底是哪个资产在「搞事情」。
嗯,咱们直接进入正题。这一章的核心就三件事:怎么算协方差矩阵、怎么算组合方差、怎么算边际风险贡献。搞懂了这三样,你就能像外科医生一样精准地切割风险。
2.1 协方差矩阵估计:别让数据骗了你
协方差矩阵,说白了就是资产之间的「关系网」。A涨了B会不会跟着涨?A跌了C会不会跌得更狠?这些关系全写在矩阵里。
最简单的估计方法就是样本协方差:
import numpy as np
import pandas as pd
# 假设我们有3只股票,100天的收益率数据
np.random.seed(42)
returns = pd.DataFrame({
'股票A': np.random.randn(100) * 0.02,
'股票B': np.random.randn(100) * 0.03,
'股票C': np.random.randn(100) * 0.015
})
# 样本协方差矩阵
cov_matrix = returns.cov()
print(cov_matrix)
你看,代码就这么几行。但我要提醒你——样本协方差矩阵是个「数据吃货」。你给它多少数据,它就给你吐出多少结果。问题是,数据量不够的时候,它吐出来的东西可能完全不能用。
那怎么办?我建议你至少保证时间窗口长度是资产数量的3倍以上。如果实在数据不够,可以考虑收缩估计法(Shrinkage Estimation),把样本协方差矩阵往一个更稳定的目标矩阵「拉」一下。
2.2 组合方差计算:把风险「算」出来
组合方差的计算公式其实很简单:
σ²_p = w' Σ w
其中w是权重向量,Σ是协方差矩阵。说白了就是「权重乘协方差再乘权重」——一个二次型而已。
咱们用代码实现一下:
# 假设权重
weights = np.array([0.4, 0.3, 0.3])
# 组合方差
portfolio_variance = weights.T @ cov_matrix @ weights
portfolio_volatility = np.sqrt(portfolio_variance)
print(f"组合方差: {portfolio_variance:.6f}")
print(f"组合波动率: {portfolio_volatility:.4f}")
你想想看,这个公式其实在告诉我们一件事:组合的风险不是单个资产风险的简单加权平均。因为协方差矩阵里那些非对角线元素——资产之间的相关性——会放大或缩小整体风险。
2.3 边际风险贡献:谁在「拖后腿」?
好了,现在我们知道组合的总风险了。但问题是——每个资产对总风险的贡献到底有多大?这就是边际风险贡献要回答的问题。
边际风险贡献(Marginal Risk Contribution, MRC)的定义是:
MRC_i = ∂σ_p / ∂w_i
说白了就是:权重变动一点点,组合风险会变多少。数学上可以推导出:
MRC_i = (Σ w)_i / σ_p
也就是协方差矩阵乘以权重向量,取第i个元素,再除以组合波动率。
咱们继续写代码:
# 计算边际风险贡献
mrc = (cov_matrix @ weights) / portfolio_volatility
print("边际风险贡献:")
for i, name in enumerate(['股票A', '股票B', '股票C']):
print(f"{name}: {mrc[i]:.4f}")
# 计算风险贡献(权重乘以边际贡献)
risk_contribution = weights * mrc
print("\n风险贡献(绝对值):")
for i, name in enumerate(['股票A', '股票B', '股票C']):
print(f"{name}: {risk_contribution[i]:.4f}")
# 验证:风险贡献之和等于组合波动率
print(f"\n风险贡献之和: {risk_contribution.sum():.4f}")
print(f"组合波动率: {portfolio_volatility:.4f}")
运行结果会让你看到:风险贡献之和恰好等于组合波动率。这不是巧合,是数学上的必然。这个性质非常有用——你可以把组合风险「切」成几块,看看哪块最大。
2.4 知识体系总览
为了让你更直观地理解这一章的知识结构,我画了一张图:
2.5 实战中的注意事项
讲完了理论,我得跟你聊聊实战中那些「坑」。这些东西书上一般不写,但你在真实项目中一定会遇到。
| 问题 | 表现 | 我的建议 |
|---|---|---|
| 协方差矩阵不稳定 | 不同时间窗口算出的结果差异很大 | 使用指数加权移动平均(EWMA),给近期数据更高权重 |
| 资产数量太多 | 矩阵维度爆炸,计算缓慢 | 先用主成分分析(PCA)降维,再估计协方差 |
| 存在极端值 | 单个异常收益率扭曲整个矩阵 | 做MAD(中位数绝对偏差)截断处理 |
| 相关性时变 | 牛熊市里相关性完全不同 | 分市场状态估计,或者用DCC-GARCH模型 |
好了,这一章的内容就到这里。方差-协方差方法虽然基础,但它是整个风险管理的基石。你想想看,如果你连组合风险都算不清楚,后面那些复杂的风险模型(比如VaR、CVaR)就更无从谈起了。
记住三句话:协方差矩阵要稳、组合方差要准、边际贡献要清。把这三点做到位,你的风险分析就已经超过了80%的从业者。
- 协方差矩阵估计是基础,数据质量决定模型质量
- 组合方差 = w' Σ w,这个公式要刻在脑子里
- 边际风险贡献帮你找到「风险元凶」
- 风险贡献之和恒等于组合波动率——这是检验计算正确性的黄金法则