量化交易学习(三十二)backtrader文档——信号策略

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

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

信号策略

使用信号而不编写策略也能操作backtrader。简单来说就是:

  • 不用编写策略类、实例化指标、编写买入/卖出逻辑……

  • 最终用户添加信号(无论什么指标),其余操作在后台完成

示例:

1
2
3
4
5
6
7
import backtrader as bt

data = bt.feeds.OneOfTheFeeds(dataname='mydataname')
cerebro.adddata(data)

cerebro.add_signal(bt.SIGNAL_LONGSHORT, MySignal)
cerebro.run()

上面的例子中没有定义信号。让我们定义一个非常愚蠢的信号,它会产生:

  • Long信号:close价格是否高于简单移动平均线
  • Short信号:close价格是否低于简单移动平均线

定义:

1
2
3
4
5
6
class MySignal(bt.Indicator):
lines = ('signal',)
params = (('period', 30),)

def __init__(self):
self.lines.signal = self.data - bt.indicators.SMA(period=self.p.period)

现在完整了。当run执行时,Cerebro将负责实例化一个特殊的Strategy实例,该实例知道如何处理Signals。

常见问题解答

买入/卖出交易量是如何确定的?

cerebro实例会自动向策略添加 FixedSizer 的大小调整器。最终用户可以通过cerebro.addsizer来更改大小调整器

订单如何执行?

执行类型为Market且有效性为“取消前有效”的订单

信号技术细节

从技术和理论角度可以描述如下:

  • 调用时返回另一个对象的可调用对象(仅一次)

在大多数情况下,这是类的实例化,但在这里不是

  • 支持__getitem__接口。唯一请求的键/索引将是0

从实际的角度来看,看看上面的例子,信号是:

  • 来自backtrader生态系统的线条对象,主要是一个指标(Indicator)

这在使用其他指标时很有帮助,例如在示例中使用简单移动平均线时。

信号指示(Signals Indications)

当通过signal[0]查询时,信号会提供指示,含义为:

  • 0 -> long indication

  • < 0 -> short indication

  • == 0 -> 无指示

该示例使用 self.data - SMA 进行简单算术运算:

  • 当 data 高于 SMA 时发出 long indication

  • 当 data 低于 SMA 时发出 short indication

注意:对于未注明具体价格字段的data,参考价格以close为准。

信号类型

如上例所示,下面指示的常量可直接从主 backtrader 模块获取,如下所示:

1
2
3
import backtrader as bt

bt.SIGNAL_LONG

信号有 5 种类型,分为 2 组。

主要组别:

  • LONGSHORT: long 和 short indications 均取自该信号的指示

  • LONG:

    • long 指示做多
    • short 指示平多仓。但:
      • 如果系统中有一个LONGEXIT(见下文)信号,它将用于平多仓
      • 如果有SHORT信号且没有LONGEXIT信号,则在开空仓前先平多仓
  • SHORT:

    • short 指示做空
    • long 指示平空仓。但:
      • 如果系统中有SHORTEXIT信号(见下文),它将用于平空仓
      • 如果有LONG信号且没有SHORTEXIT信号,则将在开多仓前先平空仓

退出组:

这两个信号旨在覆盖其他信号并提供平多/空仓的标准

  • LONGEXIT:short指示平多仓
  • SHORTEXIT:long指示平空仓

订单累积与订单并发(Accumulation and Order Concurrency)

上面显示的示例信号将持续发出多头和空头指示,因为它只是从close价格中减去SMA的值,并且这将始终是> 0和< 0(等于0在数学上是可能的,但不太可能真正发生)

这将导致订单不断生成,从而产生两种情况:

  • Accumulation:即使已经进入市场,信号也会产生新订单,从而增加仓位

  • Concurrency:其他订单还没执行完成就会生成新订单

为了避免这种情况,默认行为是:

  • 不积累

  • 不允许并发

如果需要这两种行为中的任何一种,可以通过以下方式控制cerebro:

  • cerebro.signal_accumulate(True)(或False重新禁用它)

  • cerebro.signal_concurrency(True)(或False重新禁用它)


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

江达小记