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(自己和自己的相关性),非对角线就是我们要的值。

我的经验:在实际项目中,我一般用60个交易日的滚动窗口来计算相关系数。太短了噪声大,太长了反应迟钝。60天是个不错的折中。

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)

滚动相关性可以帮你发现几个关键问题:

  • 趋势性变化:相关性在慢慢升高还是降低?
  • 结构性突变:相关性突然跳到一个新水平?
  • 极端事件:市场大跌时相关性是否骤升?
注意:滚动窗口的选择很关键。窗口太小,相关性会剧烈波动,给你很多假信号。窗口太大,又会错过重要变化。我建议至少用60个交易日,如果是周频数据,用52周(一年)。

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

这个值越高,说明市场暴跌时,这两个资产越容易一起跌。对于风险管理者来说,这是必须关注的指标。

避坑指南:我曾经用普通相关性做风险预算,结果遇到2020年3月的流动性危机,组合回撤远超预期。后来加了尾部相关性约束,情况就好多了。

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年新冠疫情:避险资产和风险资产的相关性出现反转
我的建议:每季度做一次相关性结构突变检测。如果发现突变,就要重新审视你的资产配置模型。别等到回撤了才后悔。

知识体系总览

下面这张图,是我自己梳理的相关性分析知识体系。你可以把它当作一个检查清单,看看自己漏了哪一块。

相关性矩阵知识体系 相关性矩阵 协方差与相关系数 滚动相关性 尾部相关性 相关性结构突变 线性关系方向 标准化到[-1,1] 动态观察 窗口选择 极端事件 条件概率 Chow检验 Bai-Perron检验 核心目标:识别风险、优化配置、控制回撤

好了,这一章的内容就到这里。相关性分析是资产配置的基石,但也是最容易被忽视的部分。希望你能把这些工具真正用起来,而不是停留在理论层面。

记住一句话:不要相信静态的相关性,不要忽视尾部风险,不要错过结构突变

课后思考:找两个你熟悉的资产,计算它们的滚动相关性。看看在过去的几次市场危机中,相关性发生了什么变化?这对你的配置有什么启示?

公众号:蓝海资料掘金营,微信deep3321