backtrader利用小时间粒度数据动态合成大时间粒度数据:replay功能

扫地僧backtrader技术教程获取方法

===========================

看过我教程的同学都知道,backtrader中可以用重采样resample功能来将小粒度数据合成大粒度数据,比如将1分钟k线数据合成1小时k线数据。比如当10点到11点间所有1分钟k线都出来后,合成1根11点结束的1小时k线,在10点半时,如果要取1小时k线,只能去上一根,即10点结束的1小时k线。也就是说,在当一个整点小时完全结束时,才能合成新的1小时k线。

但是有些用户有一个需求,就是要求最新的1小时即使还没走完,也要动态合成1小时k线,比如10点开始,进来一个1分钟线,那么1小时线就只包含这一分钟数据,再进来一个一分钟线,更新一小时线包含这两分钟的数据。这样动态更新,直到11点,这根1小时线测底定型。这样在10点半时,如果你访问最新1小时线,实际是10点到10点半的半小时线。backtrader通过回放replay来实现这种功能,非常简单。例子代码如下:



class St(bt.Strategy):
    def start(self):
        self.counter = 0

    def next(self): # 没根分钟线触发一次
        self.counter += 1

        txt = []
        txt += ['{:04d}'.format(self.counter)]
        txt += ['{:04d}'.format(len(self))]
        txt += ['{:04d}'.format(len(self.data))] # 数据长度在整点开始的1小时内是不变的,
        txt += ['{}'.format(self.datetime.datetime().isoformat())]
        txt += ['{:.2f}'.format(self.data.close[0])]
        print(','.join(txt))

        if self.counter % 10:  # 每隔10根1分钟线,执行操作
            return

        # Enter with 1 or revers with twice the opposite (2 or -2)
        if self.position.size <= 0:
            print('-- ORDER BUY')
            self.buy(size=abs(self.position.size * 2) or 1)
        else:
            print('-- ORDER SELL')
            self.sell(size=-abs(self.position.size * 2) or -1)

    def notify_order(self, order):
        if order.status == order.Completed:
            print('-- BEGIN ORDER COMPLETED --')
            txt = []
            txt += ['{:04d}'.format(self.counter)]
            txt += ['{}'.format(self.datetime.datetime().isoformat())]
            txt += ['{:.2f}'.format(order.executed.price)]
            txt += ['{:2d}'.format(order.executed.size)]
            print(','.join(txt))
            print('-- END ORDER COMPLETED --')
            print('-- PORTFOLIO SIZE:', self.position.size)


cerebro = bt.Cerebro()

data = bt.feeds.BacktraderCSVData(  # 分钟线
    dataname='../../datas/2006-min-005.txt',
    timeframe=bt.TimeFrame.Minutes
)
cerebro.replaydata(data, timeframe=bt.TimeFrame.Days, compression=1) # 分钟线合成日线

cerebro.addstrategy(St)
cerebro.run()

上述代码要点:

1 分钟线触发next,但是,在next中,len(self.data)长度在整点开始的1小时内是不变的。

2 在next中,self.data.close[0],在整点开始的一小时内,随着分钟线的进来,在不断变化(等于最新分钟线的收盘价)

3 在next中,self.data.close[-1]取得的是上个整点小时的收盘价,而不是上一分钟的收盘价。

以上功能在其他回测框架是很难甚至不能实现。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地僧量化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值