回测工具可能对同一个交易想法给出不同答案,因为它们可能使用不同的数据、指标时点、订单模拟和成本假设。选择软件时,应问自己能否检查并复现这些选择——而不是比较哪条净值曲线最高。回测是一种历史模型;其输出并不表明某个策略会盈利,也不表明真实交易场所会以同样方式成交。
从一套受控测试包开始
在比较功能之前,先写一份简短、固定的研究规格:市场与合约、数据间隔与日期、信号规则、下单时点、仓位大小、手续费与资金费率。保存输入的K线和策略版本。尽可能在每个候选软件中使用相同的文件和设置,并记录任何导致无法完全一致的转换。
| 领域 | 测试问题 | 需保留的证据 |
|---|---|---|
| 数据 | 能否识别提供方、市场类型、时间戳、时区、缺口和合成行? | 来源、获取日期、覆盖范围、原始导出或指纹 |
| 信号时点 | 规则是否基于当时可获得的信息进行评估?其订单最早何时可以成交? | 信号时间戳、K线约定、入场时间戳 |
| 订单 | 遇到跳空、部分成交、过期价格,或同时触及止损与目标的K线时会发生什么? | 订单事件、成交模型、模糊K线处理规则 |
| 成本与合约 | 手续费档位、买卖价差、滑点、资金费率结算、最小变动价位、保证金和强平假设是否明确? | 配置与成本台账;将未知项标记为未建模 |
| 可复现性 | 能否再次运行并检查完全相同的策略、数据和引擎版本? | 策略版本、输入指纹、设置、交易台账 |
缺失值应保持可见。如果资金费率数据不可得,一个默默将其视为零的工具,与一个排除该现金流并加以标注的工具,做出的假设并不相同。在比较结果之前,先确认现货、有到期日合约或永续合约的语义;这些工具并不共享同一套资金费率或保证金模型。
使用四项可能失败的测试
- 时点检查: 构造一段简短、可人工检查的K线序列。记录信号何时变得已知,以及引擎使用哪一个下一价格。加入一个跳空,以便观察在所选模型下,止损是在其价位成交,还是以更差的可得价格成交。
- 模糊性检查: 加入一根最高价和最低价同时越过止损和目标的K线。仅凭OHLC K线无法揭示哪一个先发生。有用的工具会公开其先后顺序规则,或将结果标记为模糊;它不应悄悄把某一条路径当作已观察到的事实呈现。
- 无窥探检查: 冻结一次运行,然后追加后续K线。此前的信号和订单事件不应仅因为加入了未来行而发生偏移;在原样本末端仍持有的仓位之后可能收到退出。若失败,则提示存在前视、数据修订或需要调查的有状态规则。
- 重跑与成本检查: 重复相同的冻结输入,然后每次只改变一个假设。验证相同输入的运行可复现,且新增的手续费、资金费率或滑点只进入台账一次。保存两次运行,而不是只保留更有吸引力的那一次。
运行一套小型证伪包
使用少量你已知道有哪些信息可用、以及引擎必须披露什么的样本。目标是在花时间进行大规模策略搜索之前,先暴露假设。
- 收盘信号: 让信号依赖某根K线的最终收盘价。记录该收盘价何时可知,以及引擎首次允许的模拟成交。更早的成交需要明确的其他数据或订单机制;仅在K线上加标签并不构成执行证据。
- 跳空穿越止损: 将止损设在 $95,并让下一个观察到的价格开盘于 $92。询问该模型能否在止损价位、下一个可得价格,或其他明确规则下成交。当所选行为可见且与其文档化的订单模型一致时,测试通过,而不是当每个工具都打印出相同数字时。
- 同一根K线内的止损与目标: 将止损和目标放在该K线的最高价与最低价区间内。仅凭OHLC无法显示哪个价格先出现。工具应披露其假设的顺序,在可得时使用更细的数据,或将结果标记为模糊。
- 缺失的持有成本: 移除某一区间的资金费率观测值。检查该运行是保留“未知”、在警告下排除缺失的现金流,还是应用已披露的兜底值。悄悄将缺失数据转换为零费用,会改变问题本身。
- 精确重跑: 使用相同保存的数据、规则、引擎版本和设置重新运行。比较交易事件和台账合计。然后追加后续K线,确认此前的已平仓事件不变;在原截止时点仍持有的仓位之后可能收到退出。
保留每项测试的输入文件、预期行为、观察到的输出、版本和决定。将结果记录为已验证、可配置、有限或未记录。不要将这些标签平均成一个产品评分:未记录的跳空成交规则无法被精美的图表所抵消。同样,一项玩具测试失败,是提示你去复现并理解差异,而不是证明整个产品不可用。
订单模拟是一种软件选择,而不是一种名为“真实”的普遍属性。TradingView 当前的 Pine Script v6 文档描述了一个经纪商模拟器,它从图表数据成交,并在历史K线上假设一条K线内价格路径;其 Bar Magnifier 在可得时可使用更低时间周期的K线。QuantConnect 当前的成交模型文档称其预置回测成交模型假设完全成交,并描述了过期价格行为。这些是特定平台的示例,并非排名。它们说明了为什么你应阅读所考虑的确切产品、版本和设置对应的模型。
先比较证据,再比较评分
如果两个工具出现分歧,比较交易台账中第一行不同的记录:信号时间、订单时间、成交价格、数量、手续费、资金费率或退出原因。在看总体收益之前,先检查数据和执行假设。当引擎实现不同规则时,匹配的输入并不要求结果完全相同;目标是解释差异,并判断每个模型是否适合该问题。
留出期只有在看到它之后所做的决定被记录下来时才有帮助。反复针对同一份“未触碰”的数据进行调优,会把它变成另一个研究样本。Probability of Backtest Overfitting 论文讨论了为什么简单的留出法可能无法捕捉反复的策略选择。保留一份变更日志,既记录被丢弃的变体,也记录保留的变体;不要将某个软件最强的运行结果当作独立证据。
最后,查看当前供应商条款中的安全性、数据导出、账户权限、定价和保留政策。只读的公开市场连接、假设性的模拟订单和已签署的实盘订单是不同的能力。绝不要仅仅为了查看图表或回放历史数据而提供签名密钥。
SuperQuant 的引擎运行每小时回测,其独立的模拟交易流程为手动操作;内置的样本历史数据为合成数据。其成交和保证金计算为简化模型,未经过交易所认证,也不提交实盘订单。这些边界描述的是本产品,并非声称其更优越。使用回测教程、成本指南和数据质量指南来检查相关假设。本指南仅供教育用途,不构成产品背书或投资建议。