backtrader 提供了一个 sizer 的功能,如果在 self.buy,self.sell 的时候没有指定 size 的大小,就会按照 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 中的所有策略,需要验证一下。
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 篇源代码分析。