量化交易学习(五十四)backtrader多周期回测(3)期货多数据源

之前的多周期回测主要适用于股票,今天这篇来说一下期货的多周期回测,期货和股票最大的不同是期货有夜盘,支持T+0。

期货的日线是从前一交易日的夜盘开始到当天的日盘结束,也就是前一天的21点到当天的15点。如果直接加载数据到backtrader的话,默认日线会从当天的23:59:59开始,也就是假如今天是4月17日,那4月17日的日线从4月17日23:59:59形成, 这对于股票来讲没有问题,因为股票的交易时间是9:30到15:00,在盘中用的日线就是前一天的日线。

但是对于期货则不一样了,如果还按照backtrader默认的规则加载,则会在当天的21:00:00至23:59:59前使用前两天的日线(因为从21点开始就算下一天了),在下一天的0点后使用前一天的日线。所以需要对日线收盘时间进行调整。

backtrader的csv数据源加载器提供了调整k线结束时间的功能,只要在添加数据源时加上sessionend参数就可以了。

下面以螺纹钢的15分钟数据和日线数据为例说明一下调整前后的区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import datetime
import backtrader as bt

import strategy


cerebro = bt.Cerebro()

cerebro.addstrategy(strategy.MyStrategy)

data0=bt.feeds.BacktraderCSVData(dataname='SHFE.rb2405March.csv',timeframe=bt.TimeFrame.Minutes)
data1=bt.feeds.BacktraderCSVData(dataname='SHFE.rb2405Marchday.csv',timeframe=bt.TimeFrame.Days)
cerebro.adddata(data0)
cerebro.adddata(data1)

cerebro.broker.setcash(100000)

print('初始时资金持仓:%.2f' % cerebro.broker.getvalue())
cerebro.run()
print('结束时资金持仓:%.2f' % cerebro.broker.getvalue())
cerebro.plot(style='candle',barup='red',bardown='green',volup='red',voldown='green',voloverlay=False,valuetags=False)


结果图:

Snipaste_2024-04-20_11-50-52.png

可以从右下角的时间线上看出,日线是在23:59:59的时候形成的。我们把加载日线数据的那行代码改一下改为:

1
data1=bt.feeds.BacktraderCSVData(dataname='SHFE.rb2405Marchday.csv',timeframe=bt.TimeFrame.Days,sessionend=datetime.time(15))

结果图:

Snipaste_2024-04-20_11-54-59.png

这回可以看到,日线是在15:00:00的时候形成的了,这样在使用的时候就不会出错了。


这一篇就到这里啦。欢迎大家点赞、转发、私信。还没有关注我的朋友可以关注 江达小记

江达小记