量化交易学习(三十一)backtrader文档——策略类(2)

今天这篇是backtrader文档的学习笔记。主要介绍了策略类的概念。

官方文档链接:https://www.backtrader.com/docu/strategy/

如何买入/卖出/平仓

用Buy方法和Sell生成订单。调用时,它们返回一个可用于参考的Order(或子类)实例。该订单具有唯一ref标识符,可用于比较。

注意:特定broker实现的Order子类可以携带broker提供的附加唯一标识符。

要创建订单,请使用以下参数:

  • data(默认:None)

对于那些要被创建订成单的数据,如果为None,那么采用系统中的第一个数据self.datas[0] 或 self.data0(也可简写为self.data)

  • size(默认:None)

用于订单的数据单位的大小(正)。

如果为None则将通过getsizer获取的sizer实例来确定大小。

  • price(默认:None)

订单的报价(如果不符合最小报价单位要求,实时经纪商可能会对实际格式施加限制)

None可以用于Market和Close订单(市场决定价格)

对于Limit、Stop和StopLimit订单,该值决定了触发点(在Limit订单下,显然是订单的触发价)

  • plimit(默认:None)

仅适用于StopLimit订单。这是触发止损后设置隐式限价单的价格(在price已使用的情况下)

  • exectype(默认:None)

    可能的值:

    • Order.Market或者None。市价订单将以下一个可用价格执行。在回测中,它将是下一个价格柱的开盘价

    • Order.Limit。只能在给定价格或更好的价格下执行的订单

    • Order.Stop。像Order.Market订单一样在price价格触发并执行的订单

    • Order.StopLimit。在price价格处触发并作为以pricelimit价格为隐式限价订单执行的订单

  • valid(默认:None)

    可能的值:

    • None:这会生成一个不会过期的订单(又名取消前有效)并保留在市场中直到匹配或取消。实际上,经纪人倾向于施加时间限制,但这通常距离很远,以至于无法将其视为未到期

    • datetime.datetime或datetime.date实例:该日期将用于生成在给定日期时间之前有效的订单(又名有效日期)

    • Order.DAY或0或timedelta():将生成直到会话结束为止那天有效的订单(又称当日订单)

    • numeric value:假设这是一个与matplotlib编码中的日期时间相对应的值(由backtrader所使用的),并将用于生成到该时间为止有效的订单(good til date)

  • tradeid(默认:0)

这是一个内部值,backtrader用于跟踪同一资产的重叠交易。当通知订单状态更改时,tradeid会发送回策略。

  • **kwargs:可选的broker实现的额外参数。backtrader将kwargs传递给创建的订单对象

示例:如果直接支持的 4 种订单执行类型还不够,例如在Interactive Brokers 的情况下,可以将以下内容作为kwargs传递:

1
orderType='LIT', lmtPrice=10.0, auxPrice=9.8

这将覆盖backtrader创建的设置并生成触及价格为 9.8、限价为 10.0 的LIMIT IF TOUCHED订单。

信息位:

  • 策略的长度始终等于主数据 ( datas[0]) 的长度,可以通过len(self)获得长度

如果正在重播数据或正在传递实时数据并且同一时间点(长度)的新报价到达,则可以在不更改长度的情况下调用next方法

成员属性:

  • env:该策略类所在的cerebro实体
  • datas:已传递到 cerebro 的数据源数组
    • data/data0是 datas[0] 的别名
    • dataX是 datas[X] 的别名

如果已分配数据源,也可以按名称访问(请参阅参考资料)

  • dnames:通过名称(使用[name]或使用.name符号)访问数据源的替代方法

例如,如果像这样重新采样数据:

1
2
3
4
5
...
data0 = bt.feeds.YahooFinanceData(datname='YHOO', fromdate=..., name='days')
cerebro.adddata(data0)
cerebro.resampledata(data0, timeframe=bt.TimeFrame.Weeks, name='weeks')
...

稍后在策略中,我们可以为每个指标创建如下所示的指标:

1
2
3
4
...
smadays = bt.ind.SMA(self.dnames.days, period=30) # or self.dnames['days']
smaweeks = bt.ind.SMA(self.dnames.weeks, period=10) # or self.dnames['weeks']
...
  • broker:引用与此策略相关的经纪人(从 cerebro 收到)

  • stats:列表/命名元组序列,包含 cerebro 为此策略创建的观察者

  • analyzers:列表/命名元组序列,包含 cerebro 为此策略创建的分析器

  • position:实际上是一个给出当前data0仓位的属性。

有检索所有数据源仓位的方法(请参阅参考资料)

成员属性(用于统计/观察者/分析者):

  • _orderspendingnext:调用next方法之前通知策略的订单列表

  • _tradespendingnext:调用next方法之前通知策略的交易列表

  • _orders:已通知的订单列表。一个订单可以在列表中出现多次,具有不同的状态和不同的执行位。该列表有助于保留订单历史。

  • _trades:已通知的交易列表。就像订单一样,一笔交易可以在列表中出现多次。

注意:请记住,prenext,nextstart和next可以在同一时间点多次调用(当使用每日时间范围时,ticks可以更新每日柱的价格)


这一篇就到这里啦。欢迎大家点赞、转发、私信。还没有关注我的朋友可以关注 江达小记

江达小记