概述与发起回测
回测用平台的历史行情驱动策略代码:回测引擎维护一个虚拟时钟,为每个交易所对象维护一个模拟账户,策略调用的行情、下单、账户等函数都由引擎按历史数据应答。回测结果只反映策略在历史行情下的表现,历史行情不能代表未来,对回测结果要理性、客观地看待。
发起回测
- 网页:打开策略编辑页面,切换到「模拟回测」分页,设置回测配置和策略参数后点击「开始回测」(快捷键见
回测页面快捷键)。回测配置可以保存进策略源码,见回测配置与保存。 - AI助手:通过MCP工具
run_backtest发起回测、get_backtest读取结果,见AI接入。MCP发起的回测只使用模拟级Tick模式。 - 本机:使用开源的本地回测引擎,见
本地回测引擎。
回测配置项
| 配置项 | 说明 |
|---|---|
| 时间范围 | 回测的开始时间和结束时间。 |
| K线周期 | 策略调用GetRecords()默认得到的K线周期。 |
| 底层K线周期 | 模拟级Tick模式下用来生成tick的K线周期。越小越接近真实行情,回测也越慢;策略K线由底层K线合成,不能小于底层K线周期。 |
| 模式 | 模拟级Tick或实盘级Tick,见回测模式与撮合。 |
| 交易所、交易对 | 每个交易所对象有各自的模拟账户;交易对写成BTC_USDT的形式。期货交易所需要在策略中先调用exchange.SetContractType()设置合约,才能获取行情、下单。 |
| 初始资金 | 计价币(如USDT)和交易币(如BTC)的初始余额。币本位合约以交易币作保证金,需要设置交易币余额。 |
| 手续费 | 挂单(maker)和吃单(taker)费率,单位为百分比,默认取该交易所市场的配置。限价单下单时立即成交按吃单费率计算,挂在盘口上之后才成交按挂单费率计算。 |
| 滑点 | 单位为价格最小变动单位(一跳)的个数,加在模拟盘口买一价、卖一价的外侧,默认为0。 |
| 网络延迟 | 单位为毫秒,策略每调用一次交易所接口,虚拟时钟前进相应时间,默认为200。 |
| 深度档位、每档数量 | GetDepth()返回的档位数(1~20)和模拟盘口每档的数量;实盘级Tick模式下深度档位是向数据源请求的真实深度档数。 |
| K线最大条数 | 第一次调用GetRecords()时返回的历史K线条数上限(100~5000,默认300)。 |
| 日志条数 | 回测保留的运行日志、收益日志、图表数据的条数上限。 |
| 数据源 | 默认使用平台的历史数据,也可以使用自定义数据源,见自定义数据源。 |
容错测试
回测页面另外提供「容错测试」:按一定概率(默认0.5)让交易所接口调用失败,并且每种接口的第一次调用一定失败,失败时记录错误日志FaultTolerant Test。用于检验策略对接口失败的处理,例如是否用_C()重试。
回测中的策略
IsVirtual()返回true,不应在回测中执行的逻辑可以据此跳过,见IsVirtual。- 时间是虚拟时间:
Unix()、_D()等读取的是回测时钟,Sleep()推动时钟前进。时钟越过结束时间时,引擎抛出EOF异常结束回测,此时不会调用onexit()。 - 回测中
GetCommand()收不到交互命令,不支持onerror(),网络请求类功能受限。