AI 策略智能体可能生成有效的回测,却使用了交易本应发生时尚不存在的信息。代码能运行,权益曲线看起来也合理,信号甚至可能很有道理。但某个时间戳、一次数据连接,或一个经过修订的数据字段,可能悄悄让它提前知道了明天的答案。
解决办法是把数据可用时间纳入研究约定。每项输入都要明确回答两个问题:这个值描述的是什么时间,以及策略最早何时能知道这个值?
AI 生成的策略会出现哪些前视偏差?
最明显的情况是:用同一根 K 线的收盘价计算信号,却假设在这个收盘价成交。如果策略需要收盘价才能做决定,就不可能同时按这个价格交易。但智能体在连接数据源或选择方便的默认值时,常会制造更隐蔽的版本。
假设模型在每分钟收盘时计算 20 根 K 线移动平均,并在收盘价穿越均线时建仓。如果回测假设在同一个收盘价成交,就等于在策略尚未获得该笔最后成交价时,已经用它做了决策。把订单推迟到下一根 K 线开盘,可能是合理的近似,但市价单仍需计入手续费和冲击成本。
现在把特征换成每日股票基本面数据或加密货币未平仓合约快照。记录日期可能标为星期一,但该值也许在星期一收盘后才发布,或者之后又被修正。日期不等于可用时间戳。
策略输入应该如何标记时间戳?
在数据源允许的情况下,至少保留 3 种时间:数值所描述的时段、发布方公布该值的时间,以及系统收到该值的时间。策略在决策时刻的信息集只能包含当时已经可用的值。
| 字段 | 说明的问题 | 常见陷阱 |
|---|---|---|
| 事件时间 | 市场事件何时发生? | K 线尚未完成就使用其收盘价 |
| 发布时间 | 数据源何时发布这个值? | 把日终标签当成开盘时发布的数据 |
| 接收时间 | 研究系统何时能读取这个值? | 忽略供应商或处理管道的延迟 |
| 修订时间 | 这个版本何时被记录或修正? | 把修订后的历史数据回填,仿佛它就是原始数据 |
对于 1 分钟策略,1 秒的延迟不一定无关紧要。影响大小取决于决策时机和信号所用的数据。如果输入是已完成的小时统计数据,影响可能很小;如果输入是在下单前后采样的订单簿失衡数据,就可能让交易方向反转。
时点数据存储能防止信息泄露吗?
如果“时点数据”意味着你可以检索历史决策时刻已知的值,包括当时的版本,那就有帮助。仅仅带有历史日期的表格,仍可能包含这些日期对应的今日修正值。
每条记录都要保留有效时间区间和可用时间戳,并保留各个版本,不要直接覆盖。然后明确执行历史查询:返回模拟决策时刻之前已可用的最新版本。这对基本面数据、指数成分、经济数据发布和经过供应商清洗的数据集尤其重要。
还有个不那么显眼的实际问题:如果数据摄取任务晚了 20 分钟运行,再准确的发布时间也没有用。如果历史存储没有记录摄取时间,就采用保守的延迟假设,并明确说明。数据源从未记录过的精度,只是装饰。
模拟交易前,哪些检查能发现前视偏差?
要求研究智能体在回测之外,同时输出特征和订单时间线。对每次决策,记录每项特征对应数据源的最新可用时间、决策时间、下单时间和模拟成交时间。任何输入晚于决策时间的记录都应拒绝。
- 把信号向后移 1 根 K 线并比较结果。结果大幅下滑可能暴露出对收盘到收盘时序的依赖,但这只是诊断手段,并不能证明存在信息泄露。
- 将每个数据源截断到某个历史时点,重新运行处理管道,并把生成的特征与已存储的历史特征进行比较。
- 将疑似有问题的特征替换为常量。如果表现几乎不变,就检查代码是否真的使用了预期的数据序列。
- 把一个刻意构造的不可能的未来特征送入处理管道。如果其可用时间晚于决策时间,验证流程应明确报错。
这些检查不能为策略背书。它们能让具体的时序假设清晰可见,并发现这些假设常见的违背方式。
模拟交易能证明回测没有信息泄露吗?
不能。模拟交易可以暴露实时数据链路是否存在延迟、数据缺失或与历史数据对齐方式不同的问题,但无法证明旧的训练特征反映了当时已知的信息。模型也可能仅仅因为之前意外看到的未来如今已经变成现在,而不再受益于信息泄露。
把模拟交易用作一致性检查:比较实时特征值、决策时间戳、订单生成过程和模拟成交情况是否符合回测定义。发现差异时,追查具体输入和时钟。能够解释每次决策所用信息集的智能体团队,才是在做有价值的研究。只能给你看一条平滑曲线的团队,跳过了最难的审计。
← 全部文章


