先说结论:100 只资产、120 天数据,用样本协方差直接求最小方差组合,真实(样本外)年化波动率 23.0%——比等权组合的 19.8% 还差,总杠杆冲到 6.1 倍;同一份数据换成 Ledoit-Wolf 收缩估计,真实波动率降到 12.0%,总杠杆 2.9 倍,离理论最优的 9.6% 只差一段。而这一切不需要调任何参数:LW 的最优收缩强度 δ 是从数据里解析算出来的,T=60 时它自动收缩 0.61,T=1008 时自动降到 0.07。* 一句话总结这个方法:样本协方差是无偏但高方差的估计,结构化目标是有偏但零方差的估计,Ledoit-Wolf 给出了两者加权平均的最优权重公式——这是量化组合构建里性价比最高的一次免费午餐。
样本协方差坏在哪:不是不准,是”系统性地歪”#
样本协方差矩阵 是无偏估计,每个元素单独看都没问题。问题出在同时估 个参数:N=100 时是 5050 个参数,而 T=120 天只有 12000 个数据点,平均每个参数摊不到 3 个观测。
估计误差在特征值上的表现有明确的方向性:大特征值被系统性高估,小特征值被系统性低估。这不是随机噪声,是数学结构——样本特征值是真实特征值的”扩散”版本(随机矩阵理论中的 Marchenko-Pastur 定律给出了精确刻画)。
import numpy as np
def make_true_cov(N, seed=1):
"""单因子 + 特质波动的真实协方差(年化)"""
r = np.random.default_rng(seed)
beta = r.normal(1.0, 0.3, N)
idio = r.uniform(0.15, 0.45, N)**2
return 0.20**2 * np.outer(beta, beta) + np.diag(idio)
N, T = 100, 120
Sigma_true = make_true_cov(N)
rng = np.random.default_rng(42)
X = rng.multivariate_normal(np.zeros(N), Sigma_true / 252, size=T)
S_sample = np.cov(X, rowvar=False) * 252
ev_true = np.sort(np.linalg.eigvalsh(Sigma_true))[::-1]
ev_samp = np.sort(np.linalg.eigvalsh(S_sample))[::-1]python
图里黑线是真实协方差的特征值谱,红虚线是样本估计:头部被抬高,尾部被压扁到接近零。这对组合优化是致命的,因为最小方差优化器用的是协方差的逆——它会把最大的权重压在最小的特征值方向上,而那些方向恰恰是被低估最狠、噪声最大的方向。优化器不是在优化,是在放大估计误差。Michaud 给这个现象起过一个著名的名字:均值方差优化是”误差最大化器”。
Ledoit-Wolf 的答案:解析最优的加权平均#
Ledoit 和 Wolf(2004)的想法直白到近乎朴素。取两个极端:
- 样本协方差 :无偏,但 N 大 T 小时方差巨大;
- 结构化目标 :比如”常相关模型”(所有资产对共享同一个平均相关系数,方差用各自的样本方差),只有 N+1 个参数,几乎没有估计方差,但显然有偏。
收缩估计就是加权平均:
关键贡献不是这个形式(贝叶斯统计里到处都是),而是δ 的解析解。最优 δ* 最小化 ,Ledoit-Wolf 证明它约等于:
三个量全部可以从数据算出来: 是样本协方差各元素的估计方差之和(S 有多不稳), 是 S 与 F 估计误差的协方差(两者错得有多同步), 是 S 与 F 的距离平方(目标有多偏)。直觉完全对得上:S 越不稳收缩越狠(π 大 → δ 大),F 偏得越离谱收缩越轻(γ 大 → δ 小),数据越多越信 S(1/T 衰减)。
def lw_shrink(X):
"""Ledoit-Wolf 收缩到常相关目标,返回 (Sigma_hat, delta)"""
T, N = X.shape
Xc = X - X.mean(0)
S = Xc.T @ Xc / T
var = np.diag(S).copy()
sd = np.sqrt(var)
corr = S / np.outer(sd, sd)
rbar = (corr.sum() - N) / (N * (N - 1)) # 平均相关系数
F = rbar * np.outer(sd, sd) # 常相关目标
np.fill_diagonal(F, var)
Y = Xc**2
phi_mat = (Y.T @ Y) / T - S**2 # pi: S 各元素的渐近方差
pi_hat = phi_mat.sum()
theta = ((Xc**3).T @ Xc) / T - var[:, None] * S
term = (np.outer(1/sd, sd) * theta + np.outer(sd, 1/sd) * theta.T) / 2
rho_hat = np.diag(phi_mat).sum() + rbar * (term.sum() - np.trace(term))
gamma_hat = np.linalg.norm(S - F, 'fro')**2
delta = max(0.0, min(1.0, (pi_hat - rho_hat) / gamma_hat / T))
return delta * F + (1 - delta) * S, deltapython在上面 T=120、N=100 的数据上,算出来的 δ* = 0.45——数据自己说”我有 45% 不可信,往结构上靠”。图 1 的蓝线显示收缩后的特征值谱:头部压下来,尾部抬上去,整体形状明显更贴近黑线。
效果检验:最小方差组合的真实波动率#
方法好不好,不看矩阵范数,看组合。实验设计:真实协方差固定,模拟 T 天数据 → 估计协方差 → 求全局最小方差(GMV)权重 → 用真实协方差评估这个权重的实际波动率。每个 T 重复 60 次取中位数:
| 估计窗口 T | 样本协方差 GMV | Ledoit-Wolf GMV |
|---|---|---|
| 60 天 | 16.3%* | 13.0% |
| 90 天 | 29.1% | 12.5% |
| 120 天 | 23.0% | 12.0% |
| 180 天 | 14.5% | 11.6% |
| 252 天 | 12.5% | 11.3% |
| 504 天 | 10.7% | 10.6% |
| 1008 天 | 10.1% | 10.1% |
理论最优(真实协方差的 GMV)是 9.6%,等权组合是 19.8%。*T=60 时样本协方差奇异,数值上靠微小 ridge 才能求逆,结果反而比 T=90 的”刚好可逆但病态到极点”要好——T 略大于 N 是样本协方差最危险的区域,T=90 和 T=120 的组合波动率(29.1%、23.0%)比等权还差,优化优了个寂寞。

三个观察:
- LW 全程压制样本协方差,在 T 与 N 同数量级时优势最大(T=90 时 12.5% vs 29.1%,砍掉一半还多);
- T 足够大时两者收敛(T=1008 时都是 10.1%)——收缩是小样本的药,数据充足时 δ* 自动趋近 0,不碍事;
- 样本协方差的 GMV 可以比不优化更差,这是”误差最大化”的直接证据。
δ* 的自适应性与权重的驯化#
δ* 随样本量的变化本身就是一张很好的说明书:

左图:T=60 时 δ*=0.61,T=252 时 0.24,T=1008 时 0.07——收缩强度自动随数据量衰减,不需要人为设定,也不需要交叉验证。右图对比 T=120 时的 GMV 权重:样本协方差给出 -23.7% 到 +25.8% 的巨额多空、总杠杆 6.1 倍;LW 权重被压到 -5.4% 到 +21.9%、总杠杆 2.9 倍。收缩协方差 = 隐式的权重正则化,这比事后给权重加箱式约束更有原则——它修的是病根(估计误差),不是症状(极端权重)。
实践备注#
目标矩阵的选择。本文用常相关目标(Ledoit-Wolf 2004 “Honey, I Shrunk the Sample Covariance Matrix” 的版本),另外两个常用目标是单位阵的倍数(sklearn.covariance.LedoitWolf 的实现,适合无先验结构的场景)和单因子市场模型(Ledoit-Wolf 2003,适合股票组合)。经验上股票组合用常相关或单因子目标好于单位阵目标,因为后者连”股票之间普遍正相关”这条最基本的结构都没编码。
与后续方法的关系。线性收缩把所有特征值往同一个方向拉同样的比例,2017 年之后 Ledoit-Wolf 又发展了非线性收缩(每个特征值有自己的修正量,QIS/QuEST 估计量),N 数百以上时增益明显。但线性收缩仍是默认起点:解析解、零超参、几行代码,且在 N≤200 的常见场景下与非线性版本差距很小。
收缩的不是相关结构本身。LW 假设 iid 样本,它修的是采样误差,不修时变性——2020 年 3 月那种相关性整体跳升的 regime 切换,收缩估计和样本估计一样跟不上。时变问题要交给 EWMA 或 DCC-GARCH,两者与收缩可以叠加使用(先 EWMA 加权再收缩)。
已知偏差:本文用单因子结构合成数据,真实市场的协方差有行业块结构和厚尾,δ* 的具体数值会不同,但”样本协方差在 T≈N 时爆炸、LW 稳定”的定性结论对结构不敏感;GMV 实验只看了波动率最小化,带收益预测的均值方差优化里,期望收益的估计误差比协方差更致命(这是另一篇文章的主题——Michaud 重抽样与 Bayes-Stein 收缩)。
一句话带走:协方差矩阵不要直接用样本估计喂给优化器——先收缩。δ 不用你选,数据自己会说要收多少。