当前瞻偏差发生时,历史测试使用了在模拟决策或订单发生时尚不可获取的信息。策略规则可能非常简单,代码也可以无报错运行,但测试结果却依赖了未来的信息。一次有效的审计应当对每个输入项提出如下疑问:该数值最早何时可知?策略规则何时对其进行了计算评估?以及模拟操作使用了其后的哪一价格?

按时间顺序划分的研究窗口按时间顺序进行的测试会切分历史数据,使未来的评估区间不参与更早参数的选取;但后续信息仍可能影响研究者的反复决策。较早的观测在此指定并估计参数留出集评估一次较晚后续复核最早时间 →留出集能减少一种形式的复用;但它无法消除反复的研究选择,也不能保证未来表现
按时间顺序进行的测试会切分历史数据,使未来的评估区间不参与更早参数的选取;但后续信息仍可能影响研究者的反复决策。 教学示意图 · 非实时市场数据

K线收盘价仅在走完之后才可知

每根 OHLC K线都概括了一个时间区间。其最终的最高价、最低价、收盘价和成交量在 K线 开盘时均未成型。如果突破规则依赖于一小时 K线 的最终收盘价,测试就不应该在该同一根 K线 较早的开盘价处入场。符合因果逻辑的做法是在 K线 走完时计算评估收盘价,并以其后可用的价格(例如下一根 K线 的开盘价)来模拟决策或入场——且必须明确将该约定标注为模型设定。就具体的代码时序而言,TradingView 的 Pine Script K线状态与时间文档 区分了已确认的 K线 与正在形成的实时 K线;但这些语言层面的技术细节并不能证明交易所订单一定会在下一根 K线 的开盘价处成交。

同样,切勿假设下一根 K线 的开盘价一定能保证成交。跳空缺口可能穿过该点位,买卖价差可能较为显著,订单可能被拒绝或部分成交,而且真实的订单簿情况可能不得而知。修正信息时序仅仅消除了其中一种偏差;并不能凭空产生切合实际的执行证据。

案例解析:更高时间周期的数值到达更晚

假设一项一小时周期的研究使用四小时收盘价,并测试“当四小时收盘价高于 $100 时采取行动”这一规则。一根四小时 K线 起始于 UTC 时间 08:00。上一个已确认的四小时收盘价为 $98;当前 K线 最终在 12:00 以 $104 收盘。在 09:00 时,最终的 $104 尚不可知,然而在历史回测中,使用未加偏移量的 barmerge.lookahead_on 调用 request.security(),可能会将该最终值置于该四小时窗口内的最初几个小时 K线 上。因此,回测可能会显示该条件在中午之前就已经满足。在实盘实时数据中,当前的四小时收盘价仍在形成当中;在最终确认之前,价格完全可以在 $100 上下反复波动。TradingView 既记录了这种历史未来数据泄漏,也记录了通过在 lookahead_on 中使用一根 K线 偏移量来获取已确认数值的模式。该模式明确使用的是前一根已走完的四小时数值;它并不会让当前 K线 的最终收盘价提前变得可用。

在本例中,在 08:00–12:00 区间内,$98 始终是唯一经确认的输入值。如果策略规则选择等待走完的 $104 收盘价,则应将决策时间戳记录在 12:00 或之后,并以随后的下一个合规价格来模拟订单。TradingView 的经纪商模拟器采用其自有的历史成交假定,默认包括 next-tick(下一个变动价位)约定;但无论是该约定还是整洁的图表,都无法保证在真实的交易所撮合中获得真实成交。上述日期与价格均为虚构,仅用于演示信息时序逻辑。

前视信息与较晚入场时间线基于已完成 K 线的规则无法在该 K 线开盘时知道最终收盘价。红色的同 K 线入场会早于触发它所使用的信息;绿色的建模操作仅在信号已知之后发生,且仍须视为一种执行假设。追问在确切的决策时点已知什么第 N 根 K 线 · 形成中开盘价已知 · 最终收盘价尚不可知第 N 根 K 线 · 已确认信号此时可以已计算开盘收盘下一个可用价格时序无效:同一根 K 线的开盘早于基于收盘价的信号因果模型:先有信号,后有操作后续 K 线的价格仍属模型假设,并非保证成交
基于已完成 K 线的规则无法在该 K 线开盘时知道最终收盘价。红色的同 K 线入场会早于触发它所使用的信息;绿色的建模操作仅在信号已知之后发生,且仍须视为一种执行假设。 教学说明图 · 非实时市场数据

沿时间线追踪每一项输入数据

为策略规则的各个字段建立表格:指标数值、滚动最大值或最小值、资金费率观察值、市场环境标签、成交量以及任何外部事件。针对每一项,记录其时间戳、最终定型时间及数据源。仔细检查旨在描述先前 K线 的滚动窗口是否意外包含了当前正在形成的 K线。确认经过修订或修正的数据集没有替代历史当时实际已知的数据。

将发布时间与事件发生时间视作不同的字段。资金费率可能带有周期标签,但实际公布或结算可能发生在稍后的时点;经济数据或交易所公告可能会被修订;K线 收盘则具有明确声明的区间界限。既要记录事件时间戳,也要记录该数值何时真正对策略规则可用。对于转折点、波段高低点或需要后续 K线 才能确认的标签,请显式记录其确认延迟时间。切勿将确认后的标签倒推倒填至转折点时刻,除非该策略仅凭当时已接收到的数据就能够采取行动。

警惕后见之明所生成的标签。除非策略规则在确认前设定了明确的延迟,否则将某根 K线 标记为“局部底部”必然需要后续的观察数据。基于最终文章生成的快讯分类可能会包含事件发生后才发布的措辞。当前的成分代币列表可能会忽略那些后来消失退市的资产。即使是一个听起来纯属客观描述的过滤器,如果其计算跨越了测试边界,同样会泄漏未来信息。

检查模拟程序如何处理每根 K线

写明每根 K线 观察值的执行时序:计算指标、判定信号、结算相关现金流、评估现有持仓、提交或模拟订单、处理保护性止损止盈点位、对权益进行盯市标记并保存账本。这一先后顺序至关重要。如果仓位是在开盘结算之后才进场的,就不应当像开盘前已持仓那样被扣取费用。如果在单根 K线 内同时触及了止损和止盈目标,单凭 OHLC K线 往往无法揭示究竟哪一个先触发;该模型需要采用保守或明确标明不确定性的约定。

SuperQuant 记载了一种特定的时序规范:交易意图使用上一根已收盘的 K线;现有持仓在新 K线 开盘时接受合规的资金费结算;随后对符合条件的出场与入场进行评估;K线 内部的保护性出场则遵循既定的不确定性处理逻辑。这限制了该引擎内部的前瞻偏差,但仍属于简化的小时级别模型。所附带的历史数据为合成数据。当产品发生更新时,请重新审查当前的实现方式与方法学。

进行小规模人工审计

挑选一笔已记录的交易,在不依赖汇总图表的情况下对其进行复原重构。找出信号 K线 以及在其收盘时已知的确切数据。根据先前的数据重新计算指标。找到模拟的入场时间戳并核实其确实晚于信号时间。然后将每一次平仓、手续费和结算追踪至当时已知发生的事件。将你的人工计算结果与系统账本进行核对。在解读策略表现之前,务必查明任何差异的原因。

完成本次时序审查后,请在过拟合指南中单独评估参数选择问题。回测教程与审计清单有助于保存这些假设。时序审计无法证明某个策略能够盈利或具有可执行性;它只能表明测试没有明知故犯地使用不可获取的信息。本文属于通识性研究教育,不构成投资建议。

审计回测中信息时点的流程对每个信号输入,确定其事件时间戳与最早可知时间,确认策略只使用当时可得的数值,在决策之后对订单建模,然后对比历史表现与实时表现。未经确认的高时间周期数据、回溯设定的枢轴点和修订后的标签应退回审计,而不是当作可得事实处理。追踪每个数值从发生到可行动的全过程01 · 时间戳事件 + 间隔来源版本02 · 确认K线收盘 · 发布时间修订 · 延迟03 · 决策仅使用已确认输入不使用未来标签04 · 订单建模之后符合条件的价格成本 + 成交限制05 · 核对历史 vs 实时保留差异存在未确认数值,或无法解释的历史与实时不一致?暂停解读 · 追溯数据路径 · 修正规则后重新运行审计辅助 · 时点正确并不代表执行质量或盈利能力
对每个信号输入,确定其事件时间戳与最早可知时间,确认策略只使用当时可得的数值,在决策之后对订单建模,然后对比历史表现与实时表现。未经确认的高时间周期数据、回溯设定的枢轴点和修订后的标签应退回审计,而不是当作可得事实处理。 教学说明图 · 非实时市场数据