Skip to content

Latest commit

 

History

History
99 lines (69 loc) · 4.11 KB

File metadata and controls

99 lines (69 loc) · 4.11 KB

50、backtrader 的一些基本概念---如何设置每次下单的大小?

原文:https://yunjinqi.blog.csdn.net/article/details/115265481

backtrader 提供了一个 sizer 的功能,如果在 self.buy,self.sell 的时候没有指定 size 的大小,就会按照 sizer 提供的功能进行下单,这个功能我几乎没有使用过,因为在实际的交易或者回测的过程中,几乎不会使用固定的手数;不过,sizer 提供了扩展的功能,可以自定义下单多少,这个还蛮不错。

sizer 的简单使用

  • 单个策略,下单使用固定手数

    cerebro = bt.Cerebro()
    # 使用 addsizer 增加,如果不使用 SizerFix,也不在 self.buy 或者 self.sell 中指定 size,那么,每次下单是一手或者一股
    cerebro.addsizer(bt.sizers.SizerFix, stake=20)  # 默认每次下单 20 手或者 20 股 
  • 多个策略,每个策略使用固定手数,但是手数不一样

    cerebro = bt.Cerebro()
    cerebro.addsizer(bt.sizers.SizerFix, stake=20)  # 默认每次下单 20 手或者 20 股
    # 由于某些策略可能需要的手数不一样,需要单独指定,使用 addsizer_byidx
    idx = cerebro.addstrategy(MyStrategy, myparam=myvalue)
    cerebro.addsizer_byidx(idx, bt.sizers.SizerFix, stake=5) # MyStrategy 每次下单 5 手或者 5 股
    cerebro.addstrategy(MyOtherStrategy)
    # 在这种设置中,MyOtherStrategy 每次下单 20 手或者 20 股,MyStrategy 每次下单 5 手或者 5 股 
  • 从策略中指定 sizer

    策略中具有 self.setsizer(size),self.getsizer,self.sizer,可以在策略中直接设置

    class MyStrategy(bt.Strategy):
        params = (('sizer', None),)
    
        def __init__(self):
            if self.p.sizer is not None:
                self.sizer = self.p.sizer 

    注:原文中有讲,在一个策略中设置了 sizer 之后,这个 sizer 会共享给加载到这个 cerebro 中的所有策略,需要验证一下。

sizer 的扩展应用

backtrader 提供了很好的延展性,sizer 的功能也一样,可以自定义扩展,比如固定手数的 sizer 使用的类如下:

import backtrader as bt

class FixedSize(bt.Sizer):
    params = (('stake', 1),)

    def _getsizing(self, comminfo, cash, data, isbuy):
        return self.params.stake 
  • 一个只做多的案例

    # 当使用这个 sizer 的时候,做多的时候,每次做一手;当要做空的时候,如果没有持仓,就下单 0,意味着不做空;当现在有多单的时候,才平多
    class LongOnly(bt.Sizer):
        params = (('stake', 1),)
    
        def _getsizing(self, comminfo, cash, data, isbuy):
          if isbuy:
              return self.p.stake
    
          # Sell situation
          position = self.broker.getposition(data)
          if not position.size:
              return 0  # 没有持仓的时候,忽略 self.sell
    
          return self.p.stake 
  • 一个有持仓加倍交易的案例

    # 没有持仓的时候,下一手;有持仓的时候,下两手
    class FixedRerverser(bt.FixedSize):
    	params = (('stake', 1),)
        def _getsizing(self, comminfo, cash, data, isbuy):
            position = self.broker.getposition(data)
            size = self.p.stake * (1 + (position.size != 0))
            return size 

    智慧、心灵、财富,总要有一个在路上,愿我们能在人生的道路上,不断成长、不断成熟~~~

    感兴趣可以关注我的专栏:

    my_quant_study_note:分享一些关于量化投资、量化交易相关的思考

    backtrader 量化投资回测与交易:本专栏免费,分享 backtrader 相关的内容。

    量化投资神器-backtrader 源码解析-从入门到精通:本专栏目前收费 99 元,预计更新 100 篇策略+20 篇 backtrader 讲解+80 篇源代码分析。