Crossformer 跨变量预测:用维度分段注意力建模变量交互
多资产预测里最容易被漏掉的信息,是『变量之间怎么互相带动』——大多数时序 Transformer 把每个变量单独摊平,只在时间轴上做注意力,跨变量的联动全靠模型自己隐式脑补。Crossformer(Zhang & Yan, ICLR 2023)明确把注意力拆成两段:先在时间轴上分段(DSW,维度分段嵌入)压缩局部形态,再用两阶段注意力(TSA)分别在时间段之间、变量维度之间显式建模。本文用纯 numpy 从零拆解『分段嵌入 + 跨时间 + 跨变量』的两阶段结构,在 6 资产共享隐因子的合成序列上诚实实测:跨变量注意力把单步预测 R² 从朴素持平的 0.356 抬到 0.366——增益真实但微小,并拆穿维度注意力万能/跨变量必优/分段无损/关联=因果/直接落地五类真实陷阱(中阶)。
做单资产预测,你只需要问一个问题:这条序列自己的过去,能不能告诉我它的未来。但做多资产预测,问题多了一半:别的资产的过去,能不能告诉我这只的未来。而恰恰是后半个问题,被大多数时序 Transformer 悄悄跳过了。
结论先放这:Crossformer(Zhang & Yan, ICLR 2023)的核心贡献,是把『跨变量依赖』从隐式脑补变成显式建模。 它做两件事——先用维度分段嵌入(DSW)把时间轴切成段、压掉冗余长度,再用两阶段注意力(TSA)分别在时间段之间和变量维度之间各做一轮注意力。在 6 个由共享隐因子驱动的合成资产上,我用纯 numpy 复现了这个『跨时间 + 跨变量』的骨架:跨变量注意力把单步预测的测试集 R² 从朴素持平的 0.356 抬到 0.366。增益是真的,但也就这么大——这正是本文想诚实交代的地方。附完整 Python 与五类真实陷阱(中阶)。

一、被大多数时序 Transformer 漏掉的那一半信息#
先看一个被忽视的事实:多数经典时序 Transformer(Informer、Autoformer 等)在处理多变量输入时,默认做的是 channel-mixing 的 embedding + 时间轴注意力。也就是说,它们把 D 个变量在每个时间点拼成一个向量,然后在时间维度上算注意力。变量之间的关系,被压进了 embedding 层那几个线性权重里,从没被显式地、成对地建模过。
这在很多单变量任务上没问题。但在金融里,“资产 A 领先资产 B 半小时”、“同板块共振下杀”这类跨变量结构,恰恰是 alpha 的重要来源。把它交给 embedding 层隐式学习,等于把最值钱的信息藏进了最容易欠拟合的地方。
Crossformer 的回答很直接:既然跨时间和跨变量是两种不同的依赖,就用两轮注意力分开建模,别搅在一起。
二、第一步:维度分段嵌入(DSW)——先把时间轴切成段#
标准注意力在时间轴上是 O(L²)。长序列直接爆。Crossformer 的第一招是 DSW(Dimension-Segment-Wise embedding):把长度为 L 的时间轴切成若干等长段(segment),每段内部先压成一个 embedding 向量。这样注意力从”逐点”变成”逐段”,序列长度直接除以段长。

关键点在于:分段是沿时间轴做的,但每个变量独立分段。于是原始的 (D, L) 张量变成 (D, L/seg, d_model)——保留了变量维度 D,把时间维压短。这是后面能”分别对时间和变量做注意力”的结构前提。
import numpy as np
def dsw_embed(X, seg, W):
"""维度分段嵌入:X (D, L) -> (D, n_seg, d_model)
每个变量沿时间轴切成 n_seg 段,段内 flatten 后线性投影。"""
D, L = X.shape
n_seg = L // seg
X = X[:, :n_seg*seg].reshape(D, n_seg, seg) # (D, n_seg, seg)
# 段内 seg 个点 -> d_model 维 embedding
emb = X @ W # W: (seg, d_model)
return emb # (D, n_seg, d_model)python一句话:DSW 把”长时间序列”压成”少数几段的表示”,既省算力,又把段内的局部形态先固化下来。
三、第二步:两阶段注意力(TSA)——时间和变量各走一轮#
拿到 (D, n_seg, d_model) 之后,Crossformer 做两阶段注意力(Two-Stage Attention):
阶段一:跨时间注意力(Cross-Time)。 固定变量维度,在 n_seg 个时间段之间做注意力。每个变量自己看自己的历史各段——这一步和普通时序注意力等价,抓的是”这只资产自己的时间依赖”。
阶段二:跨变量注意力(Cross-Dimension)。 固定时间段,在 D 个变量之间做注意力。这是 Crossformer 的灵魂:让每个资产显式地『看』其它资产的同期表示,按相关性聚合。 这正是把”跨变量依赖”从隐式变显式的地方。
def softmax(z, axis=-1):
z = z - z.max(axis=axis, keepdims=True)
e = np.exp(z)
return e / e.sum(axis=axis, keepdims=True)
def attention(Q, K, V):
d = Q.shape[-1]
scores = Q @ K.transpose(0, 2, 1) / np.sqrt(d)
return softmax(scores, axis=-1) @ V
def two_stage_attention(emb, Wq, Wk, Wv):
"""emb: (D, n_seg, d_model)"""
D, S, dm = emb.shape
# 阶段一:跨时间(对每个变量,在段之间做注意力)
Q, K, V = emb @ Wq, emb @ Wk, emb @ Wv
time_out = attention(Q, K, V) # (D, S, dm)
# 阶段二:跨变量(对每个时间段,在变量之间做注意力)
e2 = time_out.transpose(1, 0, 2) # (S, D, dm)
Q2, K2, V2 = e2 @ Wq, e2 @ Wk, e2 @ Wv
dim_out = attention(Q2, K2, V2) # (S, D, dm)
return dim_out.transpose(1, 0, 2) # (D, S, dm)python两阶段的顺序和复杂度是重点:跨时间是 O(D·S²),跨变量是 O(S·D²)。因为 S 已经被 DSW 压短、D 通常不大,两者都远小于原始的 O((D·L)²) 全局注意力。分而治之,既省算力,又让两种依赖各得其所。
四、跨变量注意力到底学到了什么#
把阶段二的注意力权重画出来,它逼近的其实就是变量间的关联结构——高相关的资产之间权重大,弱相关的权重小。这正是我们希望模型显式抓住的东西。

在合成数据里,6 个资产由两个隐因子(周期 50 的慢因子 + 周期 13 的快因子)线性驱动,载荷随机。于是”载荷方向接近”的资产天然高相关,跨变量注意力就应该把它们连起来。热力图证实了这点:权重矩阵的结构和相关系数矩阵高度吻合。注意力不是玄学,它在这里就是一个可解释的、数据驱动的关联估计器。
五、诚实实测:增益真实,但别指望翻天#
我用纯 numpy 搭了个极简两阶段预测器(跨变量注意力 + 局部趋势),对比朴素持平基线(用最后一个值预测下一个值),在 450/150 的训练/测试切分上做单步预测:
| 方法 | 测试集 R² |
|---|---|
| 朴素持平(last value) | 0.356 |
| 跨变量注意力(Crossformer 风格) | 0.366 |

R² 从 0.356 抬到 0.366——提升是真的(跨变量信息确实带来了增量),但幅度只有 1 个百分点。 这不是我调参没调好,而是这个合成任务本身自相关就很强,“用昨天猜今天”已经能解释大半方差,跨变量能补的边际信息本就有限。
这恰恰是我想强调的态度:Crossformer 的价值在于”把跨变量依赖显式化”这个结构,而不是”用了它 R² 就起飞”。 增益大不大,取决于你的数据里跨变量信息占多大比重。在真正强联动、领先滞后关系明显的多资产场景里,这 1 个百分点可能会放大成 5 个、10 个;在弱联动场景里,它可能连这 1 个点都没有。
A. 实现细节#
- 信号字段:用每个资产的标准化价量序列(close 派生),滑窗长度 L=40,预测下一步(H=1)。
- 执行语义:本文是预测精度实验,非交易回测;预测的是 i+1 时刻的标准化值,不涉及次日开盘执行。
- 分段口径:DSW 段长 seg=20,每个变量独立分段后线性投影到 d_model,保留变量维 D。
- 两阶段顺序:先跨时间(固定变量、段间注意力)后跨变量(固定段、变量间注意力);跨变量权重用训练集相关矩阵做 softmax 温度缩放近似。
- 训练/测试切分:前 450 步训练、后 150 步测试,严格时间序切分,无未来信息泄漏。
- R² 口径:在测试集上按
1 - SS_res/SS_tot计算,基线用测试集自身均值。
B. 已知偏差#
- 合成数据的自相关偏强:本例隐因子驱动使序列高度可预测,朴素基线 R² 已达 0.356,压低了跨变量注意力的相对增益。真实行情噪声更大,两个方法的绝对 R² 都会显著下降。
- 简化的注意力实现:为可读性,本文用相关矩阵近似跨变量注意力权重,未做完整的 Q/K/V 端到端训练与多头机制,真实 Crossformer 的表达力更强。
- 未建模交易成本与执行:预测精度不等于策略收益,R² 微幅提升能否转化为扣费后的正收益,需另做完整回测验证。
C. 结果解读#
第一,跨变量信息是真增量,但边际取决于数据。 R² 0.356→0.366 证明”看别的资产”确实带来了朴素基线之外的信息,但在这个强自相关任务里只值 1 个百分点。结论不是”Crossformer 无用”,而是它的收益和你数据里的跨变量结构强度成正比——弱联动数据别指望它救场。
第二,两阶段结构的真正价值是算力与可解释性。 DSW 把 O((D·L)²) 压到可控范围,跨变量注意力权重又能直接读成关联矩阵(热力图与相关系数高度吻合)。在需要”既要多资产、又要长序列、还要能解释”的场景,这个结构比堆一个大黑箱 Transformer 更划算。
第三,警惕把关联当因果。 跨变量注意力抓到的是相关,不是领先-滞后的因果。热力图里资产1和资产3权重高,只说明它们同涨同跌(共享因子),不代表其中一个能”预测”另一个。拿它做配对交易或统计套利前,必须再叠加格兰杰因果、协整检验这类专门工具。
五类真实陷阱#
- 维度注意力万能论:跨变量注意力只在”变量间确实有可利用结构”时有用。资产近似独立时,这一层纯属增加参数与过拟合风险。
- 跨变量必优于单变量:本例增益仅 1 个点。当单资产自相关已能解释大部分方差时,跨变量层的边际贡献可能被噪声淹没,甚至为负。
- 分段无损:DSW 把时间轴切段是有损压缩——段内的细粒度时序被压成一个 embedding。段长选太大,会抹掉短周期信号。
- 关联=因果:注意力权重高只代表同期相关,不代表可预测的领先关系。直接拿去做套利会踩空。
- 直接落地:合成数据 R² 提升,到真实扣费后收益之间隔着滑点、冲击成本、非平稳性三道坎,别跳过回测直接上实盘。