相关性与协方差
:::info 学习目标 你将能从协方差得到相关系数,检查协方差矩阵是否合法,并识别非线性关系、异常值和市场状态变化对相关性的影响。 :::
直觉
「鸡蛋别放一个篮子」背后的数学,就是相关性:两个资产同涨同跌的程度。相关性低,组合才能分散风险。这一节用多资产数据,看股、债、商品、REIT 之间到底有多「相关」。
数学原理
两个随机变量 :
「人话」解释:协方差与相关系数的区别
- 协方差:带单位的「联动大小」,数值依赖资产量纲,不好直接比较。
- 相关系数 :归一化到 。 完全同向, 完全反向, 线性无关。
- 关键: 只代表线性无关,不代表独立(非线性关系可能很强但 )。
- 组合的方差是 ——分散化的全部魔法就在交叉项 里。
可运行案例:四类资产的相关矩阵
读取 multi_asset_daily.csv(股/债/商品/REIT),算收益的相关矩阵并画成热力图。留意股-债为负相关——这正是分散化的来源。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('/data/multi_asset_daily.csv', parse_dates=['date']).set_index('date')
assets = ['equity', 'bond', 'commodity', 'reit']
ret = np.log(df[assets] / df[assets].shift(1)).dropna()
corr = ret.corr()
cov = ret.cov()
print("相关矩阵:"); print(corr.round(3))
print("\n年化波动:")
print((ret.std(ddof=0) * np.sqrt(252)).round(3))
# 热力图
plt.figure(figsize=(4.6, 4))
im = plt.imshow(corr.values, vmin=-1, vmax=1, cmap='RdYlGn')
plt.colorbar(im, fraction=0.046, label='相关系数')
plt.xticks(range(len(assets)), assets); plt.yticks(range(len(assets)), assets)
for i in range(len(assets)):
for j in range(len(assets)):
plt.text(j, i, f"{corr.values[i,j]:.2f}", ha='center', va='center',
color='black', fontsize=11)
plt.title("四类资产收益相关矩阵"); plt.tight_layout(); plt.show()
动手改一改
把计算窗口改成滚动相关,例如 ret['equity'].rolling(252).corr(ret['bond']),画出来——你会发现相关性并不稳定,危机时股债相关常常上升,分散效果在「最需要它的时候」打折扣。
适用边界与常见误区
Pearson 相关只度量线性共动,且会被极端值和共同趋势影响。对价格水平直接算相关通常没有意义,应使用同频、同步的收益;还可查看 Spearman 秩相关、滚动相关和下跌期相关。用于优化的协方差矩阵必须对称半正定,小样本下可采用收缩估计减少噪声。
实践与延伸
- 构造 ,观察 Pearson 相关接近零却存在确定关系。
- 分正常期和压力期估相关矩阵,检查股债分散化是否稳定。
延伸阅读:Ledoit–Wolf 协方差收缩;尾部相关与 copula 入门资料。
小结
- 协方差看联动大小,相关系数归一化到 ;
- 相关越低,组合分散越好;但 仅代表线性无关;
- 相关性随时间变化,别把历史相关当作永恒常数(模块 7 组合优化会处理)。
章末自测
检查核心概念
1. 关于本章主题,哪项说法更准确?