AI 回测的"未来函数":为什么回测很美、实盘就崩

"给模型 2023 年 3 月的数据,看它能否做出好决策"——听起来公平,但很多今天标记为 3 月的数据,当时根本不存在:指标 4 月才发布、数值后来被修订、K 线当时还没走完。小的时间偏差,能制造出很大的性能幻觉。这篇讲清未来函数的来源与防御。

AI 回测的"未来函数":为什么回测很美、实盘就崩
一键发币: x402兼容 | Aptos | X Layer | SUI | SOL | BNB | ETH | BASE | ARB | OP | Polygon | Avalanche

AI 让量化研究变快了:写策略、跑回测、调参数,现在一个人一周能完成过去一个团队一个月的工作量。

但它也让一个老问题变得更隐蔽:未来函数(lookahead bias / data leakage)——回测中模型"偷看"了它在真实环境下不可能知道的信息。HackerNoon 的一篇文章用一个很直观的例子说明了它有多难察觉:

你想测试一个交易 AI 在 2023 年 3 月 15 日能不能做出好决策。你给它当天的价格、成交量、经济指标。乍看很公平——模型没有看到 3 月 15 日之后的任何数据。
今天被标记为"2023 年 3 月"的数据,当年可能并不存在。

这篇文章把未来函数的来源、证据与防御整理成一份可执行的清单。

为什么 AI 让这个问题变得更严重

未来函数并不是新问题,量化研究者与教科书已经讨论了很多年。但 AI 改变了三件事:

  1. 默认管道更方便:AI 生成的代码会自然地使用 forward_fill、随机切分、全样本标准化这类“方便”操作——它们写起来最短,但恰恰是泄漏的高发区;
  2. 模型比人更擅长发现“捷径”:机器学习会捕捉任何能降低训练损失的规律,包括那些只存在于“未来信息”里的规律。你看到的“模型很聪明”,可能是模型很会作弊;
  3. 迭代速度拼过了审查速度:从想法到回测从几天缩到几分钟,但验证泄漏所需的时间没有变——结果就是“回测很美”的策略被飞快地推到实盘。

换句话说:AI 提高了研究的吞吐量,但泄漏检查仍然是一个需要人工判断的环节。

未来函数不只是"明天的价格"

大多数人听到数据泄漏,想到的是低级错误:把明天的比特币价格喂给模型。但真正难缠的是点时间(point-in-time)问题:

  • 发布滞后:一个指标标注为 3 月,但官方 4 月才发布——回测在 3 月就用上了它;
  • 数值修订:GDP、就业等宏观数据会被多次修订。你从数据库里拿到的是"最终值",而当时的交易者只能看到"初值";
  • 未完成的 K 线:更高周期的 K 线在回测里被当作已完成的数据使用,实际当时它只走了一半;
  • 数据库静默替换:数据供应商把旧值悄悄替换为修正后的新值,但回测代码不会知道这个差异。

HackerNoon 的结论很准确:"数据点上的日期,并不总是足够。" 对金融机器学习来说,和"这个数据属于哪一天"同样重要的是——"这一天,它出现了吗?出现在哪里?长什么样?"

论文证据:小的时间偏差,大的性能幻觉

2026 年的一篇预印本《When Alpha Disappears: A One-Switch Benchmark for Decision-Time Leakage in Financial Backtests》专门研究这个问题:只改变特定时间假设、保持实验其余部分不变,观察结果的差异。

结论是:违反"决策时点信息边界"(即用了当时拿不到的信息)能显著提升预测与交易表现。换句话说,很多看起来漂亮的回测,收益来源不是策略好,而是时间设定错了。

需要说明的是:这是一篇预印本(preprint),不应被当作最终科学共识;但它提供了一个非常有用的方法论——把泄漏当作一个可以开关的变量来测试。如果你怀疑自己的回测有泄漏,可以仿照这个思路:只修正时间假设,重跑一遍,看收益还剩多少。

常见泄漏清单(逐条核对)

把下面这些当作回测审计表,出现任何一条都要标记:

  1. 宏观数据用终值:GDP/CPI/就业用修订后的最终值,而不是当时的初值;
  2. 财报数据用报表期而非发布日:财报口径按季度归属,但实际交易者只能在发布日之后知道;
  3. 资金费率/持仓量前向填充:把 funding、Open Interest 这类非价格序列直接 forward-fill 到价格 K 线上,制造了"当时就知道"的假象;
  4. 跨周期信号错配:用日线信号触发小时线交易,但日线收盘在当天结束时才确定;
  5. 滚动窗口包含当前 bar:计算滚动指标时把正在交易的那根 K 线算进去("未来一根");
  6. 随机切分训练/测试集:时间序列必须按时间顺序切分,不能随机打乱;
  7. 全样本标准化:用整个数据集(含测试期)的均值和方差做特征标准化;
  8. 事件日历缺失:分红、拆分、上市/退市、合约换月等事件没有做时点对齐;
  9. 数据快照无版本:回测没有记录当时使用的数据版本,无法复现也无法审计;
  10. AI 生成数据污染:用生成模型合成训练数据时,把未来信息或测试集统计特征"学"进了训练集。

第 6、7、10 条是 AI 时代最常见的新增泄漏源——工具越方便,越容易在管道里悄悄混入未来。

生成式数据:有前景,但不能用来"绕过"泄漏

AI 训练需要数据,而市场数据的稀缺性催生了"生成市场数据"的研究方向。Jane Street 的博客在 10 月 9 日介绍了他们 2026 年暑期实习项目的一个尝试:用扩散模型生成订单簿事件序列。

这篇博客最有价值的部分不是结果,而是它对市场数据本质的观察:

  • 市场数据既不是连续的,也不是离散的:订单簿事件有离散的动作空间,但价格、时间等参数是连续的;
  • 特征分布存在尖边界与点质量:订单到达时间在"零秒(同时到达)""最早可能反应时间""整秒"处聚集;价格在买价、卖价、中点处聚集;
  • 技术选择上,理论上更适合去噪的 DDPM 在实践中发散,flow matching 表现更好;纯粹的连续扩散模型难以处理真实市场数据的"锯齿状"分布。

结论是:生成数据是有前景的研究方向(用于数据增强、压力测试),但它不能解决泄漏问题——如果生成模型的训练集或统计特征里混入了未来信息,泄漏只会更隐蔽。用它之前,先问一句:"这个模型是在什么时候、用什么数据训练的?"

工程化解法:把时间语义写进系统

如果未来函数这么难防,工程上该怎么办?结合 HackerNoon 的清单、Keel 的设计与数据工具链的进展,可以得到四条实践原则:

  1. 点时间数据库 + as-of 查询:存"数据在某个时点可见的版本",查询时显式带上 as-of 时间;同时保留修订历史与数据版本号。没有版本化的回测是不可复现的;
  2. 让时间语义显式化:Keel 的做法值得借鉴——每个值携带一个"时钟"(周期、相位),跨周期组合必须通过显式投影器;类型系统直接区分"预测值(forecast)"与"仓位权重(weight)",让写错的时间对齐无法通过校验;
  3. 回测与实盘使用同一份产物:策略保存时编译成锁定产物(类似 lockfile 固定依赖),保证"回测跑的是什么,实盘就跑什么";每一笔实盘订单都能追溯到产生它的版本;
  4. 审计与复现:记录每次回测的数据指纹(data fingerprint),一年后重跑同一策略应得到相同结果。Polars 2.0 这类数据工具在 10 月的发布,也说明研究基础设施正在向"更快、更可复现"演进。

给个人研究者的自检习惯

即使没有企业级基础设施,也可以做三件事:

  • 加延迟:在信号与下单之间人为加入一个 bar 的延迟,看收益是否大幅缩水;
  • 加成本:把手续费、滑点设得比预期更悲观,看策略是否仍然为正;
  • 留出样本外:保留最近 20% 的数据完全不动,只在最后验证一次——不要反复用它调参。

一个泄漏案例的拆解

用 HackerNoon 的宏观指标例子走一遍完整流程,会更容易理解为什么它难以发现:

背景:你想回测“2026 年 3 月 15 日基于 CPI 数据做决策”的策略。数据供应商给你的表中,3 月的 CPI 是一个精确值。

实际发生的事:

  1. 3 月的 CPI 初值在 4 月中旬才发布;
  2. 该数值此后还经历了多次修订;
  3. 你的回测在 3 月 15 日就用上了这个“精确值”。

后果:模型实际上“提前一个月”知道了通胀数据。在任何一次真实的交易中,它都不可能拿到这个信息。回测收益因此被夸大,而实盘会遇到真正的信息滞后——这就是“回测很美、实盘就崩”的一个典型来源。

修复方式:

  • 使用带发布时点的点时间数据(每个值存“何时可见”而不只是“属于哪期”);
  • 如果供应商只有终值,就在策略层手动为发布滞后建模(例如:将数值可用时间设为发布日,而非统计期结束日);
  • 对涉及修订的指标,保存初值与修订版本,回测时只用“当时可见”的版本。

个人研究者的最小可行方案

没有企业级数据基础设施,也可以把泄漏控制在一个可接受的水平:

  1. 尽量选提供 point-in-time 的数据源(交易所自身的逐笔/ K 线数据通常比第三方整合数据更干净);
  2. 给每份数据集打快照与版本号(哈希或日期后缀),回测记录使用版本;
  3. 在信号与下单之间加一个 bar 的延迟、把成本设得比预期悲观,作为对泄漏的“压力测试”;
  4. 保留一段从未参与调参的样本外数据,只在最终验证时使用一次。

这四步不能保证零泄漏,但能过滤掉绝大多数“回测幻觉”。

常见问题(FAQ)

Q:回测收益太高,一定是泄漏吗?

A:不一定,但可以按这个顺序排查:先加延迟与成本、再检查数据时点(发布日/修订)、最后用样本外验证。三者都通过,才有讨论价值。

Q:用 AI 写策略是不是更容易泄漏?

A:AI 提高的是研究速度,不改变泄漏的原理。但 AI 会大量使用"默认方便"的数据管道(forward-fill、随机切分),如果不显式约束,泄漏更容易被批量引入。

Q:如何验证数据供应商的"点时间"质量?

A:抽查关键字段:取一条历史宏观数据,对比它的"初值发布时间"与当前值是否一致;如果供应商只提供最终值,就要在策略里为发布滞后手动建模。

Q:生成数据值得用吗?

A:作为压力测试与数据增强的补充值得研究;但不要用它替代真实数据的验证,尤其不能用它来"证明"策略有效。

相关阅读

原文链接

  1. HackerNoon — How Trading AI Can Accidentally See the Future — and How to Prevent It(2026-09-09)https://hackernoon.com/how-trading-ai-can-accidentally-see-the-future-and-how-to-prevent-it
  2. Jane Street Blog — Can you use autoregressive diffusion to generate market data?(2026-10-09)https://blog.janestreet.com/can-you-use-autoregressive-diffusion-to-generate-market-data/
  3. Keel — How Keel works(2026-10)https://usekeel.io/how-it-works
  4. Polars — Release of Polars 2.0(2026-10-06)https://pola.rs/posts/release-polars-2/
  5. OpenAI — How Third Moment Research runs 10,000 agents for 36+ hours(2026-10-14)

DefiPlot 翻译整理,转载请标明出处。

免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。

本文属于「AI × 加密交易」专题。查看专题全部文章 →
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。