Skip to content

浆纱机

原文: https://www.backtrader.com/docu/sizers/sizers/

  • 聪明的赌注

策略提供了交易方法,即:buysellclose。让我们看看buy的签名:

def buy(self, data=None,
        size=None, price=None, plimit=None,
        exectype=None, valid=None, tradeid=0, **kwargs): 

请注意,如果调用方没有指定,size有一个默认值None。这就是浆纱机发挥重要作用的地方:

  • size=None要求策略向其规模商索要实际股权

这显然意味着策略具有规模:是的,的确如此!。如果用户还没有添加默认的尺码器,后台机器会将其添加到策略中。添加到策略中的默认SizerSizerFix。定义的初始行:

class SizerFix(SizerBase):
    params = (('stake', 1),) 

很容易猜测,这个规模的只是使用1单位stake进行买卖(无论是股票、合同等)

使用施胶器

来自大脑

施胶剂可通过大脑两种不同方式添加:

  • addsizer(sizercls, *args, **kwargs)

    添加一个Sizer,它将应用于大脑中添加的任何策略。也就是说,这是默认的尺码。例子:

    py cerebro = bt.Cerebro() cerebro.addsizer(bt.sizers.SizerFix, stake=20) # default sizer for strategies

  • addsizer_byidx(idx, sizercls, *args, **kwargs)

    施胶器只会添加到idx引用的策略

    idx可作为addstrategy的返回值获取。例如:

    ```py cerebro = bt.Cerebro() cerebro.addsizer(bt.sizers.SizerFix, stake=20) # default sizer for strategies

    idx = cerebro.addstrategy(MyStrategy, myparam=myvalue) cerebro.addsizer_byidx(idx, bt.sizers.SizerFix, stake=5)

    cerebro.addstrategy(MyOtherStrategy) ```

    在本例中:

    • 系统中添加了一个默认的大小器。这一条适用于所有没有指定具体的尺寸的策略

    • 对于MyStrategy在收集其插入的idx后,添加一个特定的施胶器(更改stake参数)

    • 系统中增加了一个 2nd策略MyOtherStrategy。未添加具体的施胶剂

    • 这意味着:

      • MyStrategy最终将拥有一个内部特定的尺码器

      • MyOtherStrategy将获得默认大小码

笔记

默认并不意味着策略共享一个Sizer实例。每个策略都会收到一个不同的默认sizer 实例

要共享单个实例,要共享的 sizer 应该是 singleton 类。如何定义一个在反向交易者范围之外

策略

策略类提供了一个 API:setsizergetsizer(以及一个属性sizer)来管理施胶器。签名:

  • def setsizer(self, sizer):需要一个已经实例化的Sizer

  • def getsizer(self):返回当前Sizer实例

  • sizer可直接获取/设置的属性

在这种情况下,施胶器可以是:

  • 作为参数传递给策略

  • __init__期间使用sizersetsizer属性进行设置,如:

    ```py class MyStrategy(bt.Strategy): params = (('sizer', None),)

    def __init__(self):
        if self.p.sizer is not None:
            self.sizer = self.p.sizer
    

    ```

    例如,这将允许在发生大脑调用的同一级别创建大小码,并将其作为参数传递给系统中的所有策略,这实际上允许共享大小码

施胶机开发

这样做很容易:

  1. 来自backtrader.Sizer的子类

    这使您可以访问self.strategyself.broker,尽管在大多数情况下不需要它。可以通过broker访问的内容

    • 数据与self.strategy.getposition(data)的位置

    • 通过self.broker.getvalue()完成投资组合价值

      请注意,这当然也可以通过self.strategy.broker.getvalue()完成

    其他一些事情已经作为论据出现在下面

  2. 覆盖方法_getsizing(self, comminfo, cash, data, isbuy)

    • comminfo:CommissionInfo 实例,包含该数据的佣金信息,允许计算该操作的职位价值、操作成本、佣金

    • cash:在经纪人中的当前可用现金

    • data:作业目标

    • isbuy:将True用于买入操作,将False用于卖出操作

    此方法返回买入/卖出操作所需的size

    返回的符号不相关,即:如果操作是卖出操作(isbuy将是False),该方法可能返回5-5卖出操作将仅使用绝对值。

    Sizer已经进入broker并请求佣金信息以获取给定数据的实际现金水平,并直接参考操作目标数据

让我们来了解一下FixedSize尺寸的定义:

import backtrader as bt

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

    def _getsizing(self, comminfo, cash, data, isbuy):
        return self.params.stake 

这非常简单,因为施胶器不进行任何计算,参数就在那里。

但该机制应允许构建复杂的规模(又称定位)系统,以在进入/退出市场时管理股权。

另一个例子:位置重传器

class FixedRerverser(bt.FixedSize):

    def _getsizing(self, comminfo, cash, data, isbuy):
        position = self.broker.getposition(data)
        size = self.p.stake * (1 + (position.size != 0))
        return size 

这一个基于现有的FixedSize继承params并覆盖_getsizing到:

  • 通过broker属性获取数据position

  • 使用position.size决定是否加倍固定桩

  • 返回计算值

这将消除策略的负担,以决定是否必须反转或打开位置,施胶器处于控制状态,可以随时更换,而不会影响逻辑。

实用施胶机适用性

在不考虑复杂的大小调整算法的情况下,可以使用两种不同的大小调整器将策略从“仅长”变为“短长”。只需在大脑执行中更改大小器,策略就会改变行为。一个非常简单的close交叉SMA算法:

class CloseSMA(bt.Strategy):
    params = (('period', 15),)

    def __init__(self):
        sma = bt.indicators.SMA(self.data, period=self.p.period)
        self.crossover = bt.indicators.CrossOver(self.data, sma)

    def next(self):
        if self.crossover > 0:
            self.buy()

        elif self.crossover < 0:
            self.sell() 

请注意,该策略如何不考虑当前的 Ty2 T2 位置(Turn To T0),以决定是否需要购买 Ty5 T5 或 SO T6。仅考虑来自CrossOver信号施胶者将负责一切。

如果仓位已打开,则此尺码器仅在卖出时返回非零尺码:

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  # do not sell if nothing is open

      return self.p.stake 

综合起来(假设反向交易者已经导入,并且数据已经添加到系统中):

...
cerebro.addstrategy(CloseSMA)
cerebro.addsizer(LongOnly)
...
cerebro.run()
... 

图表(来源中包含的样本用于测试)。

!image

长短版本只是将施胶器更改为上图所示的FixedReverser

...
cerebro.addstrategy(CloseSMA)
cerebro.addsizer(FixedReverser)
...
cerebro.run()
... 

输出图表。

!image

请注意区别:

  • 交易数量重复

  • 现金水平永远不会回到,因为市场上的策略始终是

*无论如何,这两种方法都是消极的,但这只是一个例子。

bt.施胶机参考

类 backtrader.Sizer()

这是施胶器的基类。任何sizer都应该将其子类化,并覆盖_getsizing方法

成员属性:

  • strategy:将由施胶器工作的策略设置

    允许访问策略的整个 api,例如,如果在_getsizing中需要实际数据位置:

    py position = self.strategy.getposition(data)

  • broker:将由施胶器工作的策略设置

    提供一些复杂的规模确定者可能需要的信息,如投资组合价值。。

_ 获取大小(comminfo、现金、数据、isbuy)

此方法必须由 Sizer 的子类重写,以提供大小调整功能

参数:

* `comminfo`: The CommissionInfo instance that contains
  information about the commission for the data and allows
  calculation of position value, operation cost, commision for the
  operation

* `cash`: current available cash in the *broker*

* `data`: target of the operation

* `isbuy`: will be `True` for *buy* operations and `False`
  for *sell* operations 

该方法必须返回要执行的实际大小(int)。如果返回0,则不会执行任何操作。

将使用返回值的绝对值*


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组