跳到正文

协方差矩阵与相关矩阵

协方差和相关矩阵总结了资产收益如何共同运动。协方差矩阵是现代投资组合理论和风险管理的基础。

第 5 篇 · 共 6 篇 约 4 分钟

协方差:衡量变量如何共同运动

给定两个随机变量 XX 和 YY,均值分别为 μX\mu_X 和 μY\mu_Y,协方差衡量它们是否倾向于同向运动:

Cov(X,Y)=E[(X−μX)(Y−μY)]\text{Cov}(X, Y) = \mathbb{E}[(X - \mu_X)(Y - \mu_Y)]

当 XX 高于其均值且 YY 也高于其均值时,乘积 (X−μX)(Y−μY)(X - \mu_X)(Y - \mu_Y) 为正,协方差增大。当一个高于均值而另一个低于均值时,乘积为负,协方差减小。如果知道 XX 的位置无法告诉你关于 YY 位置的任何信息,正负乘积会相互抵消,协方差接近零。

协方差的一个局限性是它依赖于 XX 和 YY 的单位。如果 XX 以美元衡量,YY 以基点衡量,协方差的大小反映了这些任意刻度。

相关性:归一化的协方差

相关性通过将协方差归一化到 -1 到 +1 的范围来解决这个问题:

Corr(X,Y)=Cov(X,Y)σXσY\text{Corr}(X, Y) = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y}

相关性为 +1+1 意味着完全正同向运动——XX 和 YY 完全对齐。相关性为 −1-1 意味着完全反向运动。接近 00 的相关性意味着没有线性关系。

因为相关性是无量纲的,它比协方差更容易解释。无论你以百分比还是基点衡量收益率,两项资产之间 0.7 的相关性告诉你它们实质性同向运动。

协方差矩阵

当你有 nn 个资产时,协方差矩阵 Σ\mathbf{\Sigma} 将所有方差和协方差组织在一个结构中:

Σ=[σ12Cov12Cov13⋯Cov21σ22Cov23⋯Cov31Cov32σ32⋯⋮⋮⋮⋱]\mathbf{\Sigma} = \begin{bmatrix} \sigma_1^2 & \text{Cov}_{12} & \text{Cov}_{13} & \cdots \\ \text{Cov}_{21} & \sigma_2^2 & \text{Cov}_{23} & \cdots \\ \text{Cov}_{31} & \text{Cov}_{32} & \sigma_3^2 & \cdots \\ \vdots & \vdots & \vdots & \ddots \end{bmatrix}

对角线条目是单个资产的方差。非对角线条目是资产对之间的协方差。

相关矩阵是归一化版本——每个对角线条目为 1(资产与自身完全相关),每个非对角线条目是一对资产之间的相关性:

Corrij=Σijσiσj\text{Corr}_{ij} = \frac{\Sigma_{ij}}{\sigma_i \sigma_j}

必需的性质:对称性与半正定性

有效的协方差矩阵有两个不可或缺的性质。

对称性: Σij=Σji\Sigma_{ij} = \Sigma_{ji}。协方差按定义是对称的——资产 ii 与资产 jj 之间的协方差与 jj 和 ii 之间的协方差相同。

半正定性: Σ\mathbf{\Sigma} 的所有特征值大于或等于零。具有负特征值的协方差矩阵意味着具有负方差的投资组合——这不可能。你可以用 Python 验证:

import numpy as np

Sigma = np.array([[1.0, 0.5, 0.2],
                  [0.5, 1.0, 0.3],
                  [0.2, 0.3, 1.0]])

eigenvalues = np.linalg.eigvalsh(Sigma)
print("特征值:", eigenvalues)
print("全部非负:", np.all(eigenvalues >= 0))

提示词

用 numpy.linalg.eigvalsh 算一个 3×3 对称矩阵的特征值,验证它们都非负。

以 Σ=1T−1X⊤X\mathbf{\Sigma} = \frac{1}{T-1}\mathbf{X}^\top \mathbf{X} 形式构造的协方差矩阵通过构造就是半正定的,因为对任意向量 w\mathbf{w},

w⊤Σw  =  1T−1 w⊤X⊤Xw  =  1T−1∥Xw∥2  ≥  0.\mathbf{w}^\top \mathbf{\Sigma} \mathbf{w} \;=\; \frac{1}{T-1}\,\mathbf{w}^\top \mathbf{X}^\top \mathbf{X} \mathbf{w} \;=\; \frac{1}{T-1}\|\mathbf{X}\mathbf{w}\|^2 \;\geq\; 0.

这无论你是否减去列均值都成立:中心化把 X\mathbf{X} 变成 Xc\mathbf{X}_c,但 Xc⊤Xc=X⊤X−Txˉxˉ⊤⪰X⊤X\mathbf{X}_c^\top \mathbf{X}_c = \mathbf{X}^\top \mathbf{X} - T\bar{x}\bar{x}^\top \succeq \mathbf{X}^\top \mathbf{X} 仍是半正定的,依据同样的论证(它是两个半正定矩阵之和)。中心化影响特征值的数值以及对角线的解释(方差 vs. 二阶矩),但不影响 PSD 性质。估计噪声、样本量和分母选择也不会使 PSD 失效,约束 X⊤X/(T−1)⪰0\mathbf{X}^\top\mathbf{X}/(T-1) \succeq 0 是纯代数的。

因此,如果你实际计算 X⊤X/(T−1)\mathbf{X}^\top\mathbf{X}/(T-1) 并观察到负特征值,原因不是统计性的;原因是数值性的:浮点误差跨行累积,或构造本身存在错误(比如混入了未中心化的交叉积、用了不同的分母,或代入了一个不具有该代数形式的无效相关性/协方差估计)。

用 Python 计算

import numpy as np
import pandas as pd


np.random.seed(42)
returns = pd.DataFrame({
    "AAPL": np.random.randn(252) * 0.02 + 0.001,
    "MSFT": np.random.randn(252) * 0.018 + 0.0008,
    "GOOG": np.random.randn(252) * 0.025 + 0.0012,
    "AMZN": np.random.randn(252) * 0.022 + 0.001
})

# 协方差矩阵(年化——日方差 * 252)
cov_matrix = returns.cov() * 252
print("年化协方差矩阵:\n", cov_matrix)

# 相关矩阵
corr_matrix = returns.corr()
print("\n相关矩阵:\n", corr_matrix)

# 手动验证
std = returns.std() * np.sqrt(252)
manual_corr = cov_matrix / np.outer(std, std)
print("\n手动计算的相关性(应匹配):\n", manual_corr)

提示词

用 pandas 模拟 4 个资产 252 天的收益率,算年化协方差矩阵、相关矩阵,手动验证一下。

通过矩阵代数计算投资组合方差

现代投资组合理论用矩阵简洁地表达投资组合方差。给定投资组合权重向量 w\mathbf{w} 和协方差矩阵 Σ\mathbf{\Sigma}:

σp2=w⊤Σw\sigma_p^2 = \mathbf{w}^\top \mathbf{\Sigma} \mathbf{w}

这个标量输出是所有成对协方差的加权和,其中每个权重积 wiwjw_i w_j 乘以资产 ii 和 jj 之间的协方差。

import numpy as np

# 四个资产,协方差矩阵(年化)
Sigma = np.array([[0.0400, 0.0180, 0.0120, 0.0150],
                  [0.0180, 0.0324, 0.0140, 0.0160],
                  [0.0120, 0.0140, 0.0625, 0.0200],
                  [0.0150, 0.0160, 0.0200, 0.0484]])

# 等权重
w = np.array([0.25, 0.25, 0.25, 0.25])

# 投资组合方差
port_var = w @ Sigma @ w
port_std = np.sqrt(port_var)
print(f"投资组合方差: {port_var:.6f}")
print(f"投资组合标准差: {port_std:.4f} ({port_std*100:.2f}%)")

提示词

用 numpy 算一个等权重 4 资产组合的方差:矩阵乘法 w @ Σ @ w,再开根号得到标准差,打印出来。

小 nn、大 pp 问题

当资产数量 nn 大于观测数量 TT 时,会出现一个严重的实际问题。样本协方差矩阵 S=1T−1Rc⊤Rc\mathbf{S} = \frac{1}{T-1}\mathbf{R}_c^\top\mathbf{R}_c(其中 Rc\mathbf{R}_c 是中心化收益矩阵,每列的均值已从每个元素中减去)就是奇异的——它没有逆矩阵,特征值包含零。

对于 500 个资产仅有 252 天的数据,样本协方差矩阵基本上不可靠。许多正则化技术可以解决这个问题:向结构化目标(如常数相关性或单因子模型)收缩、因子的协方差估计,或使用随机矩阵理论过滤噪声。

这就是 PCA 重要的原因之一——通过将 nn 个资产降维到 kk 个主成分,你大大减少了要估计的参数数量,并回避了奇异性问题。

参考文献

Ruppert, Statistics and Data Analysis for Financial Engineering, 2nd edition, Springer, Chapter 3. ISBN: 978-1493926134.

Markowitz, “Portfolio Selection,” The Journal of Finance, 7(1): 77–91, 1952.