在backtrader官网文档中,介绍了两种多周期回测方式,第一种是读入多周期的K线数据,第二种是对数据进行resample。本文将对第一种方式进行介绍。
简述
有些策略会使用到多周期的数据,典型的应用为:
使用周线(大周期)数据判断趋势使用日线(小周期)数据判断买卖点这就需要同时读入多周期数据进行回测,backtrader内置了对多周期策略回测的支持。
backtrader多周期回测规则
回测时需要遵循以下规则:
- 小周期数据必须被第一个加入到Cerebro实例中
在backtrader中,第一个被添加的数据将被作为时钟数据,因此需要将小周期数据首先添加到系统中,以使得小力度的时间都能被遍历到。
- 数据必须按照日期时间做好对齐,这样backtrader才能正确地使用数据
backtrader在回测过程中,不会对时间进行重新排序,只能按照整理好的数据顺序依次处理,因此需要将不同周期的数据都做好对齐。很幸运,从TuShare及BaoStock下载下来的不同周期的数据均做好对齐,可以直接使用,注意数据需要按时间升序组织。
- 大周期数据的使用会使得策略的最小周期变大。
如果要计算出技术指标的有效值,至少需要若干根K线数据,例如:计算5日均线,则至少需要前5根日K线,才能计算出第一个有效值,也就是至少经过5日,这里的5日就是backtrader里所指的最小周期。不同指标可能具有不同的最小周期,单周期回测时,策略的最小周期就是所有指标最小周期的最大值。而多周期回测中,最小周期则变得复杂。通常,要计算出大周期技术指标的有效值,策略的最小周期会变大,也就是回测开始后,要经过更多的K线来保证大周期技术指标能够计算出第一个有效值。
示例
为了演示多周期策略回测,本文使用以下方案:
策略将先读入日线数据,再读入周线数据。回测股票为000001平安银行,回测周期为2018年1月1日至2019年12月31日。# 加载数据def load_data(data_info): fromdate = datetime.datetime(2018, 1, 1) todate = datetime.datetime(2019, 12, 31) datapath = './stk_data/' + data_info[0] +'/' + data_info[1] + '.csv' return bt.feeds.GenericCSVData( dataname = datapath, fromdate = fromdate, todate = todate + datetime.timedelta(days=1), nullvalue = 0.0, dtformat = ('%Y-%m-%d'),