$n$ 个随机变量 $X_1, \ldots, X_n$ 的相关矩阵是 $n \times n$ 矩阵 $C$,其 $(i, j)$ 条目为
$$ c_{i j}:=\operatorname{corr}\left(X_i, X_j\right)=\frac{\operatorname{cov}\left(X_i, X_j\right)}{\sigma_{X_i} \sigma_{X_j}}, \quad \text { if } \sigma_{X_i} \sigma_{X_j}>0 $$
因此对角线条目都是相同的。如果使用的相关性度量是乘积矩系数,则相关矩阵与标准化随机变量 $X_i / \sigma\left(X_i\right)$ 的协方差矩阵相同,其中 $i=1, \dots, n$ 。这既适用于总体相关性矩阵(在这种情况下 $\sigma$ 是总体标准差),也适用于样本相关性矩阵(在这种情况下 $\sigma$ 表示样本标准差)。因此,每个矩阵都必然是正半定矩阵。此外,如果没有变量可以将其所有值精确地生成为其他变量值的线性函数,则相关矩阵是严格正定的。
相关矩阵是对称的,因为 $X_i$ 和 $X_j$ 之间的相关性与 $X_j$ 和 $X_i$ 之间的相关性相同。例如,相关矩阵出现在多重确定系数的一个公式中,多重确定系数是多重回归中拟合优度的一种度量。
在统计建模中,表示变量之间关系的相关矩阵被分为不同的相关结构,这些结构通过估计它们所需的参数数量等因素来区分。例如,在可交换相关矩阵中,所有变量对都被建模为具有相同的相关性,因此矩阵的所有非对角元素彼此相等。另一方面,当变量表示时间序列时,通常使用自回归矩阵,因为当测量时间更接近时,相关性可能会更大。
让我们考虑相关矩阵在识别线性相关的股票中的应用。下面是使用 yfinance Python 库检索几只大型科技股的历史定价数据的一些示例代码。
import yfinance as yf
import pandas as pd
tickers = ['msft', 'aapl', 'tsla', 'nvda', 'goog']
df = yf.download(ticker=tickers, period='6mo')['Adj Close']
# Result
AAPL GOOG MSFT NVDA TSLA
Date
2021-01-22 138.627029 1901.050049 224.911453 137.046280 846.640015
2021-01-25 142.464767 1899.400024 228.474991 136.454132 880.799988
2021-01-26 142.704010 1917.239990 231.262131 134.275360 883.090027
2021-01-27 141.607513 1830.790039 231.829514 129.103348 864.159973
2021-01-28 136.653336 1863.109985 237.831787 130.435074 835.429993
... ... ... ... ... ...
2021-07-15 148.479996 2625.330078 281.029999 189.662506 650.599976
2021-07-16 146.389999 2636.909912 280.750000 181.610001 644.219971
2021-07-19 142.449997 2585.080078 277.010010 187.797501 646.219971
2021-07-20 146.149994 2622.030029 279.320007 186.119995 660.500000
2021-07-21 145.399994 2652.010010 281.399994 194.100006 655.289978
yfinance download()
方法默认提供开盘价-最高价-最低价-收盘价 (OHLC) 数据,包括开盘价、最高价、最低价、收盘价、成交量、调整收盘价。这里我们仅提取了过去 6 个月内每只股票每日调整收盘价数据。
鉴于这些股票都来自同一行业,并且是市场上交易量最大的股票,因此它们的价格很有可能会一起变动。也就是说,当 MSFT 的价格上涨时,GOOG 的价格很可能也会上涨。不过,这只是猜测,让我们创建一个相关矩阵来验证我们的假设。
>>> data.corr()
# Result
AAPL GOOG MSFT NVDA TSLA
AAPL 1.000000 0.429290 0.708614 0.634802 0.407953
GOOG 0.429290 1.000000 0.894801 0.882468 -0.535120
MSFT 0.708614 0.894801 1.000000 0.911506 -0.218011
NVDA 0.634802 0.882468 0.911506 1.000000 -0.243408
TSLA 0.407953 -0.535120 -0.218011 -0.243408 1.000000
这些结果详细列出了 6 个月期间每只股票调整后收盘价之间的相关系数,可供交叉引用。请注意,1.0 的值从左上角向右下角对角移动。这些值反映了完美的相关性,因为它们引用的是同一只股票。换句话说,AAPL 和 AAPL 之间的相关系数为 1.0,因为它们始终完全相同!
矩阵中的相关系数介于 -1 到 1 之间,其中 -1 表示完全负相关,0 表示无相关,1 表示完全正相关。考虑这些值可以让我们识别价格一起变动的不同股票,无论是正向变动还是负向变动。关于如何解释这些结果,存在不同的学派,但一般来说,高于 .7 和低于 -.7 的值被视为可能存在共线性的危险信号。在这种情况下,应进行进一步调查,以确保得到的线性模型具有最小的误差。
上面的表格非常有见地,但在解释大型数据集时,它并不是最友好的格式。相关矩阵在其他应用中很有用,例如对特征工程等应用程序的变量进行快速初步评估。在这些情况下,使用一种更直观的格式,称为热图。
matplotlib 和 seaborn 都提供了生成这些可视化效果的宝贵工具。让我们使用seaborn 生成一个相关矩阵热图来直观地表示我们的定价相关性。
import seaborn as sns
import matplotlib.pyplot as plt
cmap = sns.diverging_palette(230, 20, as_cmap=True)
sns.heatmap(
data=data.corr(),
linewidths=0.3,
square=True,
cmap=cmap,
vmax=1,
vmin=-1,
center=0,
cbar_kws={"shrink": .75}
)
plt.yticks(rotation=0)
plot.show()
在此热图中,最接近深棕色的值表示更强的正相关性。那些更接近深蓝色的值表示更强的正负相关性。由于相关矩阵中数据组织的性质,存在大量冗余数据。例如,从左上角到右下角对角线上方的每个单元格都是下半部分的重复。我们可以通过在之前的代码中添加掩码来减少这些:
import numpy as np
mask = np.triu(np.ones_like(data.corr(), dtype=bool))
np.fill_diagonal(mask, False)
[[False True True True True]
[False False True True True]
[False False False True True]
[False False False False True]
[False False False False False]]
sns.heatmap(..., mask=mask, ...)
通过从我们的可视化中删除冗余数据,我们创建了一种更高效的技术股相关系数关系表示。从这种映射中获得的见解可以帮助确定在应用程序中应使用哪些特征,例如使用线性回归预测股价或为更复杂的建模设计特征。