使用 AdaptGrow (一种 GPU 加速的矩阵分解算法) 将滚动相关性和尾依赖性矩阵转换为硬集群、软因子负载以及单 GPU 和多节点规模的结构化中断信号
量化策略通常将工具组合在一起,用于投资组合构建、风险聚合、统计套利和交易监控。错误的分组可能会使集中的位置看起来多样化,跨名义边界共享模糊的风险,并选择在压力下关系失败的统计 – 套利对。
实际困难在于,正确的分组既不可直接观察,也不稳定。因子暴露漂移、工具更改分类,并且依赖项可能会在市场压力期间急剧变化。因此,聚类工作流必须将常规变化与结构变化分离开来,并且成本足够低,可以在新收益到来时重新运行。
从依赖矩阵中将仪器分组的常用方法有两种。硬聚类方法的计算成本很低,但将每个工具分配给一个组,这将按行业边界进行分解,并掩盖了对风险预算至关重要的分级风险。像 SymNMF 这样的软分解方法可以处理边界仪器并生成可用的因子负载,但其稠密矩阵目标过去仅用于控制仪器数量,而非用于控制此问题实际存在的规模。
本文将介绍解决这两种限制的工作流程。该工作流从滚动返回窗口开始,并构建两个互补输入:用于宽协同移动的绝对 Pearson 相关和用于极端观测期间关节行为的尾对依赖矩阵 (TPDM) 。SymNMF 通过一行非负因子加载来表示每个仪器。保留该行可提供软表示;取其参数最大值会生成硬标记。
高效利用内存的 SymNMF 公式可将存储峰值从 ~20n2 减少到 ~4n2 字节,这正是 ~100000 个仪器适合单个 NVIDIA GB200 的原因。对于更大的问题,分布式实现行 – 分片依赖矩阵,并将通信减少到 O (nk) 而不是 O (n2) ,从而能够跨 16 个节点分解 100 万个仪器。单个自适应求解器 AdaptGrow 通过读取本征谱来选择全批次和块随机梯度,从而处理相关性和尾依赖性输入,无需为不同的输入结构选择或调整单独的求解器。
其结果是聚类工作流,可生成硬标记、软因子加载和结构中断信号,在新收益到来时以较低的成本重新运行,并在不改变求解器接口的情况下从单个 GPU 扩展到多节点基础设施。
以下链接的配套 Notebook 可实现完整工作流,并再现本文中的所有结果。
大规模分解
规模首先受内存限制。密集的 FP32 依赖矩阵对于 100000 台仪器大约需要 40 GB,对于 100 万台仪器大约需要 4 TB。原生 SymNMF 实现还可实现多个额外的 n x n 个中间体。此处使用的基于追踪的公式可以消除这些中间体,从而将估计的峰值存储从大约 20n2 字节减少到 4n2 字节,再加上更小的因子缓冲区。正是这种变化使得大约 10 万台仪器可以安装在一个高显存 GPU 上。
NVIDIA 加速进入管道的每个阶段。PyTorch 将主要的 SH 矩阵乘法运算分配到 cuBLAS。cuSOLVER 执行用于选择秩和解算器的频谱探针。cuDF 在 GPU 上保留可选的 Parquet 提取和预处理功能。为实现横向扩展,PyTorch 分布式行分片会对 S 进行处理,同时在每个工作节点上保留 H 的副本。NCCL 会收集行分片的 S H 乘积并降低梯度,因此通信基于 O (nk) 数据而非完整的 O (n2) 矩阵进行操作。该环境与 NVIDIA NGC PyTorch 容器和 cudf-cu13 打包在一起。
在配套论文中,100000 个仪器矩阵分布在四个 NVIDIA GB200 GPU 上,以加快执行速度,尽管其 40 GB 输入适合一个 GB200。在 FP32 的三个种子中,AdaptGrow 在相关性方面只需 13.0 秒,在 TPDM 方面则需 12.4 秒。在 100 万台仪器上,4 TB 矩阵在 16 个节点上的 64 个 GB200 GPU 上进行行分片;全批次 AdaGrad 在大约 2 分钟内完成了相关分解,而 AdaptGrow 在大约 4 分钟内完成了 TPDM 分解。这些是单独的分解测量,而不是所有 250 个时序窗口的端到端计时。
临时设置
该工作流评估 250 个滚动窗口,近似于在一个交易年内每天重新聚类。合成返回流包含两个受控事件:仪器改变其种植组成员,以及几个组在不改变成员的情况下经历关节尾部压力发作。
这种受控设置可验证两种不同的行为。调整后的兰特指数 (ARI) 应能识别成员变化,而 TPDM 应能揭示普通相关性在很大程度上无法忽略的协同崩溃。对于生产使用,将合成生成器替换为返回表,同时保留相同的窗口、依赖估计、分解和监控阶段。
百万仪器结果是单独的分布式扩展测试,需要与已发布的 16 个节点配置相美的基础架构。
选择等级 k
首先,检查初始代表性窗口中的前置特征值。选择信号特征值和噪声本底之间最清晰分离的 k,然后在后续窗口中保持 k 不变,以便稳定性得分保持可比性。此处使用的合成数据的种植秩为 24。生产数据可能不包含明显的差距,因此还应根据集群的可解释性和稳定性来检查秩选择。

使用 SymNMF 进行分解
对于每个滚动窗口,工作流都会将依赖矩阵 S 和选定的秩 k 传递给 AdaptGrow。求解器返回 H,其中 H 的每一行都包含仪器的软因子负载,而取行级参数最大值则会生成硬集群标签。
每个窗口都使用相同的固定种子初始化,并且独立拟合,而非热启动,从而防止之前的标签屏蔽真正的重新分类。AdaptGrow 是单个自适应求解器,可根据矩阵的特征值频谱自动配置。这两种机制使用相同的每坐标 AdaGrad 预处理器,并且仅在梯度计算方式方面有所不同。AdaptGrow 将其批量分数从秩后特征值差距中种子出来,详见下文。
通过“clean gap” (清理间隙) 选择完整的梯度。扁平化的秩后频谱首先使用随机方差降低梯度 (SVRG) 校正成本较低的块采样梯度,然后在进度停止时将样本扩展到完整梯度。从一个 GPU 到多个 GPU,同一个求解器的运行方式都保持不变。
在数学上,对角线 AdaGrad 更新定义为:
\(G \leftarrow G + g \odot g\)
\(H \leftarrow \max \left(H – \eta \cdot g / (\sqrt{G} + \varepsilon), \; 0\right)\)
其中 g 是全梯度 ∇f(H)(全批量分支) 或其块采样估计值 (随机分支) ,以上所有运算均按元素进行。
为什么使用此求解器
选择分解秩 k 后,AdaptGrow 会检查秩后差距比 \(\gamma_{k+1} = \lambda_{k+1} / |\lambda_{k+2}|\)。额外的特征值允许使用一个共同的因素,例如市场因素和组层面的因素。在配套实验中,较大的秩后差距对应于较短的相关性矩阵运行,而全批量 AdaGrad 最有效。扁平化频谱对应更长的 TPDM 运行,其中低成本的块采样梯度更有用。因此,当差距较小时,AdaptGrow 从采样的 SVRG 更新开始,当进度停止时,将采样分数增加到完整矩阵。这里使用的 5 的值是这些实验的经验设置,而不是通用的统计截止值。AdaptGrow 算法草图:
# phi is seeded from the post-rank eigenvalue gap:
# gamma_{k+1} >= 5 selects the full gradient; otherwise start sampled
def adaptgrow(S, k, lr, phi=None, steps=2000, eps=1e-8):
phi = phi if phi is not None else seed_from_eigenspectrum(S, k)
# fixed-seed init, independent per window (no warm-start)
H = scale_matched_init(S, k)
# diagonal (per-coordinate) AdaGrad accumulator
G = torch.zeros_like(H)
for t in range(steps):
# clean post-rank gap
if phi >= 1.0:
g = 4 * (H @ (H.T @ H) - S @ H)
# flat post-rank spectrum
else:
g = block_svrg_grad(S, H, phi)
# same diagonal AdaGrad update either way
G += g * g
# projected step
H = (H - lr * g / (G.sqrt() + eps)).clamp_min(0)
# grow sampled fraction toward full gradient
if stagnating() and phi < 1.0:
phi = min(2 * phi, 1.0)
return H
用于直接硬聚类的球形 K 均值
当每个仪器只需要一个标签时,球形 k-means 可提供成本更低的基准。它使用余弦相似性对 S 的 L2 标准化行进行聚类,从而在此依赖几何图形上适当比较 SymNMF。配套论文建立了这两个目标之间的正式关系。在实践中,当软因子加载或边界仪器很重要时,请为良好分离的硬集群和 SymNMF 使用球形 K 均值。
使用 Rand 指数跟踪稳定性
相同的工作流在两个依赖矩阵上运行,这两个矩阵共享隐结构,但测量不同的东西:
- 相关性在数据主体的驱动下,捕捉整个返回分布中的协同移动。
- TPDM 会根据极端事件捕捉协同移动,这正是造成关节收缩和关节尾部风险的原因。
在 k 为固定且每个窗口均独立分解的情况下,研究很简单:通过 H 上的 argmax 对每个 St 进行分解,并询问标签在窗口滑动时的变化情况。
指标
由于集群标签在不同运行之间是任意的,因此我们改为比较仪器对。ARI 对两个聚类组合或分离同一对的频率进行评分,对于相同的聚类,给出 1,对于不相关的聚类,给出大约 0。
稳定性和断裂检测
ARI(t-Δ, t) 是被追踪的 ,将每个窗口与之前窗口全宽的窗口进行比较,其中 Δ = 50 步长即为窗口全宽。除了一个步长外,连续窗口会全部重叠,因此重新分类会逐渐进入,并且几乎不会移动步长到步长的 ARI(t-1, t) ;通过将比较项与全宽度分开,可以将累积的更改注册为真正的下降。
在此合成实验中,两条曲线在平静期间处于较高位置 (基准 ARI ≈ 0.93,相关性为 0.93,噪声更大、对尾部敏感的 TPDM 为 0.80) ,然后在窗口穿过重新分类事件时急剧下降,然后恢复。
为了将这种情况转变为警报,该工作流叠加了一个自校准 3 控制限值:它在平静的预断窗口上进行校准,并标记低于该限值的任何下降,而没有任何预先设置的值。

为什么尾部和身体估测器不同?协同崩溃会改变协同移动,而不会改变群组成员身份,因此,重新标记指标不会对其进行注册。硬标记和相关曲线保持不变,相关的受压力区域看起来仍然多样化。
为检测该指标,我们会在每个矩阵中直接测量这些行业之间随时间变化的跨部门依赖性。在危机峰值时,相关性仅读取为 ≈ 0.04 ,而 TPDM 读取为 ≈ 0.13,高出数倍,因为相同的扇区共享相关性从未记录过的尾依赖性。在对角线以外的地方,相关块保持较暗,而 TPDM 的强调扇区块亮起。在本期合成剧中,尽管硬集群标签没有改变,但协同崩溃在相关性方面没有受到影响,但在 TPDM 的跨领域依赖性方面却很明显。

在球形 k-means 和 SymNMF 之间
在此合成实验中,这两种方法可恢复相同的广泛结构,但在小型重要仪器子集上有所不同。在良分离相关性矩阵上,它们达到的交叉方法 ARI 约为 0.83,足够接近于球形 k – 均值是合理的近似值,但不能与 SymNMF 互换。约有 9%的仪器位于集群之间的边界上,而硬参数必须分配给单个组,而软分解则会使它们在两个集群之间进行分割。
当特征值频谱向单一主导因子 (该论文大规模研究的近 1 级 TPDM 体系) 崩溃时,这两种方法的差异会进一步加深。S 中的每一行都以几乎相同的前向对齐,因此工具无法再按角度分离,并且硬球面分区不稳定。
SymNMF 以 H 为单位保留分级因子负载,当硬集群标签不再明确定义时,这是有用的输出。因此,当扇区以较好的角度分离且硬集群足够时,球形 k – 均值是计算上更高效的选择,而 SymNMF 提供的结果可解释为软集群和硬集群。
开始使用 GPU 加速的仪器集群
SymNMF 的稠密目标先前将实际实现限制为适度矩阵大小。高效利用显存的 GPU 实施将容量扩展到一个 NVIDIA GB200 GPU 上的大约 100000 台仪器,以及跨多个节点的 100 万台仪器。AdaptGrow 使用 eigenspectrum 选择全批次 AdaGrad 或低成本的块随机更新,从而使相同的工作流程能够适应 clean-gap 和 flat-spectrum 输入。
此工作流使用 SymNMF 及其匹配的球形 k-means 基准,在 250 个合成窗口中应用此工作流。由此产生的软负载、硬标记和稳定性诊断可以支持统计套利、动量信号、市场中立投资组合构建、风险控制和风险预算,同时识别结构中断。
笔记本电脑
配套 notebook 再现了本文中的所有结果,包括:
- 生成合成返回流
- 构建滚动相关性和 TPDM 矩阵
- 选择分解秩
- 运行 SymNMF 和球形 k-means
- 推导硬件集群输出和软件集群输出
- 计算调整后的随机指数稳定性得分
- 检测植入的结构断裂
- 再现本文中的三个数字
端到端运行 clustering_through_time.ipynb – 滚动 St、独立的 SymNMF 拟合、argmax 标签以及稳定性、尾部风险和 K 均值图。使用 NVIDIA Brev 在 build.nvidia.com 上部署,或从 存储库 中部署您自己的 GPU。
堆栈
PyTorch+ cuDF:用于 S·H GEMMs 的 cuBLAS,用于 Spectral 探针的 cuSOLVER,用于分布式 runner 的 NCCL;cuDF 处理 GPU 上的 Parquet 摄取 (可选,具有 pandas 回退功能) 。一个容器:NGC PyTorch 镜像和 cudf-cu13。
横向扩展
两种算法的分布式 PyTorch 和 NCCL 实现均在行分片 S 上运行。AdaptGrow 已在 16 个节点上验证了多达 64 个 NVIDIA GB200 GPU。仓库的 scripts/run_distributed.py 使用 torchrun 或 Slurm 配置多节点执行;scripts/README.md 中提供了部署说明。
了解详情
- 配套技术论文 (SymNMF 推导、频谱秩选择和 GPU 加速阶梯) :通过加速对称非负矩阵分解实现低秩依赖性分解
- 源库和
clustering_through_time.ipynbNotebook:NVIDIA/ SymNMF-factors