跳到主要内容

相关性与协方差

直觉

「鸡蛋别放一个篮子」背后的数学,就是相关性:两个资产同涨同跌的程度。相关性低,组合才能分散风险。这一节用多资产数据,看股、债、商品、REIT 之间到底有多「相关」。

数学原理

两个随机变量 X,YX, Y

Cov(X,Y)=E[(XμX)(YμY)],ρX,Y=Cov(X,Y)σXσY[1,1]\text{Cov}(X,Y) = E[(X-\mu_X)(Y-\mu_Y)], \qquad \rho_{X,Y} = \frac{\text{Cov}(X,Y)}{\sigma_X \sigma_Y} \in [-1, 1]
「人话」解释:协方差与相关系数的区别
  • 协方差:带单位的「联动大小」,数值依赖资产量纲,不好直接比较。
  • 相关系数 ρ\rho:归一化到 [1,1][-1,1]+1+1 完全同向,1-1 完全反向,00 线性无关。
  • 关键:ρ=0\rho=0 只代表线性无关,不代表独立(非线性关系可能很强但 ρ0\rho\approx0)。
  • 组合的方差是 σp2=iwi2σi2+ijwiwjρijσiσj\sigma_p^2 = \sum_i w_i^2\sigma_i^2 + \sum_{i\ne j} w_i w_j \rho_{ij}\sigma_i\sigma_j——分散化的全部魔法就在交叉项 ρ\rho 里。

可运行案例:四类资产的相关矩阵

读取 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']),画出来——你会发现相关性并不稳定,危机时股债相关常常上升,分散效果在「最需要它的时候」打折扣。

小结

  • 协方差看联动大小,相关系数归一化到 [1,1][-1,1]
  • 相关越低,组合分散越好;但 ρ=0\rho=0 仅代表线性无关;
  • 相关性随时间变化,别把历史相关当作永恒常数(模块 7 组合优化会处理)。