# 交易策略回测

重要提示

这里所指的策略回测,不仅仅是用历史行情验证策略的收益情况;
而是更泛指整个策略工程代码的验证,包括策略代码是否有BUG、策略的历史表现、以及可能出现的策略过拟合验证

交易策略的回测验证工作,其实可以拆解成三个阶段分别进行:

  1. 代码逻辑验证:此阶段的验证目标,是确保所有自定义部分的策略逻辑都执行过,并且没有代码逻辑漏洞,比如有没有空指针异常、数组越界访问异常、死循环等等。
  2. 策略逻辑验证:此阶段的验证目标,是确保策略的期望收益、盈亏比、胜率、回撤幅度等符合个人期望。
  3. 过拟合验证:此阶段的验证目标,是确保策略没有因为对历史行情过度优化,而出现过拟合现象,主要通过对比使用实盘数据测试所得出的期望收益、盈亏比、胜率、回撤幅度与使用历史行情数据测试所得出的值对比,看看是否出现显著性差异。

# 回测的准备工作

# 准备三个不同类型的行情网关

回测准备——行情网关

# SIM行情网关

主要用于 代码逻辑验证。(这个不是绝对的,进行 代码逻辑验证 也可以用其他类型的网关,这里为了区分每个阶段的不同,就使用不同类型的行情网关以示区别)

在行情管理界面

  • 点击【新建】;
  • 弹窗中点击【网关类型】选项,选中【SIM】;
  • 点击【订阅合约】选项,选中【模拟期货合约】;
  • 点击【保存】

# PLAYBACK行情网关

主要用于 策略逻辑验证
历史行情回放的原理,请参考历史行情回放

具体操作参考如何创建PLAYBACK行情网关

# CTP行情网关

主要用于 过拟合验证

具体操作参考如何创建CTP行情网关

# 准备模拟账户

具体操作参考如何创建模拟账户

# 分别准备好要验证的策略模组

最佳实践

针对不同的目标,分别建立对应的策略模组。
比如用于历史回测的建一个模组,用于实盘模拟验证的建一个模组,用于实盘生产环境账户的建一个模组。
这样有利于对比同一个策略在不同情况下的绩效表现,以判断是否出现策略过拟合情况。

在模组管理界面

  • 点击【新建】
  • 在基础信息页
    • 填写【模组名称】
    • 选择【模组类型】
    • 根据不同的阶段,选择【模组用途】。试运行与实盘模拟阶段用【模拟盘】,历史数据验证阶段用【回测】
    • 填写【绑定合约】,如果不知道填什么,可使用【合约查询】,合约名称的命名方式是"symbol@exchange@FUTURES",例如螺纹2205合约名称为rb2205@SHFE@FUTURES。
    • 选择【平仓优化】策略,关于平仓优化策略的说明可参考用户UI界面介绍#模组管理
    • 设置使用多少分钟【K线周期】,即交易策略收到的Bar是以多少分钟为周期计算的。
    • 设置加载多少天【预热数据量】,即模组在初始化时,至少加载多少天的数据预热(实际加载的预热数据只会比这个数多)
    • 设置【缓存数据量】,即在模组运行状态界面可以观察到的数据回溯长度,比如默认是500,即在模组运行状态界面的数据透视图可以看到最近的500个K线数据及相应的指标数据。需要注意的是,该值不能过大,因为会占用大量内存;也不宜过小,因为过小不便于观察。合理建议值在100-500之间。
  • 在交易策略页
    • 选择【绑定策略】
  • 在账户绑定页
    • 选择【绑定账户】,可多选,视交易策略逻辑而定;然后设置账户具体绑定的合约与模组要分配的金额
  • 点击【保存】

# 代码逻辑验证阶段:代码试运行

代码试运行(Dry-Run)是在软件工程里一个重要的概念。 试运行的目标是通过运行程序来检验代码是否存在一些未知的BUG。因此在这阶段,注意力只需要放在代码逻辑是否有BUG上,先忽略交易策略是否能盈利的问题。 另外要注意的是,试运行要关注代码逻辑的覆盖情况,确保试运行结束时,所有的逻辑分支都已经覆盖过。

选择用途为【模拟盘】的模组,启动模组。
然后便可以连线账户、连线行情网关,进行测试。
测试过程中,观察日志是否有异常信息。如有,证明策略逻辑存在BUG。

# 策略逻辑验证阶段:历史数据回测

此阶段的主要关注点则不再是策略逻辑漏洞,而是策略的盈利能力。假设在测试过程中修改了代码,那么相当于要重新回到上一阶段。

选择用途为【回测】的模组,启动模组。 然后便可以连线账户、连线行情网关,进行测试。
测试过程中,打开模组的运行状态界面观察模组的开平仓位置与时间是否符合原有的期望。

需要注意的是,如果有某些开平仓位置不符合期望,也许未必是代码问题,也未必是策略逻辑问题,很可能是市场本身的变化导致的。不要轻易针对某段行情来修改代码,否则容易导致过拟合的发生

# 过拟合验证阶段:实盘数据验证

此阶段的主要关注点是对比实盘的模组绩效,是否与历史回测时的模组绩效有显著性差异。

选择用途为【模拟盘】的模组,启动模组。 把模组账户的行情网关切换为【CTP】行情。 然后在开市时段连线行情网关,进行测试。 测试过程中,打开模组的运行状态界面观察模组的盈亏比、胜率等绩效指标是否与历史回测时有着统计学意义上的显著性差异。

需要注意的是,针对不同的策略,实盘验证的时长可能会不同。对于日内交易策略,建议的验证时间不少于两周。对于波段交易策略,建议的验证时间至少多空波段的一个完整的轮回。