backtrader最大的坑:没有内置处理涨跌停板

很多朋友使用backtrader做A股的量化回测,往往忽视了一个问题,就是没注意对涨跌停的处理,导致回测结果严重失真。

backtrader中通过self.buy命令创建的市价买单将在下一个bar(次日)以开盘价执行,即使次日是全天涨停板,也会成交,而这并不符合实际,因为如果次日全天涨停板,那么买单通常会因买不到而无法执行。如果次日全天跌停板,那么卖单通常无法执行。

怎样才能模拟出次日涨停时买不进,跌停时卖不出这种场景呢?本教程提出两种解决方案。一种是利用带有效期的限价单来处理, 在策略的next方法中,核心代码如下:
backtrader最大的坑:没有内置处理涨跌停板

upperprice是比次日涨停价稍低(低2分钱)的买单价格上限,订单有效截止期为下一个bar,注意截止期self.data.datetime[1]中的索引是1,表示下一个bar的日期时间(默认截止到该日晚上23点59分)。如果次日全天处于涨停状态,那么价格会始终在upperprice之上,导致无法成交,这样就模拟了无法以涨停价成交。若未成交,再往后推一天,该买单就失效了。跌停板的处理与此类似。

另一种更加好的方法是直接修改backtrader自己的经纪行broker定义,在bbroker.py文件里进行修改,具体方法可参考我们的视频课程。