最近回测过程中发现有时候开头小部分数据回测结果会有一些偏差, 后面整理代码的时候发现BacktestingEngine的有两个属性
self.days: int = 0
self.callback: Callable = None
没有被后续代码所调用, 然后发现了一个需要注意的问题, 就是回测开始时间的选择上.
我们先看一下现在的回测逻辑:
1, 开始回测的时候, 按照backtestingEngine里的逻辑, 选择开始日期其实是不能随便选择的, 不能从K线数据的第一天开始回测, 必须要预留一定的空间用于BacktestingEngine.load_bar()函数对策略初始化。这一点要特别注意, 建议在gui界面上选择开始日期的地方要做一个提示.
2, BacktestingEngine.load_data()载入的就是除去了用于初始化测略的bar数据了
代码逻辑如下
# 选择gui界面的开始时间作为用于初始化数据的结束时间
init_end = self.start - INTERVAL_DELTA_MAP[interval]
# GUI界面选择开始时间时, 必须预留一部分用于初始化
init_start = self.start - timedelta(days=days)
但回测引擎的回测的时候, 可以不用对数据划分成用于初始化策略的部分和用于策略逻辑的部分, 直接从gui界面选定的开始时间和结束时间完全线性的运行就好了, 这样可以无约束的选择开始时间和结束时间, 回测时只需要将策略的on_init()函数注释掉, 实盘的时候再恢复就好了. 这样可以避免因为没有预留好用于初始化策略的bar数据导致的回测不准确