4、相关性矩阵:协方差与相关系数、滚动相关性、尾部相关性、相关性结构突变
各位同学,今天我们来聊聊多资产配置里最核心的一个工具——相关性矩阵。
说实话,我做了这么多年量化投资,见过太多人一上来就搞复杂的机器学习模型,结果连资产之间的相关性都没搞清楚。这就像盖房子不打地基,迟早要塌。
相关性这东西,说白了就是告诉你:当A涨的时候,B是跟着涨,还是跌,还是各走各的。你想想看,如果两个资产永远同涨同跌,那配置它俩有啥意义?
4.1 协方差与相关系数
先讲基础。协方差衡量两个资产收益率的线性关系方向。正数表示同向,负数表示反向。
但协方差有个毛病——它受量纲影响。比如股票收益率的波动是百分之几,债券是千分之几,直接比协方差没意义。
所以我们要用相关系数,把协方差标准化到[-1, 1]之间。
import numpy as np
# 假设我们有两只基金的日收益率数据
returns_A = np.array([0.01, -0.02, 0.03, -0.01, 0.02])
returns_B = np.array([0.005, -0.01, 0.015, -0.005, 0.01])
# 计算协方差矩阵
cov_matrix = np.cov(returns_A, returns_B)
print("协方差矩阵:")
print(cov_matrix)
# 计算相关系数矩阵
corr_matrix = np.corrcoef(returns_A, returns_B)
print("\n相关系数矩阵:")
print(corr_matrix)
输出结果里,对角线是1(自己和自己的相关性),非对角线就是我们要的值。
4.2 滚动相关性
静态的相关性矩阵有个大问题——它假设资产之间的关系是恒定的。但现实世界不是这样的。
我记得2018年做A股和港股的配对交易时,一开始相关性稳定在0.7左右。结果贸易战一打,相关性直接跳到0.95。如果我还用原来的参数,那策略就完蛋了。
所以我们要用滚动相关性,动态观察相关性的变化。
import pandas as pd
import numpy as np
def rolling_correlation(series1, series2, window=60):
"""
计算滚动相关系数
"""
return series1.rolling(window).corr(series2)
# 示例:计算沪深300和中证500的滚动相关性
# 假设df包含两列:'hs300' 和 'zz500'
# df['rolling_corr'] = rolling_correlation(df['hs300'], df['zz500'], window=60)
滚动相关性可以帮你发现几个关键问题:
- 趋势性变化:相关性在慢慢升高还是降低?
- 结构性突变:相关性突然跳到一个新水平?
- 极端事件:市场大跌时相关性是否骤升?
4.3 尾部相关性
嗯,这里要重点讲一下。尾部相关性,说白了就是市场暴跌时,资产之间会不会一起崩。
我见过太多人只看普通相关性,觉得股票和债券相关性是-0.2,挺好的。结果2008年一来,两者相关性直接变成0.8,一起跌。这就是尾部相关性在作怪。
尾部相关性的计算,通常用条件概率的思路:
def tail_dependence(returns_A, returns_B, quantile=0.05):
"""
计算尾部相关性
quantile: 尾部阈值,0.05表示最差的5%情况
"""
# 找出两个资产都处于尾部的情况
tail_A = returns_A < returns_A.quantile(quantile)
tail_B = returns_B < returns_B.quantile(quantile)
# 条件概率:A在尾部时,B也在尾部的概率
both_tail = (tail_A & tail_B).sum()
a_tail = tail_A.sum()
return both_tail / a_tail if a_tail > 0 else 0
这个值越高,说明市场暴跌时,这两个资产越容易一起跌。对于风险管理者来说,这是必须关注的指标。
4.4 相关性结构突变
最后讲一个比较高级的话题——相关性结构突变。
你想想看,资产之间的相关性不是平滑变化的。它经常会在某个时间点突然跳到一个新水平,然后稳定一段时间。这就是结构突变。
检测结构突变的方法有很多,我常用的是Chow检验和Bai-Perron检验。
from statsmodels.stats.diagnostic import breaks_cusumols
import numpy as np
# 假设我们有一段时间的滚动相关性序列
# 检测是否存在结构突变
def detect_structural_break(corr_series):
"""
使用CUSUM检验检测相关性结构突变
"""
# 将相关性序列转为numpy数组
data = corr_series.values.reshape(-1, 1)
# CUSUM检验
cusum_test = breaks_cusumols(data)
return cusum_test
实际应用中,我发现几个常见的结构突变点:
- 2008年金融危机:几乎所有资产的相关性都向1靠拢
- 2015年A股股灾:股票和商品的相关性结构发生改变
- 2020年新冠疫情:避险资产和风险资产的相关性出现反转
知识体系总览
下面这张图,是我自己梳理的相关性分析知识体系。你可以把它当作一个检查清单,看看自己漏了哪一块。
好了,这一章的内容就到这里。相关性分析是资产配置的基石,但也是最容易被忽视的部分。希望你能把这些工具真正用起来,而不是停留在理论层面。
记住一句话:不要相信静态的相关性,不要忽视尾部风险,不要错过结构突变。
公众号:蓝海资料掘金营,微信deep3321