相关性与协方差
直觉
「鸡蛋别放一个篮子」背后的数学,就是相关性:两个资产同涨同跌的程度。相关性低,组合才能分散风险。这一节用多资产数据,看股、债、商品、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']),画出来——你会发现相关性并不稳定,危机时股债相关常常上升,分散效果在「最需要它的时候」打折扣。
小结
- 协方差看联动大小,相关系数归一化到 ;
- 相关越低,组合分散越好;但 仅代表线性无关;
- 相关性随时间变化,别把历史相关当作永恒常数(模块 7 组合优化会处理)。