相关矩阵

$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, ...)

通过从我们的可视化中删除冗余数据,我们创建了一种更高效的技术股相关系数关系表示。从这种映射中获得的见解可以帮助确定在应用程序中应使用哪些特征,例如使用线性回归预测股价或为更复杂的建模设计特征。