Graphical Lasso 稀疏逆协方差:用 L1 惩罚画出资产间的条件依赖网络
协方差矩阵的逆(精度矩阵)编码的是条件依赖:Θ_ij=0 意味着控制其他所有资产后 i 和 j 无关。但样本逆矩阵永远给你满图——40 资产 126 天数据,真实网络只有 44 条边,样本逆矩阵画出全部 780 条,精确率 6%。Graphical Lasso 在对数似然上加 L1 惩罚直接把弱边压成精确零。本文 40 资产实验:α 扫描的两个最优点并不重合——结构恢复 F1 在 α=0.25 达 0.86,而 GMV 组合样本外波动率在 α=0.15 触底 5.63%(样本协方差 6.48%、Ledoit-Wolf 5.87%、理论最优 5.38%);估计组合两开花是幻觉,选 α 前先想清楚你要图还是要组合。与 LW 收缩的本质区别:LW 均匀缩所有元素但保满图,GLasso 假设图本身稀疏——真实结构确实稀疏时(本实验)GLasso 全程压 LW 一头,T=63 时 5.84% vs 6.00%;结构不稀疏时这个先验会反噬。诚实边界:金融资产共享市场因子,原始收益的条件依赖图并不稀疏,实操应先剥离市场因子再对残差跑 GLasso;α 需要交叉验证(不如 LW 有解析解);非零边的估计值仍有收缩偏差,要图结构可信、要数值精确需二次拟合。
Ledoit-Wolf 收缩和 Marchenko-Pastur 去噪修理的都是协方差矩阵本身。这一篇把镜头转向它的逆——精度矩阵(precision matrix)Θ = Σ⁻¹。这个矩阵在组合优化里无处不在(GMV 权重 w ∝ Θ1),但它还有一层被忽略的语义:Θ 的零元素编码条件独立。
普通相关系数会说”招商银行和贵州茅台相关 0.4”,但这 0.4 里大部分是两者共同暴露于大盘的结果。精度矩阵问的是更尖锐的问题:刨掉所有其他资产的影响后,这两只股票还有没有直接联系? 把非零的 Θ_ij 画成边,你得到一张条件依赖网络——它比相关矩阵稀疏得多、也诚实得多。
问题是:样本协方差的逆永远不会给你这张干净的网络。
样本逆矩阵:永远的满图#
本文实验设定:40 资产、4 板块,真实精度矩阵按板块内链式结构构造——每个板块内部 10 只资产两两相邻条件相关,加少量跨板块桥接边,真实网络共 44 条边(满图 780 条的 5.6%)。由此反解出真实协方差,模拟日收益。
用 T=126 天数据(T/N ≈ 3,可逆但病态)直接求样本协方差的逆:
- 估出 780 条边——满图,精确率 6%
- 真实为零的 736 个位置上,样本逆矩阵全部给出非零值,很多还不小
这不是坏运气,是数学必然:矩阵求逆是全局运算,任何一个元素的采样噪声都会扩散到逆矩阵的所有位置。样本量有限时,逆矩阵的每个元素都是信号和噪声的混合物,精确的零在有限样本下测度为零。

左图是真实部分相关矩阵——四个板块沿对角线整齐排列,链式结构清晰可见。中图是样本逆矩阵——板块结构淹没在噪声里。右图是 Graphical Lasso 的输出——板块链重新浮出水面。
Graphical Lasso:在似然上加 L1#
Friedman、Hastie、Tibshirani(2008)的方案直接把稀疏性写进目标函数:
前两项是高斯对数似然(S 为样本协方差),第三项对 Θ 的元素绝对值求和加惩罚。和 Lasso 回归同款几何:L1 惩罚的角点让弱元素被压成精确的零,而不是缩小到接近零。α 控制稀疏度:α=0 退回样本逆矩阵,α→∞ 只剩对角线(所有资产条件独立)。
from sklearn.covariance import GraphicalLasso
import numpy as np
def fit_glasso(returns, alpha):
"""在相关口径上拟合 GLasso,再缩回协方差口径"""
s = returns.std(axis=0, ddof=1)
X_std = returns / s # 标准化:惩罚对所有资产公平
gl = GraphicalLasso(alpha=alpha, max_iter=800)
gl.fit(X_std)
D, Dinv = np.diag(s), np.diag(1.0 / s)
cov = D @ gl.covariance_ @ D # 缩回原口径
prec = Dinv @ gl.precision_ @ Dinv
return cov, prec
def partial_corr(P):
"""精度矩阵 → 部分相关矩阵(可读的网络权重)"""
d = np.sqrt(np.diag(P))
R = -P / np.outer(d, d)
np.fill_diagonal(R, 1.0)
return Rpython一个必须遵守的工程细节写在注释里了:在相关口径(标准化收益)上拟合。不同资产波动率差几倍,直接在协方差口径上加统一的 α,等于对低波动资产的边重罚、对高波动资产的边轻罚——惩罚就不公平了。这和 MP 去噪必须在相关口径裁剪是同一条纪律。

网络图更直观:左边真实网络 44 条边,四个板块各自成链。中间样本逆矩阵即使卡 |ρ|>0.05 的阈值仍有 531 条边——事后卡阈值救不了满图,因为噪声边和真实弱边的幅度混在同一个区间。右边 GLasso(α=0.08)241 条边,仍偏密但板块骨架已经浮现。
α 扫描:两个最优点不重合#
α 是 GLasso 的命门。16 次蒙特卡洛、9 档 α 的扫描给出这篇文章最重要的一张图:

左图看结构恢复:边数从 α=0.002 的 758 条单调降到 α=0.4 的 24 条,穿过真实值 44 条;F1 分数(精确率与召回的调和平均)在 α=0.25 达到峰值 0.86——此时估出的边数恰好在真实边数附近。
右图看组合表现:把 GLasso 估计的协方差喂给最小方差优化器,用真实协方差评估样本外波动率。U 形曲线在 α=0.15 触底 5.63%——好于样本协方差(6.48%)和 Ledoit-Wolf(5.87%),距理论最优(5.38%)一步之遥。
注意两个最优点不重合:组合表现最优的 α=0.15 对应约 112 条边——是真实边数的 2.5 倍。原因不难理解:组合优化在乎的是 Σ⁻¹1 这个方向的精度,多保留一些弱边带来的方差损失,小于砍掉真实弱边带来的偏差损失;而 F1 对多余的边毫不留情。你要一张干净的图,还是一个稳的组合,α 的选法不一样——把两者混为一谈是这个工具最常见的误用。
与 Ledoit-Wolf 正面对决:先验对了才赢#
GLasso 和 LW 收缩都是正则化,区别在先验的形状:LW 说”所有元素都往结构化目标拉一点”,保满图;GLasso 说”图本身是稀疏的”,直接杀边。当真实结构确实稀疏时(本实验的设定),更强的先验换来更多的正则化收益:

| 估计窗口 | 样本协方差 | Ledoit-Wolf | Graphical Lasso |
|---|---|---|---|
| T=63 | 8.60% | 6.00% | 5.84% |
| T=126 | 6.43% | 5.83% | 5.65% |
| T=252 | 5.83% | 5.67% | 5.52% |
| T=1008 | 5.49% | 5.49% | 5.43% |
(GMV 组合样本外真实波动率,理论最优 5.38%,α 随 T 按 0.08·√(126/T) 衰减)
GLasso 全程压 LW 一头,且数据越少优势越大——T=63 时样本协方差已经病入膏肓(8.60%),LW 拉回 6.00%,GLasso 再进一步到 5.84%。到 T=1008 三者合流,正则化集体退场,这个剧本和收缩、MP 去噪一模一样。
但必须立刻泼冷水:这是真实图确实稀疏时的成绩单。本实验的数据生成过程就是稀疏图,GLasso 的先验完全命中。真实市场的原始收益不满足这个条件——所有资产共享市场因子,导致条件依赖图接近满图,稀疏先验直接错配。实操的正确姿势是先剥离共同因子,再对残差跑 GLasso:
# 一因子剥离:对市场收益回归,取残差
betas = np.array([np.polyfit(mkt_ret, returns[:, i], 1)[0]
for i in range(N)])
residuals = returns - np.outer(mkt_ret, betas)
cov_resid, prec_resid = fit_glasso(residuals, alpha=0.1)
# 残差网络:板块/供应链/竞争关系等真正的"直接联系"python剥掉市场因子后,剩下的条件依赖才是板块、供应链、竞争关系这些真正稀疏的结构——这也是 GLasso 在统计套利里的标准用法:残差网络里的边就是配对交易的候选对。
A. 实现细节#
信号与数据:40 资产合成市场,真实精度矩阵按 4 板块链式结构构造(44 条真实边),由多元正态模拟日收益,无自相关。GLasso 用 sklearn 的坐标下降实现,在相关口径拟合后缩回协方差口径;边的判定阈值为部分相关 |ρ|>10⁻⁴(L1 产生精确零,阈值仅防数值毛刺)。组合评估:各估计器的协方差解无约束 GMV(允许做空),用真实协方差算组合真实波动率,16 次蒙特卡洛取中位数。α 扫描固定 T=126;跨 T 对比时 α 按 √(126/T) 缩放以近似最优衰减。
B. 已知偏差#
先验命中是本实验最大的”作弊”:数据由稀疏图生成,GLasso 先验完全正确,实测优势是上界而非典型值。真实市场原始收益的条件依赖图不稀疏,直接套用会错配,必须先做因子剥离——而剥离用的因子模型本身又引入新的设定误差。α 无解析解:LW 的 δ* 从数据直接算,GLasso 的 α 要交叉验证,验证目标(似然 or 组合波动率 or 图稳定性)不同选出的 α 也不同,本文展示的两峰分离就是证据。非零边的数值有收缩偏差:L1 在杀零的同时也把幸存的边往零压,要无偏数值需在选出的图上做二次无惩罚拟合(relaxed lasso)。高斯似然假设对厚尾收益的稳健性未在本实验检验。
C. 结果解读#
结论一:样本逆矩阵不可能给出条件依赖结构,满图是数学必然而非数据问题。 780 条边、6% 精确率,事后卡阈值也只能砍到 531 条——去噪必须发生在估计阶段,不能等到解读阶段。
结论二:要图还是要组合,α 的最优选择差近一倍。 F1 峰值在 α=0.25(边数≈真实值),组合波动率谷底在 α=0.15(边数≈真实值 2.5 倍)。组合优化偏爱稍密的图,结构解读需要更狠的惩罚——一套参数走天下会两头不讨好。
结论三:稀疏先验命中时全程优于均匀收缩,但赢的幅度递减。 T=63 时 GLasso 比 LW 低 0.16 个百分点,T=252 只剩 0.15,T=1008 剩 0.06——和所有正则化一样,它是小样本的药,不是永动机。真实图不稀疏时这个先验会反噬,实操前先问一句:我的数据剥干净共同因子了吗?
结论四:GLasso 的真正独门价值不在组合波动率,在网络本身。 与 LW 五五开的波动率改善随处可得,但”控制全市场后哪两只资产仍直接相连”这个信息只有稀疏精度矩阵给得出——配对交易选对、风险传染路径分析、板块划分校验,才是它不可替代的场景。