GPU 加速大规模金融工具聚类
利用 AdaptGrow 这一 GPU 加速的矩阵分解算法,将滚动相关矩阵和尾部相依矩阵转化为硬聚类、软因子载荷和结构性突变信号,支持单卡及多节点部署
量化策略常需要对金融工具进行分组,用于组合构建、风险归集、统计套利和交易监控。错误的分组会让集中持仓看起来分散,掩盖名义边界之外共享的风险,并筛选出在压力情景下关系失效的统计套利配对。
实际难点在于,正确的分组既无法直接观测,也并非一成不变。因子敞口在漂移,工具所属类别在变化,而相依关系在市场压力下可能骤然改变。因此,聚类流程必须区分日常波动与结构性变化,并且足够轻量,以便新收益数据到来时能够反复运行。
从相依矩阵中分组工具,两种常见思路各有取舍。硬聚类方法计算成本低,但将每个工具严格归入唯一一组,在行业边界处往往失灵,也掩盖了风险预算所需的渐变式敞口。SymNMF 这类软分解方法能处理边界工具并输出可用的因子载荷,但密集矩阵的目标函数历史上只适用于中等规模的工具数量,远达不到该问题实际所处的量级。
本文介绍的工作流同时应对这两个局限。该流程从滚动收益窗口出发,构造两类互补输入:绝对值 Pearson 相关系数用于刻画整体联动性,尾部成对相依矩阵(TPDM)用于刻画极端观测下的联合行为。SymNMF 通过非负因子载荷行向量来表征每个工具:保留整行即为软表示,对其取 argmax 则得到硬标签。
一种内存高效的 SymNMF 公式将峰值存储从约 20n2 字节降至约 4n2 字节,这正是约 10 万个金融工具能够装入单块 NVIDIA GB200 的关键。对于更大规模的问题,分布式实现按行对依赖矩阵进行分片,并将通信量从 O(n2) 降至 O(nk),从而在 16 个节点上完成 100 万个工具的分解。统一的自适应求解器 AdaptGrow 通过读取特征谱来选择全批量梯度或块随机梯度,同时处理相关性输入和尾部依赖输入,省去了为不同输入结构挑选或调参单独求解器的麻烦。
最终得到的聚类流水线能产出硬标签、软因子载荷和结构性突变信号,在新收益数据到来时可以低成本重跑,并且从单卡 GPU 到多节点基础设施无需更换求解器接口即可平滑扩展。
随附的 notebook(链接见下方)实现了完整流水线,并复现了本文中的全部结果。
大规模因子分解
规模首先受限于内存。一个稠密的 FP32 依赖矩阵在 10 万个工具时约需 40 GB,在 100 万个工具时约需 4 TB。一个朴素的 SymNMF 实现还会额外物化若干 n × n 的中间矩阵。本文采用的基于迹的公式消除了这些中间矩阵,将估算的峰值存储从约 20n2 字节降到 4n2 字节,再加上较小的因子缓冲区。正是这一改动使约 10 万个工具能够装入单块大显存 GPU。
在流水线的每个阶段都引入了 NVIDIA 加速:PyTorch 将占主导地位的 SH 矩阵乘法分派给 cuBLAS;cuSOLVER 执行用于秩估计和求解器选择的谱探针;cuDF 将可选的 Parquet 读取和预处理环节保留在 GPU 上。在横向扩展方面,PyTorch Distributed 对 S 按行分片,同时在每个 worker 上保留一份 H 的副本。NCCL 对按行分片的 S H 乘积执行 all-gather,对梯度执行 all-reduce,因此通信量是 O(nk) 而不是完整的 O(n2) 矩阵。运行环境通过 NVIDIA NGC PyTorch 容器搭配 cudf-cu13 一并打包提供。
在前一篇配套论文中,10 万条金融工具组成的矩阵被分配到四块 NVIDIA GB200 GPU 上以加速执行,不过其 40 GB 的输入其实一块 GB200 就放得下。在 FP32 精度下,三个随机种子的实验显示:AdaptGrow 在相关性分解上耗时 13.0 秒,在 TPDM 上耗时 12.4 秒。当规模达到 100 万条时,4 TB 的矩阵按行分片到 16 个节点上的 64 块 GB200 GPU;全批量 AdaGrad 完成相关性分解约需 2 分钟,而 AdaptGrow 完成 TPDM 分解约需 4 分钟。以上都是单次分解的耗时,并非全部 250 个时间窗口的端到端计时。
时间窗口设置
工作流对 250 个滚动窗口进行评估,近似模拟一个交易年度内的每日重新聚类。合成收益流包含两类受控事件:部分工具的所属分组发生变化,以及若干分组在不更换分组的前提下经历了一次共同的尾部压力事件。
这个受控设置用来验证两种不同的行为:调整兰德指数(ARI)应当识别出分组归属的变化,而 TPDM 则应暴露出普通相关性基本无法捕捉到的共同暴跌。要在生产环境中应用,只需将合成生成器替换为实际的收益表,同时保持相同的窗口切分、依赖性估计、分解和监控流程即可。
百万级工具的结果属于单独的分布式扩展测试,需要与已发表的 16 节点配置相当的硬件基础设施。
选择秩 k
首先检查一个具有代表性的初始窗口所对应的前导特征值。在信号特征值与噪声底之间最明显的分界处选取 k,随后在所有后续窗口中保持 k 固定不变,以保证稳定性得分之间具备可比性。本文使用的合成数据预设秩为 24。生产数据未必存在清晰的间隔,因此秩的选取还应结合聚类的可解释性和稳定性来综合判断。
使用 SymNMF 进行分解
在每个滚动窗口中,流程将依赖矩阵 S 和选定秩 k 传入 AdaptGrow。求解器返回 H,其中 H 的每一行包含一只金融工具的软因子载荷,对行取 argmax 即可得到硬聚类标签。
每个窗口都使用相同的固定种子初始化,并且独立拟合而非热启动,以避免历史标签遮蔽真实的重新分类。AdaptGrow 是一个自适应求解器,可根据矩阵的特征值谱自动配置参数。两种模式共用同一个逐坐标 AdaGrad 预处理器,区别仅在于梯度的计算方式。AdaptGrow 的批次采样比例由下文详述的"秩后特征值间隙"决定。
如果间隙明显,则选用全量梯度;秩后谱较平坦时,则先用更廉价的块采样梯度,并结合 SVRG(随机方差缩减梯度)进行校正,随后在进展停滞时逐步将采样扩展到全量梯度。同一个求解器从单卡到多卡 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 由秩后特征值间隔播种:
# gamma_{k+1} >= 5 时选用全梯度,否则从采样起步
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)
# 固定种子初始化,每个窗口独立(不做 warm-start)
H = scale_matched_init(S, k)
# 对角(逐坐标)AdaGrad 累加器
G = torch.zeros_like(H)
for t in range(steps):
# 干净的秩后间隔
if phi >= 1.0:
g = 4 * (H @ (H.T @ H) - S @ H)
# 平缓的秩后谱
else:
g = block_svrg_grad(S, H, phi)
# 不论哪种情况,都用同样的对角 AdaGrad 更新
G += g * g
# 投影后的步进
H = (H - lr * g / (G.sqrt() + eps)).clamp_min(0)
# 把采样比例逐步扩大到全梯度
if stagnating() and phi < 1.0:
phi = min(2 * phi, 1.0)
return H
面向直接硬聚类的球面 k-means
当每个金融工具只需要一个标签时,球面 k-means 提供了一个代价更低的基线。它基于余弦相似度对 S 的 L2 归一化行做聚类,因此是与 SymNMF 在这种依赖几何上的合适对照。配套论文给出了这两种目标函数之间的形式化关系。实际中,对分离清晰的硬聚类用球面 k-means;对需要软因子载荷或边界工具的场景用 SymNMF。
用 Rand 指数跟踪跨时间的稳定性
同一条流水线在两张依赖矩阵上分别运行:两张矩阵共享同一个潜在结构,但衡量的是不同的东西:
- 相关性衡量的是在整个收益分布上的同涨同跌,由数据的"主体"驱动。
- TPDM 衡量的是极端事件发生条件下的同涨同跌,正是这种条件同向运动导致了回撤和联合尾部风险。
在 k 固定、每个窗口独立分解的条件下,研究过程很直接:对每个 St 做分解,再按 H 上的 argmax 做硬标注,然后观察随着窗口滑动,标注结果如何变化。
评估指标
由于不同运行之间的簇标签是任意的,所以改为比较工具之间的配对关系。ARI 衡量的是两个聚类结果把同一对样本归为同类或异类的吻合程度,完全一致的聚类得 1,完全无关的聚类约为 0。
稳定性与断点检测
对 ARI(t-Δ, t) 进行追踪,即把每个窗口与前移一整个窗口宽度后的窗口做比较,其中 Δ = 50 即为该宽度。相邻窗口几乎只差一个步长,所以一次重新分类只会逐步渗入,对相邻步的 ARI(t-1, t) 影响很小;而把比较间隔拉到一整个窗口宽度后,累计的变化就会显现为一个真实的凹陷。
在本次合成实验中,两条曲线在平静期内都处于较高水平(相关性基线 ARI ≈ 0.93,噪声更大、对尾部更敏感的 TPDM 基线 ≈ 0.80),当窗口跨越重新分类事件时急剧下跌,之后又恢复。
为了把这段下跌转化为告警,工作流叠加了一条自校准的 3σ 控制限:在断点前的平静窗口上进行校准,凡跌破该下限的即标记为异常,全程无需任何预设阈值。
为什么要区分尾部和主体的估计量?同跌改变的是联动性,而非分组归属,因此重标签指标无法捕捉它。硬标签和相关系数曲线都不受影响,按相关性看,这些承压行业仍然显得分散。
要检测出这种变化,需要直接在每个矩阵中跨行业地度量这些行业之间随时间演变的相依性。在危机峰值处,相关系数仅约 0.04,而 TPDM 约 0.13,高出数倍——因为同样的行业之间共享着相关系数永远捕捉不到的尾部相依。非对角位置上,相关系数矩阵保持暗淡,而 TPDM 的承压行业块则被点亮。在这个合成场景中,同跌在相关性中表现微弱,在 TPDM 的跨行业相依中却清晰可见,尽管硬聚类标签本身并未改变。
球面 k-means 与 SymNMF 之间
在这个合成实验中,两种方法恢复了相同的宏观结构,但在少量重要工具上存在差异。在分离良好的相关矩阵上,两者的跨方法 ARI 约为 0.83,足够接近,表明球面 k-means 是合理的近似,但不可与 SymNMF 完全互换。大约 9% 的工具处于聚类边界附近,硬性 argmax 必须将它们分配到单一类别,而软分解则将它们拆开保留在两个类别中。
随着特征值谱向单一主导因子塌缩(即论文在大规模场景中研究的近秩-1 TPDM 状态),两种方法的分歧进一步加大。此时 S 的每一行几乎都对齐到同一主导方向,因此工具不再按角度可分,硬性的球面划分也变得不稳定。
SymNMF 在 H 中保留了分级因子载荷,这在硬聚类标签已不再清晰时尤为有用。因此,当行业按角度分离良好且硬聚类足够时,球面 k-means 是计算上更高效的选择;而 SymNMF 则提供既可解读为软聚类也可解读为硬聚类的结果。
开始使用 GPU 加速的金融工具聚类
SymNMF 的稠密目标函数此前将实际实现限制在中等规模的矩阵上。显存高效的 GPU 实现将这一能力扩展到单块 NVIDIA GB200 GPU 上约 10 万个工具,以及跨多节点达 100 万个工具。AdaptGrow 利用特征谱在全局批 AdaGrad 与低开销的块随机更新之间灵活选择,使同一工作流能够适配清晰间隔与平坦谱的不同输入。
该流程在 250 个合成时间窗口上同时运行 SymNMF 和与之对照的球面 k-means。由此得到的软因子载荷、硬聚类标签以及稳定性指标,可服务于统计套利、动量信号、市场中性组合构建、敞口控制与风险预算,同时识别结构性突变。
配套 Notebook
配套的 notebook 复现了本文所有结果,包括:
- 生成合成收益序列
- 构建滚动相关矩阵与 TPDM 矩阵
- 选择分解秩
- 运行 SymNMF 与球面 k-means
- 推导硬聚类与软聚类输出
- 计算校正兰德指数(adjusted Rand index)稳定性得分
- 检测植入的结构性突变
- 复现本文中的三张图
端到端运行 clustering_through_time.ipynb——包括滚动 St、独立的 SymNMF 拟合、argmax 标签,以及稳定性、尾部风险和 k-means 图。可通过 NVIDIA Brev 在 build.nvidia.com 上部署,也可从 代码仓库 在自有 GPU 上运行。
技术栈
PyTorch + cuDF:cuBLAS 负责 S·H 的 GEMM 运算,cuSOLVER 提供谱分析探针,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 加速阶梯):Low-Rank Dependence Decomposition via Accelerated Symmetric Non-negative Matrix Factorization
- 源代码仓库及
clustering_through_time.ipynbnotebook:NVIDIA/SymNMF-factors