照抄公式也训不出稀疏:一篇 SAE 加密因子论文的复现边界
第一组对照模型训完,我把 SAE 和它的稠密对照(DenseAE,λ=0)放在一起比对权重(绑定权重,编码和解码共用同一组参数):余弦相似度 0.999998。换句话说,带稀疏惩罚的模型和不带惩罚的模型,是同一个模型。Hoyer 稀疏度(取值 0–1,越接近 1 越稀疏)0.479 对 0.478;五折汇总后,预测 IC 都是 +0.0073,组合表现也几乎重合。
我没想到,第一组对照先撞上的就是这个。我要复现的论文里,稀疏是整个故事的发动机:正是因为编码被 L1 罚得足够稀疏,重构排序选出的篮子才会彼此低相关,波动才降得下来。如果稀疏根本没出现,后面的数字跑得再像,也不是在验证这篇论文。
这篇文章记录的就是这次复现的全过程:哪里对上了,哪里没对上,以及最关键的——没对上的地方,证据把原因指向了哪里。
论文声称了什么,先把等级分清
Han 与 Qu(华盛顿大学)的论文已被 ICAIF ‘26 录用,研究问题很具体:把每日截面收益喂给一个单层稀疏自编码器,用它的重构值给资产排序、做反转五分位组合,组合风险会不会因为”稀疏”本身而下降?
作者报告的核心结果分三个等级,这一点他们自己划得很清楚:
- 严格确认的只有一条:在前 748 天上预先选定 K=128、λ=0.1 后,五个确认折里 SAE 篮子的 rank 尺度波动比同 K 的 PCA 低 20–26%。
- 探索性的:K=64 设置下波动低 32–37%(money 口径 20.0% 对 27.3%),但它的选择窗和早期测试折有重叠,只能算探索证据。机制解释是篮内平均两两相关 0.008 对 PCA 的 0.039。
- 作者明确否定的:SAE 没有增量 Sharpe(输给最朴素的同日反转基线,money 口径差距 −2.48);因子身份不跨随机种子复现(解码器匹配余弦 0.13,随机字典参照 0.117);一个 Ledoit–Wolf 最小方差 overlay 能把 SAE 相对 naive 的波动优势补回约 73%。
作者还主动写明了三条边界:信号在 t 日收盘形成、按同一收盘价成交,“实际不可执行”,结果是信号证据而不是可交易回测;全程不计成本;加密资产池的覆盖筛选使用了全样本信息,不是时点一致的。还有一条他们没写但很要紧:截至 2026-11-01,论文与 arXiv 页面都没有链接任何代码,433 个资产的确切名单也没有公布。所以任何复现都只能是照印刷协议重写,面板注定不同——这一点决定了我的结论应该长什么样:我测的是这套主张的可移植性,不是去裁定作者在他们自己面板上的运行对错。
我的复现设置:偏差先写在前面
数据用 Binance 公共接口的现货 USDT 日线,免账户、免 key。资产池的冻结规则在训练前写死:519 个在交易对里,285 个在 2022–2024 窗口内有数据,245 个通过”≥252 个观测日”,最后按日均成交额中位数取前 150 个冻结,清单连同哈希先落盘再训练。每天可用的资产在 89 到 150 个之间(平均 119)。
和论文的偏差逐条列明:资产 150 个对 433 个,且我的是流动性子集;窗口 2022–2024 对 2019–2024;标的清单来自当前仍在交易的品种,带存续倾斜,而论文保留了退市资产到最后报价。存续筛选会系统性压低这个面板的波动水平,而本文核心对比的正是波动;这个偏差的量级无法追溯——退市标的已经不在当前的交易列表里,无从计数。面板处理照论文:日截面 1/99% winsorize、缺失前向填充至多 3 天再掩码、截断逆正态 rank 变换。选择窗取前 500 个收益日(450 训练 / 50 验证),只按验证集重构误差在 K∈{32,64,128} × λ∈{10⁻³,10⁻²,10⁻¹} × 学习率网格里选参;其后 5 个 expanding walk-forward 折、每折 119 个信号日;每个信号日的 PnL 需要次日收益,每折最后一个信号日因此不计,共 590 个评估日。组合是重构排序的反转五分位、等权、每腿 gross 1,t+1 缺失收益按零计——都与论文一致。
另外预注册了两道闸门。停损条件:缩减池上波动方向不复现,就如实报 non-replication,不扩池、不调参找符号。校准门:如果诊断发现 λ 没有咬合,允许在选择窗内按”稀疏度达标且重构代价受控”的标准挑一个校准 λ 跑一条额外的臂——但挑不出来就不跑,不许看测试集回头改标准。
第一个不对劲:λ 在这个面板上是惰性的
先看选参结果。验证集重构 MSE 在 K=128 下对 λ 几乎是平的:λ=10⁻³ 时 0.3374,10⁻² 时 0.3375,10⁻¹ 时 0.3380。按规则选出的严格配置是 K=128、λ=10⁻³——论文在他们面板上选出的是同一个 K、但最强的 λ=0.1。同一套选择标准,两个面板给出了相反的惩罚强度偏好。只按重构误差选参,本来就系统性偏向最弱的惩罚(L1 只会损害重构),我选出 10⁻³ 几乎是规则内的必然;反过来,论文在自述的同一条规则下选出最强的 0.1,这个张力值得单独记一笔:要么在他们的面板上强惩罚真的不伤重构,要么选择过程还有没写出来的部分。
然后是梯度层面的直接测量。在 λ=10⁻²(论文的探索设置)下,L1 项对权重的平均梯度量级是 5.5×10⁻⁶,重构项是 2.1×10⁻³——罚项只有主项的约 1/390,根本不在一个量级上。另做的一组诊断(在前 500 天上重训、拿第一折窗口评估)里,把 λ 放大到 1.0(论文探索口径 λ=10⁻² 的 100 倍)做压力测试,Hoyer 也只从 0.474 爬到 0.514;模型依然谈不上稀疏。
校准门的结果是:没有 λ 能通过。扫描 λ∈{0.3, 1, 3, 10, 30}(这一组是 K=64 在选择窗上的口径),Hoyer 从 0.483 升到 0.619 就饱和了,而验证 MSE 从稠密基线的 0.554 一路涨到 0.918(+66%)。我的门槛是”Hoyer 比 DenseAE 高 0.15 以上、且 MSE 不超过 1.2 倍”:λ=30 最接近:Hoyer 0.619,刚好擦过 0.618 的门槛(这一口径下 DenseAE 的 0.468 加 0.15),但 MSE 0.918 是允许上限 0.664 的约 1.4 倍。按预注册规则,校准臂不跑。但“剂量不足”只解释了一半:按同一协议实测,λ=30 时罚项梯度已经是重构项的约 7.7 倍,剂量早就够了,Hoyer 却仍在 0.62 附近饱和、重构先崩。所以在这个面板上,论文区间内的 λ 是惰性的,区间之外还有另一道天花板——这套架构在这批数据上似乎没法在保住重构的前提下把编码压得更稀疏(天花板的具体成因没有测,只能存疑)。
为什么同一个公式、同一个 λ 网格,在论文的面板上能把篮内相关压到五分之一、在这里却连模型都改变不了?可以确定的部分是测量结果:罚项梯度与重构梯度的相对量级。往下是推断,我标明边界:L1 项的相对强度取决于代码的典型量级,而代码量级随资产数与截面结构变化——论文是 433 个资产、2019–2024 的面板,我的是 150 个流动性资产、2022–2024。λ=0.1 在他们的尺度上是有效剂量,搬到这个尺度上就成了安慰剂。还有无法排除的替代解释:作者未公开的实现细节可能让罚项的实际作用与印刷公式不完全一致——比如分批训练方式,又比如损失函数的归约约定:印刷公式没写重构项按资产数 N、L1 项按隐层维度 K 在代码里究竟取 sum 还是 mean,仅这两处分母的组合差异,就足以在有效惩罚强度上制造上百倍的隐式缩放。没有官方代码,这一条只能存疑,不能替作者下结论。
但有一件事不依赖这些推断:在照印刷公式的标准实现下,论文那组 λ 不是可以跨面板搬运的常数。 谁要是在自己的数据上直接套 λ=0.1 然后报告”SAE 的分散化效果”,他很可能在报告一个从未启动的机制。
波动只剩方向,机制直接反转
五折汇总(590 天,money 口径):
| 方法 | 年化波动 | Sharpe |
|---|---|---|
| naive 同日反转 | 31.39% | +1.69 |
| PCA K=64 | 29.54% | +1.75 |
| PCA K=128 | 30.39% | +1.32 |
| SAE K=64(λ=10⁻²) | 29.90% | +0.65 |
| SAE K=128(λ=10⁻³,选定) | 28.97% | +0.96 |
| DenseAE K=64(λ=0) | 29.96% | +0.65 |
SAE-128 对 PCA-128 的波动差是 −4.7%(逐折 −4.0、−4.2、+3.1、−3.0、−10.0,4/5 折方向一致),大约是论文严格口径 −20~26% 的五分之一。统计分量也说清:逐折差的均值是 −3.6%(与池化口径的 −4.7% 不同源,一个是折间平均、一个是按日合并),t 值约 −1.7(n=5),谈不上显著——这里能下的结论只有方向与量级,强度到此为止。K=64 则连方向都没有:SAE 波动比 PCA 高 1.2%。结合上一节,这个结果其实不意外——λ=10⁻³ 选出来的”SAE”本来就近乎稠密,它对 PCA 的微弱优势更像一般自编码器重构的性质,而不是稀疏的功劳。
为避免只看汇总值,五折逐折的 money 口径年化波动如下:
| 方法 | Fold 1 | Fold 2 | Fold 3 | Fold 4 | Fold 5 |
|---|---|---|---|---|---|
| naive 反转 | 22.12% | 31.31% | 32.00% | 31.37% | 37.93% |
| PCA K=64 | 21.71% | 30.42% | 27.16% | 26.53% | 39.22% |
| SAE K=64 | 20.16% | 30.32% | 30.54% | 30.56% | 35.91% |
| PCA K=128 | 21.65% | 30.88% | 29.05% | 29.51% | 38.26% |
| SAE K=128 | 20.78% | 29.58% | 29.95% | 28.61% | 34.42% |
机制层面更干脆。按论文的口径在 rank 尺度、60 日滚动窗内算篮内平均两两相关:SAE-64 多头篮 0.0215、空头篮 0.0297;PCA-64 是 0.0201 / 0.0261;naive 反转篮反而最低,0.0136 / 0.0148。论文报告的是 SAE 0.008 对 PCA 0.039——在我这里排序是反的。如果换原始收益尺度算,所有方法都在 0.56–0.60 挤成一团(共同市场因子主导),同样分不出 SAE 的优势。只有一个子结论方向一致:SAE 篮内资产的个体波动略高于 PCA(日 0.0478 对 0.0466),即它确实没有在”挑安静的资产”——但它挑的资产也并没有更不相关。
| 方法 | 多头篮相关 | 空头篮相关 |
|---|---|---|
| SAE K=64 | 0.0215 | 0.0297 |
| PCA K=64 | 0.0201 | 0.0261 |
| naive 反转 | 0.0136 | 0.0148 |
| 论文报告 SAE / PCA | 0.008 / 0.039 | 0.010 / 0.044 |
所以对论文第一条主张,我的判读是:方向在 K=128 上部分出现,量级未复现;K=64 与机制主张未复现。 这不构成对作者自有面板结果的证伪——面板、窗口、实现都不同——它至少说明,这条主张不能被默认视为可以不经校准就跨面板复用。
论文的几项结论,我的复现有些对上了,有些没有
这篇论文值得肯定的一点是,作者没有把风险下降等同于可交易的 Alpha。论文明确报告了 SAE 没有增量 Sharpe、因子身份不跨随机种子稳定,IC 也没有改善;同时,他们把同收盘成交不可执行、全程不计成本、资产池筛选并非 point-in-time 等限制写在了论文里。我的复现中,这几项否定性结果的方向与作者报告一致;但稀疏度分离没有复现,overlay 则因构造细节不明确而无法作干净判读。
- 没有增量 Sharpe:naive 反转的 money Sharpe +1.69,SAE-64 只有 +0.65、SAE-128 +0.96。预测内容同样没有改善:反转 IC 是 SAE-64 +0.0073、PCA-64 +0.0146(论文 +0.016 对 +0.021,排序一致)。
- 因子不跨种子复现:三个种子两两做匈牙利匹配,解码器余弦 0.217–0.220,随机字典参照 0.198(95 分位 0.203)。略高于随机——大概是共享的市场方向——但离”同一组因子”差得远。论文是 0.13 对 0.117,量级不同(资产数不同,随机基线会变),结论相同。
- 稀疏度分离没有复现:论文的 Hoyer 是 SAE 0.497 对 DenseAE 0.303;我这里是 0.479 对 0.478。把两组数并排看,差距的位置很清楚:SAE 一侧几乎没差(0.497 对 0.479),整个分离缺口来自稠密基线一侧(0.303 对 0.478)。原因也测了:我这里编码中精确为零的比例,SAE 是 47.7%、DenseAE 是 47.6%——ReLU 编码在这个面板上不用任何惩罚就已经近半为零,稠密模型“本来就稀疏”,自然分不出差距。这条其实是上一节的另一面:作者面板上稀疏分离是真的,我的面板上不存在。
overlay 那一条我给不出干净判读,如实记录:按”逐腿 Ledoit–Wolf 最小方差、原始收益协方差、money 口径”实现,overlay 后波动反而升到 59.96%(权重过度集中);换到 rank 尺度实现,波动 8.19(rank 尺度,非百分比),低于 naive 的 8.97 和两个 SAE 变体。论文只说 overlay 用 60 日滚动 LW 协方差作用于 naive 五分位组合,没有写死构造细节,两种实现哪个是”他们的”无法判定。我把自己的构造拆开查过:每腿约 28 个资产,60 日 LW 协方差的条件数中位数约 94,并不病态;问题在权重——最小方差解把每腿集中到约 6 个有效持仓上(最大单股权重中位数 27%),59.96% 是权重集中的结果,不是矩阵奇异。这条只能标为 inconclusive:问题出在复现这一侧,构造细节定不下来。
换成可执行的时序:收益先消失,波动不动
下面这一节是论文没做的,属于我自己的扩展,结论不要算到作者头上。
论文的评估把 t 日收盘形成的信号按 t 日收盘价成交,作者自己注明不可执行。我把同一批篮子改到次日收盘成交(即实际能执行的最早时点),并叠加按换手计的 10 / 25 bps 样式化成本。这个组合的日换手约 3.1(两腿合并权重逐日变动的绝对值之和,满值 4,几乎每天全换):
| 方法 | 同收盘 gross Sharpe | 次日收盘 gross | 同收盘净 10bps | 次日收盘净 25bps |
|---|---|---|---|---|
| SAE-128 | +0.98 | +0.05 | −2.98 | −10.07 |
| SAE-64 | +0.67 | +0.26 | −3.12 | −9.34 |
| naive 反转 | +1.71 | −0.10 | −1.86 | −9.62 |
注:Arm D 按存储的篮子在 589 天上重算(比五折汇总少一天),同收盘 Sharpe 因此与汇总表略有出入(如 SAE-128 的 +0.98 对 +0.96),差异仅源于这一天。
只推迟一天执行,三种方法的 gross Sharpe 全部归零附近——日频反转的钱本来就赚在信号形成后的第一天,这不意外。加上 10 bps 成本后全线转负,25 bps 下深度为负。补一句口径主次:加密是 7×24 市场、没有收盘竞价,“日线收盘”只是一个时刻的快照,所以同收盘加成本那一列其实更接近可执行的近似(真实延迟与滑点仍要另扣);次日收盘是把股票市场的保守口径搬过来,量的是执行缺口的上限,不是加密市场的常态。而波动在所有时序与成本变体下基本不动,保持在 28–31%:成本是平滑的拖累,时序拿走的是反转溢价本身,都不改变风险量。
作者从没声称它能交易;这一节量化的是论文那句免责声明的实际尺寸:从”信号证据”到”可交易结论”,中间隔着的是整套执行假设。 任何日频截面模型在同收盘口径下报出的 Sharpe,都应该先过这一关再谈。
以后审 ML 因子论文,我先跑这一关
这次复现留给我一个比结论本身更耐用的检查,顺序也固定下来了:
- 消融身份检查:把声称的机制关掉(这里就是 λ=0),比对权重、机制统计量(这里是 Hoyer)和下游指标。两者不可区分,就先报告”机制未启动”,不要急着讨论效应大小。我这次如果先跑了这一关,能省下大半程弯路。
- 最笨基线:naive 同日反转在两套面板上都拿到了最高或接近最高的 Sharpe。复杂模型先赢它,再谈别的。
- 教科书 overlay:如果一个协方差 overlay 就能补回大部分优势,模型的增量就只剩残差——这条我这次没能干净复现,但检查本身必须在。
- 种子稳定性:换种子重训、匹配因子、和随机参照比。过不了这一关,“发现了因子”就只是”这次跑出了一些方向”。
回到开头那个 0.999998。它其实是这次复现里信息量最大的一个数字:论文的公式、参数、评估协议都可以逐字照抄,唯独机制的启动与否不会写在纸面上,只能在自己的面板上测出来。波动低四分之一也好、低 4.7% 也好,在确认稀疏真的出现之前,都只是重构模型的数字而已。
复现边界与材料:本文结论限于缩减面板(150 个流动性资产、2022–2024、带存续倾斜)与照印刷公式的自行实现(NumPy,梯度经有限差分校验);作者的 433 资产 2019–2024 面板结果既未被本文证实、也未被证伪。数据为 Binance 公共日线,可按文中规则重建;官方代码截至写作时未公开,文中涉及论文数字均为作者报告并已注明等级。本文只讨论复现方法与证据边界,不构成投资建议。
这次复现的代码、冻结资产清单(含哈希)、逐折结果与判读记录已公开,材料包附有 SHA256SUMS,可逐个校验。
vxime/sae-crypto-factor-replication
如果你想把这次复现放进更完整的量化研究链路,可以接着看因子有效性验证和多因子模型的安全调权:前者解决排序证据是否成立,后者讨论证据进入模型后如何控制权重变更。