开源量化框架backtrader FAQ:filler,让订单执行数量与总成交量相关

完整backtrader技术教程看这里

默认情况下,backtrader中发出的订单,如果要成交,会成交全部数量,而与成交那根bar的总成交量(volumn)无关。

比如,在当前bar结束时,创建如下市价买单:

self.buy(size=100)

那么,到下一根bar,会以开盘价全部成交100股,即使下一根bar总成交量是50股也不影响该订单成交100股。

那么,我们能不能改变这种默认行为,让订单成交量与bar的总成交量挂钩呢?至少不要超过总成交量。方法是有的,那就是使用订单履行对象filler。有三种filler,以下分别介绍。

(1)固定数量filler:FixedSize

使用方法如下(假设在策略里创建了100股买单self.buy(size=100),后面2根bar的总成交量分别为90、80):

...
filler = bt.broker.fillers.FixedSize(size=70)
cerebro.broker.set_filler(filler)
cerebro.run()

那么在某bar上订单实际成交数量(不管买单还是卖单)=min(size,bar的总成交量,订单剩余数量)

在这种情况下,订单可能会被分开几次执行完。订单会在第一根bar成交70股,在第2根bar成交30股。

如果filler的参数size设为False,那么相当于size就是bar的总成交量,则在第一根bar成交90,第2根bar成交10股。

(2)固定bar百分比filler:FixedBarPerc

使用方法如下(假设在策略里创建了100股买单self.buy(size=100),后面2根bar的总成交量分别为90、80):

... 
filler = bt.broker.fillers.FixedBarPerc(perc=70) # 最多执行bar总成交量的70%
cerebro.broker.set_filler(filler) cerebro.run()

那么在某bar上订单实际成交数量(不管买单还是卖单)=min(bar的总成交量*perc/100,订单剩余数量)

则在后面第1根bar上成交63股(90*70%),在第2根bar成交37股。

(3)bar点百分比filler:BarPointPerc

使用方法如下(假设在策略里创建了100股买单self.buy(size=100),后面2根bar的总成交量分别为90、80):

... 
filler = bt.broker.fillers.BarPointPerc(minmov=0.1, perc=70)
cerebro.broker.set_filler(filler) cerebro.run()

这个filler看文档没看太明白,文档说:minmov是最小价格变动单位,The volume(订单成交量) will be distributed uniformly in the rangehigh-low usingminmovto partition.

BarPointPerc: does a uniform distribution of the bar volume across the price range high-low and uses a percentage of the volume that would correspond to a single price point。

欢迎大家一起来讨论这个BarPointPerc filler到底是怎么执行订单的。

最后,filler也是可以自定义的,用于一些复杂场景,参考文档

猜你喜欢

转载自blog.csdn.net/qtbgo/article/details/111057196