
加密机器人步进测试:实例解析
在早期数据上选取参数设置,冻结用于后续测试窗口,并保留权益曲线。详细操作包括日期划分、选取规则、复利处理和未平仓库存决策。
你在同一张图表上测试了二十种机器人配置,并选择了净收益最高的那一个。此时,它的参数设置已经反映了整个期间的信息。如果你再次在相同日期运行该配置,将无法获得任何新的证据。
步进测试会在较早的训练窗口反复选取参数设置,并将其固定用于后续的测试窗口,然后将这些测试窗口的结果合并。 这种方法可以帮助你在市场条件变化的情况下检验选取流程,同时确保每次选取决策时都不会用到未来的价格。
对于GRID和DCA策略,还存在一个额外的会计问题:币种和未平仓头寸可能会跨越窗口边界。在第一个结果出现之前,实用的测试需要为这些持仓制定一条规则。
训练、测试和前向演示是不同的概念
| 术语 | 你的操作 | 可展示内容 |
|---|---|---|
| 样本内训练 | 在较早的历史窗口上比较允许的参数设置 | 你的选取规则会选择哪个候选方案 |
| 样本外历史测试 | 在下一个窗口上运行已选参数设置,不再重新调优 | 该选取方案在后续历史数据上的表现 |
| 步进测试序列 | 随着时间推进,重复训练和测试 | 选取流程的整体表现 |
| 前向演示 | 冻结某一配置,用虚拟资金观察新的市场数据 | 该流程和表现是否在新周期中符合你的预期 |
通用回测指南介绍了历史模拟的更广泛局限性。步进测试增加了反复的时间分割,但并不会消除执行假设、数据错误,或是在看到结果后修改规则的诱惑。
QuantConnect 的步进测试文档介绍了在滑动窗口上进行参数选取,以及优化频率之间的权衡。更频繁地重新优化会带来更多决策,也会增加对近期噪声拟合的机会。

在比较结果之前,先制定测试方案
选择市场、数据周期、时区以及具体候选参数设置。确保候选方案列表足够精简,便于逐一检查。测试三组已明确声明的配置,比在成千上万种未记录的组合中筛选更容易解释。
还需明确:
- 训练窗口和测试窗口的长度,包括精确的边界时间戳。
- 选取指标、最小证据要求以及平分规则。
- 手续费、滑点、最小数量、四舍五入以及成交模型。
- 每个边界处对持仓和未成交订单的处理方式。
- 基准初始资产和再平衡规则。
例如,一个假设的测试方案可以在三组候选参数设置中,选取训练回撤低于设定上限且训练净收益最高的那组。如果没有任何候选方案符合条件,则该策略在下一个测试月份持有现金。在查看测试月份之前,需先明确回撤上限和备用方案。
该限制是选取约束,而不是对未来回撤的承诺。在训练中通过该限制的策略,在测试中仍有可能超过这一回撤水平。
拆分日期时,确保不会重复计算某个月作为测试窗口
在本示例滚动计划中,每次使用三个月作为训练窗口,一个月作为测试窗口。下方所有时间戳均为 UTC,每个区间包含起始时间,不包含结束时间。
| 轮次 | 训练窗口 | 未触及测试窗口 |
|---|---|---|
| 1 | 1月1日 至 4月1日 | 4月1日 至 5月1日 |
| 2 | 2月1日 至 5月1日 | 5月1日 至 6月1日 |
| 3 | 3月1日 至 6月1日 | 6月1日 至 7月1日 |
| 4 | 4月1日 至 7月1日 | 7月1日 至 8月1日 |
训练窗口是重叠的,而四个测试窗口则互不重叠。4月在结束后可以作为下一轮的历史训练数据;但你不能用4月的价格走势来选取在4月本身进行测试的参数设置。
在每个边界处保存所做的选取记录。完整的记录应包括被淘汰的候选方案及其训练指标,以便其他审核者能够还原为何最终方案被选中。
完整的第一轮
下表包含虚构的教学数值。这些并非实际回测结果或市场观测数据。假设所述选取规则要求训练回撤不超过10%,然后从中选取净训练收益最高者。所有收益均已扣除模型所列成本。
| 候选方案 | 训练净收益 | 训练最大回撤 | 符合条件? |
|---|---|---|---|
| A | +5.0% | 8.0% | 是 |
| B | +8.0% | 15.0% | 否 |
| C | +4.0% | 6.0% | 是 |
测试方案选择了A。候选方案B虽然收益更高,但未能满足已设定的回撤约束,因此未被选中。候选方案C尽管在比较中落败,仍然保留在记录中。
锁定A作为四月份的方案。假设教学示例中,A在四月的净收益为−2%。该数值将计入样本外历史测试记录。如果因为C在四月份表现更好而切换到C,就会在决策过程中重复使用该测试月份。
在五月的分界点,原始测试方案会再次使用二月至四月的数据对所有候选方案进行比较。如果C在新的训练比较中胜出,则可以为五月选取C。这是一次有计划的更新,仅使用当时可获得的信息。
将后续测试窗口合并为一条权益曲线
假设接下来的选取和测试收益如下。这些数值延续了同一个虚构的记账示例,并非来自真实的策略回测。
| 测试月份 | 选定配置 | 测试净收益 | 期初权益 | 期末权益 |
|---|---|---|---|---|
| 4月 | A | −2.0% | $1,000.00 | $980.00 |
| 5月 | C | +1.0% | $980.00 | $989.80 |
| 6月 | A | −3.0% | $989.80 | $960.11 |
| 7月 | C | +2.0% | $960.11 | $979.31 |
未取整的期末数值分别为980、989.8、960.106和979.30812。合并后的收益为:
(1 − 0.02) × (1 + 0.01) × (1 − 0.03) × (1 + 0.02) − 1 = −2.069188%。
将这四个百分比相加得到−2%,但这与复合后的结果不同。请将前一个窗口的期末权益带入下一个窗口,并仅在展示时进行四舍五入。
月末观测显示,权益从初始的$1,000出现了约3.99%的最大下跌。由于月内权益可能曾经跌得更低,仅凭每月观测无法确定真实的最大回撤。
在本会计示例中,假设每一次边界重置都已计入所述的月度净收益中。实际回测则必须根据其持仓和成交模型来计算这些重置。
决定如何处理未平仓的GRID或DCA库存
假设某个机器人在四月底持有0.01 BTC和400 USDT。以假设的BTC价格$50,000计算,其权益为900 USDT。新一个月开始时,并不会将其恢复到最初的1,000 USDT。
选择一种一致的边界处理策略:
继承持仓。将实际币种、现金和头寸状态转移到下一个测试窗口。明确参数设置变更对现有订单和库存的影响。模拟器必须支持这种衔接;如果用默认资产重新开始回测,可能无法真实反映这一过程。
平仓并重置。取消所有未成交订单,按照指定的成交模型卖出或平掉剩余持仓,扣除相关成本,并以结算后的权益开启下一个窗口。如果下一个方案需要初始币种库存,也需模拟该部分的买入及其成本。
两种策略都可以反映真实的操作流程。结果出来后再混用这两种策略,可能会掩盖亏损。在基准中应保持一致的策略(如适用),如需展示不同策略的影响,应单独标注为敏感性检验。
检查成交模型和基准
K线触及限价并不能证明你的订单可以全部成交。K线数据还可能隐藏先到达买入价位还是卖出价位的信息。在假设有利于区间内排序的模拟中,密集的GRID参数设置可能看起来很有吸引力。
记录模型对部分成交、排队优先级、价差和跳空的处理方式。在工具支持的情况下,使用更不利的成本或成交条件重复分析。如果结论在成本略有变化后消失,则需要进一步调查。
在进行对比时,请使用相同的日期、初始权益和初始资产。如果机器人以一半加密货币、一半现金的方式启动,而基准则是全仓投资,这两者并不具有直接可比性,除非你明确说明这种资产配置的差异。
回测结果检查清单有助于审查最终报告。请同时保留每月权益曲线、交易活动、持仓敞口和成本,以及总收益。
将最终评估与测试方案设计分开
反复进行步进测试本身也可能变成训练。如果你检查了所有四个月的测试期,修改了候选方案列表,并在同一时间段重新运行,那么更新后的方法实际上已经利用了这几个月的信息。
记录该次修订,并将后续未被触及的历史数据或新的前向数据保留用于下一次评估。对相同日期打上新标签,并不会让这些数据重新变为“未见”数据。
可下载的记录可以很简单:每轮一行,包含训练日期、候选版本、选取指标、选定配置、测试日期、成本模型、边界策略和测试净结果。请保留原始报告和数据引用作为补充。下方示例中,虚构的表格以可导出的CSV格式提供,便于练习记账。
在完成历史回测后,进行一次固定的前向演示
练习本实例的账务处理
下载这四个月的虚构测试数据行,包括期初和期末权益。这些数值仅用于教学示例,并非回测报告。
在 Bitsgap 演示中观察您的设置
在支持所需窗口和记账功能的工具中完成历史分析后,将受支持的机器人配置冻结在 Bitsgap 演示中。记录其初始资产和参数设置,然后使用虚拟资金和当前市场价格进行观察。演示是一个独立的前向演练;此流程并不假设内置步进测试优化器。
常见问题解答
步进测试能防止过拟合吗?
通过将每个选取窗口与其后续测试分离,步进测试减少了一种样本内偏差的来源。但反复更改测试方案、数据泄漏、不现实的成交以及选择性报告,仍然可能导致结果具有误导性。
窗口应该设置多长时间?
没有固定的窗口长度。窗口中包含的数据量取决于交易频率、可用历史数据以及选取方法。本文采用三个月训练窗口和一个月测试窗口,仅作为教学示例。
我可以将不同测试窗口的收益相加吗?
当每个测试窗口都以前一窗口的期末权益为起点时,应复利计算连续收益。同时要保留完整的权益曲线、成本和风险敞口;仅有最终百分比会掩盖重要差异。
前向演示和样本外历史测试是一样的吗?
样本外历史测试是在模拟器中使用后续的历史数据进行测试。前向演示则是用虚拟资金观察新的实时数据。两者都有局限性,都无法保证实盘成交或未来收益。