协方差矩阵与相关矩阵
协方差和相关矩阵总结了资产收益如何共同运动。协方差矩阵是现代投资组合理论和风险管理的基础。
协方差:衡量变量如何共同运动
给定两个随机变量 和 ,均值分别为 和 ,协方差衡量它们是否倾向于同向运动:
当 高于其均值且 也高于其均值时,乘积 为正,协方差增大。当一个高于均值而另一个低于均值时,乘积为负,协方差减小。如果知道 的位置无法告诉你关于 位置的任何信息,正负乘积会相互抵消,协方差接近零。
协方差的一个局限性是它依赖于 和 的单位。如果 以美元衡量, 以基点衡量,协方差的大小反映了这些任意刻度。
相关性:归一化的协方差
相关性通过将协方差归一化到 -1 到 +1 的范围来解决这个问题:
相关性为 意味着完全正同向运动—— 和 完全对齐。相关性为 意味着完全反向运动。接近 的相关性意味着没有线性关系。
因为相关性是无量纲的,它比协方差更容易解释。无论你以百分比还是基点衡量收益率,两项资产之间 0.7 的相关性告诉你它们实质性同向运动。
协方差矩阵
当你有 个资产时,协方差矩阵 将所有方差和协方差组织在一个结构中:
对角线条目是单个资产的方差。非对角线条目是资产对之间的协方差。
相关矩阵是归一化版本——每个对角线条目为 1(资产与自身完全相关),每个非对角线条目是一对资产之间的相关性:
必需的性质:对称性与半正定性
有效的协方差矩阵有两个不可或缺的性质。
对称性: 。协方差按定义是对称的——资产 与资产 之间的协方差与 和 之间的协方差相同。
半正定性: 的所有特征值大于或等于零。具有负特征值的协方差矩阵意味着具有负方差的投资组合——这不可能。你可以用 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 对称矩阵的特征值,验证它们都非负。
以 形式构造的协方差矩阵通过构造就是半正定的,因为对任意向量 ,
这无论你是否减去列均值都成立:中心化把 变成 ,但 仍是半正定的,依据同样的论证(它是两个半正定矩阵之和)。中心化影响特征值的数值以及对角线的解释(方差 vs. 二阶矩),但不影响 PSD 性质。估计噪声、样本量和分母选择也不会使 PSD 失效,约束 是纯代数的。
因此,如果你实际计算 并观察到负特征值,原因不是统计性的;原因是数值性的:浮点误差跨行累积,或构造本身存在错误(比如混入了未中心化的交叉积、用了不同的分母,或代入了一个不具有该代数形式的无效相关性/协方差估计)。
用 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 天的收益率,算年化协方差矩阵、相关矩阵,手动验证一下。
通过矩阵代数计算投资组合方差
现代投资组合理论用矩阵简洁地表达投资组合方差。给定投资组合权重向量 和协方差矩阵 :
这个标量输出是所有成对协方差的加权和,其中每个权重积 乘以资产 和 之间的协方差。
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,再开根号得到标准差,打印出来。
小 、大 问题
当资产数量 大于观测数量 时,会出现一个严重的实际问题。样本协方差矩阵 (其中 是中心化收益矩阵,每列的均值已从每个元素中减去)就是奇异的——它没有逆矩阵,特征值包含零。
对于 500 个资产仅有 252 天的数据,样本协方差矩阵基本上不可靠。许多正则化技术可以解决这个问题:向结构化目标(如常数相关性或单因子模型)收缩、因子的协方差估计,或使用随机矩阵理论过滤噪声。
这就是 PCA 重要的原因之一——通过将 个资产降维到 个主成分,你大大减少了要估计的参数数量,并回避了奇异性问题。
参考文献
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.