4. 相关性矩阵的构建与可视化

行业间相关性研究的起点,是一张按“时间 × 行业”排列的收益率面板。假设我们跟踪 10 个申万一级行业,取最近 250 个交易日的日收益率,面板就是一个 250 行 × 10 列的矩阵:每一行是一个交易日,每一列是一个行业。相关性矩阵要回答的问题是:这 10 列之间,两两的同步程度有多高。因此构建过程本质上是把“时间序列面板”压缩成“行业 × 行业”的对称方阵,对角线恒为 1,非对角线元素是皮尔逊相关系数,取值范围 [-1, 1],正值表示同向联动,负值表示反向对冲。

实际计算时有两个容易被忽略的细节。第一是对齐:不同行业的停牌、节假日、指数成分调整会造成缺失值,必须先按交易日对齐,再决定是剔除整行还是用前值填充;直接对长度不一的序列求相关会得到错误结果。第二是频率与窗口:日收益率相关性噪声大,常用 60 日、120 日或 250 日滚动窗口;窗口越短越敏感、越能捕捉结构变化,但估计误差也越大。下面给出一个可直接运行的最小实现,使用 pandas 从面板生成相关矩阵:

import pandas as pd
import numpy as np

# ret_panel: index=交易日, columns=行业, values=日收益率
ret = ret_panel.dropna(how="any")          # 对齐后剔除缺失交易日
corr = ret.corr(method="pearson")          # 10x10 对称矩阵
print(corr.round(2))

# 若需稳健性,可改用 Spearman 秩相关
corr_s = ret.corr(method="spearman")

得到矩阵后,第一件事不是画图,而是读数值。以示例数据为例(以下数值为教学假设,非实测):银行与非银金融约 0.78,食品饮料与医药约 0.55,电子与计算机约 0.72,而公用事业与电子仅约 0.12,黄金相关行业与多数制造业行业在 0.05 附近甚至为负。这说明行业相关性存在明显的“板块内高、板块间低”的块状结构。仅看数字很难在 45 个非重复配对中快速定位这种结构,于是需要可视化。

三种可视化各有分工,不能互相替代。热力图保留完整的数值信息,用颜色深浅编码相关系数,适合精确查找某一对行业的相关水平,也适合观察块状聚集;缺点是行业一多,标签拥挤、颜色分辨力下降。聚类树状图把相关矩阵转化为距离矩阵(常用距离 d = 1 − ρ),用层次聚类把高相关行业先合并,叶节点顺序重排后能直接看出“哪些行业先抱团”;它回答的是结构分组问题,但不显示具体数值。网络图把行业画成节点、把相关性画成边,只保留超过阈值的强连接(例如 |ρ| ≥ 0.6),适合观察中心节点、桥接行业和孤立行业;缺点是阈值选择主观,且边太多时会变成“毛线球”。

① 收益率面板(时间 × 行业) 日期 银行 电子 医药 T-40.8%-1.2%0.3% T-3-0.4%1.5%0.6% T-20.2%0.9%-0.5% T-10.6%-0.3%0.4% T-0.1%1.1%0.2% 250 行 × 10 列,先对齐交易日 corr() ② 行业相关性矩阵(10×10 对称) 银行电子医药 银行1.000.310.28 电子0.311.000.55 医药0.280.551.00 公用0.090.120.18 对角线为 1,非对角元 ρ ∈ [-1, 1] ③ 三种可视化分工 热力图:保留数值,看块状聚集 深蓝=高正相关 聚类树状图:看分组与合并顺序 距离 d = 1 − ρ 网络图:看中心节点与桥接行业 阈值 |ρ| ≥ 0.6 读图判断要点 · 热力图:先看对角线两侧是否出现明显色块,色块边界即行业分组边界;同一色块内数值普遍 > 0.6 说明联动紧密。 · 聚类树:合并高度越低,说明两行业越相似;在较高高度才合并的分支,可作为分散化的候选组合。 · 网络图:度中心性高的节点是“系统性行业”,连接两个色块的节点是桥接行业,孤立节点是分散化价值较高的对象。 · 三者结论应一致:若热力图显示高相关但网络图无边,通常是阈值设置过高,需回查阈值而非怀疑数据。

把三种图放在一起看,才能形成完整判断。以示例矩阵为例:热力图上银行与非银金融形成深色块,电子与计算机形成另一深色块,两块之间颜色明显变浅;聚类树会把这两组分别先合并,再在较高距离处合并;网络图中银行、非银金融、电子、计算机构成两个紧密子图,而公用事业只有一两条弱边。三个视角指向同一结论:金融板块内部高度同质,科技板块内部高度同质,两板块之间相关性中等,公用事业是分散化价值较高的低相关资产。这正是后续资金分散配置的直接依据。

工程实现上有几点值得注意。热力图建议用发散色阶(如以 0 为中心、负相关用冷色、正相关用暖色),并固定色阶范围 [-1, 1],否则不同窗口的图无法横向比较;聚类时距离矩阵必须对称且对角线为 0,常用 scipy.cluster.hierarchy.linkage 配合 squareform,聚类方法可选 average 或 ward,不同方法会改变叶节点顺序但不改变“谁和谁更近”的实质;网络图建议先设定阈值再布局,节点大小可按度中心性映射,避免所有节点等大而看不出中心。若行业数量超过 20 个,热力图应隐藏具体数值、只保留颜色,网络图则应提高阈值,否则边过密失去可读性。

相关性矩阵是“同期”关联,不含领先滞后信息。若想研究行业间的传导顺序,需要进一步计算交叉相关或领先滞后相关,这属于后续内容。另外,相关性具有时变性,建议同时输出滚动窗口的相关性均值或滚动热力图,观察结构是否稳定。
常见错误:用价格序列而非收益率序列求相关,会因共同趋势得到虚高的相关系数;未对齐交易日直接 corr(),pandas 会按索引自动对齐但可能大量丢行,导致样本骤减;聚类时忘记把相关矩阵转成距离矩阵,直接把相关系数当距离输入,分组结果会完全颠倒。

最后给出一份可复用的检查清单,用于每次生成相关性矩阵后快速自检:面板是否已按交易日对齐、样本量是否足够(建议不少于 60 个观测)、相关系数是否落在 [-1, 1] 且对角线为 1、热力图色阶是否固定、聚类距离是否由 1 − ρ 得到、网络图阈值是否与结论匹配、三种可视化结论是否互相印证。完成这些检查,相关性矩阵才真正成为可支撑资金分散决策的工具,而不只是一张好看的图。