金融工具聚类是量化策略的核心环节,广泛应用于投资组合构建、风险聚合、统计套利和交易监控。错误的分组可能导致集中仓位看似分散化,掩盖名义边界之间共享的风险,并筛选出在市场压力下失效的统计套利对。

实践中的难点在于,正确的分组既无法直接观测,也缺乏稳定性。因子暴露会随时间漂移,工具标的会更换分类,依赖关系在市场压力期间可能急剧变化。因此,聚类流水线必须能够区分常规波动与结构性变化,同时具备足够低的计算成本,以便在新收益数据到来时重新运行。

从依赖矩阵对工具进行分组,通常有两种常见方法。硬聚类方法计算成本较低,但会将每个工具精确分配到一个组中,这在行业边界处会失效,且会掩盖风险预算中至关重要的梯度暴露。而软因子分解方法(如SymNMF)能够处理边界工具并生成可用的因子载荷,但其稠密矩阵目标在历史上将实际应用规模限制在中等工具数量,远未达到该问题实际所需的规模。

本文介绍一套同时解决上述两个局限的工作流程。该工作流从滚动收益窗口出发,构建两个互补的输入:用于广泛协动分析的绝对Pearson相关性,以及用于极端观测值下联合行为分析的尾部成对依赖矩阵(TPDM)。SymNMF通过一行非负因子载荷来表示每个工具,保留行向量可得到软表示,取其argmax则产生硬标签。

一种内存高效的SymNMF公式将峰值存储从约20n?字节降至约4n?字节,这正是约10万个工具能够放入单块NVIDIA GB200的关键所在。对于更大规模的问题,分布式实现对依赖矩阵进行行分片,将通信量从O(n?)降至O(nk),从而能够在16个节点上对100万个工具进行因子分解。单一自适应求解器AdaptGrow通过读取特征谱,在全批次梯度和块随机梯度之间自动切换,同时处理相关性和尾部依赖两类输入,无需针对不同输入结构手动选择或调整单独的求解器。

最终产物是一套聚类流水线,能够输出硬标签、软因子载荷和结构断点信号,在新收益数据到来时以低成本重新运行,并可在不改变求解器接口的情况下,从单GPU扩展至多节点基础设施。

规模限制首先来自内存。对于10万个工具,稠密FP32依赖矩阵需要约40 GB存储;对于100万个工具,则需约4 TB。朴素的SymNMF实现还会额外实例化多个n×n中间矩阵。本文采用的基于迹的公式消除了这些中间矩阵,将估计峰值存储从约20n?字节降至4n?字节加上较小的因子缓冲区,这一改变使约10万个工具能够放入单块高内存GPU。

NVIDIA加速贯穿流水线各阶段:PyTorch将主导性的SH矩阵乘法分发至cuBLAS;cuSOLVER执行用于秩选择和求解器切换的谱探针;cuDF负责可选的Parquet数据导入及GPU端预处理;在横向扩展方面,PyTorch Distributed对S进行行分片,同时在每个工作节点上保留H的副本,NCCL对行分片的SH乘积进行all-gather,并对梯度进行all-reduce,使通信数据量从O(n?)降至O(nk)。整个环境基于NVIDIA NGC PyTorch容器与cudf-cu13打包。

在配套论文中,10万工具矩阵被分布在4块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应能揭示普通相关性大部分忽略的协同崩溃现象。实际生产中,只需将合成生成器替换为真实收益表,同时保留相同的窗口切分、依赖估计、因子分解和监控阶段即可。

首先检查初始代表性窗口的前几个特征值。在信号特征值与噪声底之间最明显的分离处选择k,并在后续窗口中保持k固定,以便稳定性评分具有可比性。本文合成数据的预设秩为24。生产数据可能不存在明显间隔,因此秩的选择还应结合聚类可解释性和稳定性进行验证。

对于每个滚动窗口,工作流将依赖矩阵S和所选秩k传入AdaptGrow,求解器返回H,其中H的每一行包含对应工具的软因子载荷,取行方向的argmax即可得到硬聚类标签。

每个窗口使用相同的固定种子初始化,独立拟合而非热启动,从而防止历史标签掩盖真实的重新分类。AdaptGrow是单一自适应求解器,可根据矩阵特征值谱自动配置。两种模式使用相同的逐坐标AdaGrad预条件器,仅在梯度计算方式上有所不同。AdaptGrow根据下文描述的秩后特征值间隔来初始化批次比例。

若间隔清晰,则选择全梯度;若秩后谱较为平坦,则从基于随机方差缩减梯度(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会检查秩后间隔比率γ_{k+1} = λ_{k+1} / |λ_{k+2}|,额外的特征值用于考虑公共因子(如市场因子与组级因子并存的情形)。在配套实验中,较大的秩后间隔对应更短的相关矩阵运行时间,此时全批次AdaGrad效率最高;较平坦的谱对应更长的TPDM运行时间,此时低成本块采样梯度更为有效。因此,当间隔较小时,AdaptGrow以采样SVRG更新为起点,并在进度停滞时将采样比例向完整矩阵方向递增。此处使用的阈值5是来自这些实验的经验设定,并非通用统计临界值。

AdaptGrow算法草图如下:

```python

# 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)

# 固定种子初始化,每个窗口独立(无热启动)

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提供了一个成本更低的基线方案。它使用余弦相似度对S的L2归一化行向量进行聚类,是SymNMF在此依赖几何上的适配对比方法。配套论文建立了两个目标函数之间的形式化关系。实际使用中,当聚类分离良好时选择球面k-means,当需要软因子载荷或边界工具处理时选择SymNMF。

同一流水线在共享潜在结构但度量不同内容的两种依赖矩阵上运行:

相关性矩阵捕捉完整收益分布上的协动,主要由数据中心体驱动。

TPDM捕捉极端事件下的条件协动,正是这部分驱动了回撤和联合尾部风险。

在k固定且每个窗口独立因子分解的前提下,研究方法简单明了:对每个St进行因子分解,通过H的argmax得到硬标签,并观察标签随窗口滑动的变化情况。

由于聚类标签在不同运行之间是任意的,这里改为对工具对进行比较。ARI衡量两个聚类将同一对工具放在一起或分开的频率,完全相同的聚类得分为1,无关聚类约为0。

ARI(t-Δ, t)用于追踪每个窗口与一个完整窗口宽度之前的窗口之间的对比,其中Δ=50步即为该宽度。连续窗口除一个步长外完全重叠,因此重新分类会逐渐进入,对步间ARI(t-1, t)几乎没有影响;而将比较间隔拉开一个完整窗口宽度,才能让累积变化显现为真实下跌。

在本合成实验中,两条曲线在平静期均保持较高水平(基准ARI约为0.93(相关性)和约0.80(噪声更大、对尾部更敏感的TPDM)),在窗口跨越重新分类事件时急剧下降,随后恢复。

为将这一下跌转化为预警信号,工作流叠加了自校准3σ控制限:在平静的断点前窗口上进行校准,并标记任何低于控制限的下跌,无需预设阈值。

为什么需要不同的尾部与中心体估计器?协同崩溃改变的是协动程度,而非组归属,因此重新标记指标无法捕捉它。硬标签和相关性曲线保持不变,从相关性来看,受压板块看起来仍然分散。

为检测这一现象,工作流直接在两种矩阵中随时间测量这些板块之间的跨板块依赖。在危机峰值时,相关性仅约为0.04,而TPDM约为0.13,高出数倍,因为同一批板块共享相关性从未捕捉到的尾部依赖。在非对角线上,相关性块保持暗色,而TPDM受压板块块则明显亮起。在本合成事件中,协同崩溃在相关性中被淡化,但在TPDM的跨板块依赖中清晰可见,尽管硬聚类标签并未发生变化。

在本合成实验中,两种方法恢复了相同的宏观结构,但在一小部分重要工具上存在差异。在分离较好的相关矩阵上,两者的跨方法ARI约为0.83,足够接近,使得球面k-means可以作为SymNMF的合理近似,但两者并不可互换。约9%的工具处于聚类边界,硬argmax必须将其分配至单一组,而软因子分解则保留其在两个组中的分割表示。

当特征值谱收缩为单一主导因子(论文在大规模场景下研究的近秩1 TPDM状态)时,两种方法的差异进一步扩大。此时S的每一行几乎都与同一主导方向对齐,工具无法通过角度加以区分,硬球面划分因此变得不稳定。

SymNMF在H中保留了梯度因子载荷,这正是硬聚类标签不再定义清晰时的有效输出。因此,当板块在角度上分离良好且硬聚类已足够时,球面k-means是计算效率更高的选择;而当需要同时解释软聚类和硬聚类结果时,SymNMF则提供更具可解释性的输出。

SymNMF的稠密目标函数此前将实际实现规模限制在中等矩阵规模。本文的内存高效GPU实现将该容量扩展至单块NVIDIA GB200 GPU上约10万个工具,以及跨多节点的100万个工具。AdaptGrow利用特征谱在全批次AdaGrad与低成本块随机更新之间自动切换,使同一工作流能够自适应处理清晰间隔和平坦谱两类输入。

该工作流在250个合成窗口上应用此流水线,同时使用SymNMF及其匹配的球面k-means基线方法。所得的软载荷、硬标签和稳定性诊断指标,可支持统计套利、动量信号、市场中性投资组合构建、敞口控制和风险预算,同时识别结构性断点。

配套笔记本实现了本文的完整流水线并复现了所有结果,包括:生成合成收益流、构建滚动相关性和TPDM矩阵、选择因子分解秩、运行SymNMF和球面k-means、推导硬聚类和软聚类输出、计算调整兰德指数稳定性评分、检测预设结构断点,以及复现本文中的三张图表。

可通过端到端运行clustering_through_time.ipynb来执行完整流程,包括滚动St、独立SymNMF拟合、argmax标签,以及稳定性、尾部风险和k-means图表。可在build.nvidia.com上通过NVIDIA Brev部署,或从代码仓库在自有GPU上运行。

技术细节方面,PyTorch与cuDF组合中,cuBLAS负责S·H的GEMM运算,cuSOLVER负责谱探针,NCCL负责分布式运行;cuDF处理GPU端Parquet数据导入(可选,配备pandas回退方案)。整个环境使用一个NGC PyTorch镜像加cudf-cu13打包。

PyTorch Distributed和NCCL对行分片的S实现了两种算法的分布式版本。AdaptGrow已在16个节点的64块NVIDIA GB200 GPU上完成验证。代码仓库中的scripts/run_distributed.py通过torchrun或Slurm配置多节点执行,部署说明详见scripts/README.md。

Q&A

Q1:AdaptGrow算法是如何自动选择全批次梯度还是块随机梯度的?

A:AdaptGrow通过检查秩后特征值间隔比率γ_{k+1} = λ_{k+1} / |λ_{k+2}|来决定策略。当间隔较大(≥5)时,说明矩阵结构清晰,选择全批次AdaGrad梯度,效率最高;当间隔较小、谱较平坦时,从基于SVRG校正的块采样梯度起步,若进度停滞则逐步将采样比例扩展至完整矩阵。两种模式使用相同的逐坐标AdaGrad预条件器,仅在梯度计算方式上不同,无需手动选择或调参。

Q2:TPDM和普通相关矩阵在检测市场风险方面有什么区别?

A:两者度量的内容不同。普通相关矩阵捕捉完整收益分布上的协动,主要由数据中心体驱动,在市场正常时期表现良好。TPDM(尾部成对依赖矩阵)专门捕捉极端事件下的条件协动,即驱动回撤和联合尾部风险的部分。在合成实验的危机峰值时,相关性读数仅约0.04,而TPDM达约0.13,高出数倍。这意味着在协同崩溃事件中,仅看相关矩阵会认为各板块仍然分散,而TPDM能够清晰揭示跨板块的隐性尾部风险。

Q3:SymNMF和球面k-means各自适合什么场景?

A:两者各有优劣。球面k-means计算成本更低,通过余弦相似度对行向量进行聚类,适合各板块在角度上分离良好且只需硬标签的场景。SymNMF产生软因子载荷,能够保留边界工具在多个聚类中的分割表示,适合需要精细风险预算或工具处于板块边界的场景。在本合成实验中,两者的跨方法ARI约为0.83,但约9%的边界工具在处理上存在差异。当特征值谱退化为近秩1状态时,球面k-means会变得不稳定,而SymNMF仍能提供可解释的梯度载荷输出。

NVIDIA