均值-方差优化的命门不是优化器,而是协方差矩阵的估计。当你用 100 只股票、250 个交易日(约一年)的数据去估一个 100×100 的协方差矩阵时,你其实只有 250 个独立样本去填 5000 个未知量——结果里绝大部分特征值不是真实风险结构,而是纯粹的抽样噪声。
这不只是学术洁癖:最小方差、风险平价、Black-Litterman、因子风险预算——凡是需要 Σ 的地方,都会被这个噪声污染。一个被噪声放大的协方差,会把组合权重推向毫无经济意义的极端对冲方向,样本外立刻翻车。所以「怎么把 Σ 估得更干净」,是组合优化里性价比最高的一道工序。
这个问题在 1999 年被 Laloux、Cizeau、Potters 与 Bouchaud 用随机矩阵理论(Random Matrix Theory, RMT)一锤定音:一个「全是噪声」的相关矩阵,其特征值谱服从可精确计算的马尔可夫-帕斯特(Marčenko-Pastur, MP)分布。噪声只活在 MP 支撑区间内,真正的风险因子则作为「尖峰」耸立在支撑上界 λ⁺ 之外。本文从零实现这套特征值裁剪降噪,并证明它让组合的样本外风险显著下降。
![样本特征值直方图叠加 MP 理论密度:主体落在 [λ⁻,λ⁺] 区间内(纯噪声),少数尖峰冲破 λ⁺(真实因子)](/images/random-matrix-cov-denoise/rmt_mp.png)
一、为什么样本协方差充满噪声#
设样本相关矩阵 R̂ 来自 T 期、N 个资产的收益。当 T、N 都很大、且比值 q = N/T 固定时,若收益真是独立同分布的高斯噪声,R̂ 的特征值服从 MP 分布,支撑区间为:
import numpy as np
q = N / T
lam_minus = (1 - np.sqrt(q)) ** 2 # MP 下界
lam_plus = (1 + np.sqrt(q)) ** 2 # MP 上界(噪声与信号的分界)python对本文的 N=100, T=250, q=0.40,支撑区间恰好是 [0.135, 2.665]。任何特征值落在这个区间内,都「 indistinguishable from noise(与噪声无法区分)」;只有明显大于 λ⁺ 的尖峰,才承载真实的风险因子信息。
直观理解:MP 分布告诉我们,纯噪声矩阵的特征值不会乱跑,而是密集挤在 [λ⁻, λ⁺] 这条带子里,像个「噪声本底」;而只要有真实因子,它的方差会被「放大」成一个远超 λ⁺ 的尖峰。所以 λ⁺ 不是人为拍的阈值,而是「噪声能爬到的最高点」——尖峰越过它,才说明那里真的有信号。
二、从零实现特征值裁剪降噪#
降噪的核心思想极简:把噪声体里的特征值压平到它们的均值,只保留信号尖峰。
eigvals, eigvecs = np.linalg.eigh(R_hat) # 对称矩阵特征分解
order = np.argsort(eigvals)[::-1]
eigvals, eigvecs = eigvals[order], eigvecs[:, order]
bulk = eigvals <= lam_plus # 噪声体:特征值 ≤ λ⁺
lam_bulk_mean = eigvals[bulk].mean() # 噪声体的平均特征值
eigvals_den = np.where(eigvals > lam_plus, eigvals, lam_bulk_mean) # 裁剪
# 用裁剪后的特征值重构相关矩阵,并重新归一化到单位对角
C_den = eigvecs @ np.diag(eigvals_den) @ eigvecs.T
d = np.sqrt(np.diag(C_den))
C_den = C_den / np.outer(d, d)python这里没有引入任何「主观收缩强度」——分界点 λ⁺ 完全由 N/T 这个样本结构决定,是数据自己告诉你的噪声边界。注意最后一步的重新归一化:裁剪特征值会破坏单位对角,直接得到的矩阵对角线不再是 1;除以 √diag 把它拉回标准相关系数矩阵,否则后续权重计算会失真。

三、降噪到底有没有用:用真值说话#
为了客观评估,我构造了一个已知真值的相关矩阵(10 个共同因子 + 特质噪声),再从中抽 250 期样本得到 R̂,对比三种估计:
- 样本估计
R̂(朴素) - RMT 降噪
C_den - 真值
C_true(上帝视角)

用两个硬指标度量:
- Frobenius 误差
‖估计 − 真值‖_F:样本 6.36 → 降噪 5.27,误差降 17.2%。 - 最小方差组合的 OOS 方差
wᵀ C_true w(用真值协方差评估权重质量):- 样本权重:0.01386
- 降噪权重:0.00838(仅为样本的 60.5%)
- 真值最优:0.00744
降噪后的权重把样本外风险压到了接近真值最优的水平——这正是组合优化最看重的「估计误差管理」。
本例中真实有 10 个因子,降噪后识别出 9 个冲过 λ⁺ 的尖峰,唯有一个弱因子被噪声本底吞没。这恰恰是 RMT 的诚实之处:太弱的因子信号本就难以从有限样本里分辨,强行保留反而引入噪声——它宁可放过个别弱信号,也不愿把噪声当信号。这也是为什么在真实投研里,RMT 常和主成分分析(PCA)配合:冲过 λ⁺ 的尖峰所对应的特征向量,正是你要保留的少数共同风险因子,其余维度尽可视为噪声。


对实务的启示很直接:当你面对高维小样本(例如用一年多日频数据估几十只以上股票的协方差),别直接把样本协方差喂给优化器。先用 RMT 看一眼特征值谱——如果大量特征值挤在 MP 带里、只有少数尖峰,说明你的 Σ 被噪声主导,降噪(或收缩)几乎是必做的一步,否则优化器会把噪声当成信号去对冲,样本外立刻露馅。
四、最小方差权重的直观变化#
样本协方差在噪声方向上极度不确定,最小方差解会把这些不确定方向放大成极端的对冲权重(某些资产权重被推到 ±20% 以上)。降噪后,这些噪声方向被压平,权重回归平滑、向真值最优靠拢——这正是前面「最小方差组合估计误差最敏感」那篇提到的痛点,RMT 是除 Ledoit-Wolf 收缩之外的另一把利器。
五、五类真实陷阱#
- q = N/T 太小则 MP 失效:RMT 是渐近理论(T、N→∞ 且 q 固定)。若
T >> N(如用 10 年日数据估 50 只股票),噪声体很薄、样本已基本可信,降噪收益趋近于零。它的主战场是「高维小样本」(N与T同量级)。 - 只裁剪不旋转会丢结构:本文把噪声特征值设为常数均值,等价于「保留特征向量、只改特征值」。如果你还想进一步去相关结构噪声,可叠加 Ledoit-Wolf 常数相关收缩做二阶处理。
- 高斯假设被肥尾破坏:MP 分布假设 iid 高斯。真实收益有尖峰厚尾,极端日会把特征值整体抬高,使
λ⁺低估、噪声尖峰误判为信号。实务上先用波动率标准化(如 GARCH 残差)再上 RMT 更稳。 - 非平稳性:相关结构会随时间漂移。用滚动窗口做 RMT 时,
λ⁺每期都在变,不能用一个固定阈值套全程。 - 与收缩估计的取舍:RMT 裁剪是「硬阈值」,Ledoit-Wolf 是「软收缩」。前者在因子结构清晰时更 sharp,后者更稳健、不易过切。经验法则:当因子结构清晰、信号尖峰与噪声本底分离明显时,RMT 裁剪更省参数、更利落;当数据极度嘈杂、连尖峰都模糊时,Ledoit-Wolf 的软收缩更不容易过切。两者并非互斥——先 RMT 裁剪剥离噪声本底,再对保留下来的信号子空间做轻度 Ledoit-Wolf 收缩,是实务里常见的两段式处理。
六、结语#
RMT 给量化研究者一个反直觉但有力的提醒:你估出的协方差矩阵里,可能一半以上都是噪声。在因子暴露、风险预算、最小方差、Black-Litterman 任何需要 Σ 的地方,先问一句「我的 N/T 有多大、噪声体有没有被处理」,往往比纠结优化器本身更能决定样本外成败。
注:本文的真值协方差与抽样数据均为合成,用于可复现地演示 RMT 降噪的方法论与效果;真实场景需接入可交易流动性、考虑非平稳与肥尾,并与 Ledoit-Wolf 等收缩估计对照。