使用信号策略#

即使不编写 策略,也可以使用* backtrader*进行操作。尽管这是首选方式, 但由于对象层次结构组成的机制,使用*信号*也是可能的。

快速摘要:

  • 不需要编写 策略*类,实例化 指标 ,编写 买入/卖出*逻辑…

  • 最终用户添加*信号*(无论如何指标),剩下的交由后台完成

快速示例:

import backtrader as bt

data = bt.feeds.OneOfTheFeeds(dataname='我的数据名')
cerebro.adddata(data)

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

Et voilá! 当然, Signal 本身是缺失的。让我们定义一个非常简单的 Signal ,它会产生以下结果:- 如果 close 价格高于 简单移动平均线 ,会产生 买入(Long) 指示

  • 如果 close 价格低于 简单移动平均线 ,会产生 卖出(Short) 指示

定义如下:

class MySignal(bt.Indicator):

lines = (‘信号’,) params = ((‘周期’, 30),)

def __init__(self):

self.lines.信号 = self.data - bt.indicators.SMA(period=self.p.周期)

现在真正完成了。当执行 run 时, Cerebro 将负责实例化一个特殊的 策略*实例,它知道如何处理 信号*。

初始 常见问题#

  • 如何确定 买入/* 卖出*操作的数量?

    Cerebro 实例会自动为策略添加一个 FixedSize 规模器。用户可以使用 cerebro.addsizer 来更改规模器以改变策略。- 订单是如何执行的?

    执行类型是“市场”(Market),有效性为“直到取消”(Good Until Canceled)

Signal 的技术细节#

从技术和理论角度来看,可以描述为:

  • 一个可调用的函数,在被调用时返回另一个*对象*(只能调用一次)

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

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

从实际角度来看,并参考上面的例子, Signal 是:

  • 来自 backtrader 生态系统的 lines 对象,通常是一个*指标*(Indicator)

    这在使用其他 指标*时非常有帮助,就像在例子中使用 简单移动平均线 (Simple Moving Average)时一样。 Signal*指示


当使用 signal[0] 查询信号时, signals 会提供以下几种指示意义:

  • > 0 -> 买入指示 - 短期指示 -> 短期信号

  • 没有指示 -> 无信号

  • 长期指示 -> 长期信号

  • 注意 -> ` 注意: `

  • ` 信号`类型 -> 信号类型

在例子中,使用 self.data - SMA 进行简单的算术运算:

  • data 高于 SMA 时发出 长期信号

  • data 低于 SMA 时发出 短期信号

注意:当没有明确指示 data 的特定价格字段时, close 价格是参考价格。

信号类型#

下面的示例中指示的常量可以直接从主 backtrader 模块中使用,如下所示:

```python import backtrader as bt

bt.SIGNAL_LONG ```

有五种类型的信号,分为两组。 退出组

退出组包含以下信号:

  • LONGEXIT : 该信号用于平仓 long 头寸

  • SHORTEXIT : 该信号用于平仓做空头寸

在使用这些信号之前,请确保系统中存在相应的 long 或做空头寸。这两个信号的作用是覆盖其他信号,并为退出做多/做空的头寸提供标准。

  • LONGEXIT (做多退出):接收到 short (短)的指示表示应该退出做多的头寸。

  • SHORTEXIT (做空退出):接收到 long (长)的指示表示应该退出做空的头寸。

累积和订单并发性#

上面显示的示例 信号 将持续不断地发出做多和做空的指示,因为它只是将 SMA 值从 close 价格中减去,这将始终是 >0`和 <0 (`0 在数学上是可能的,但几乎不可能真的发生)。这将导致不断产生 订单 ,产生2种情况:

  • 积累:即使已经在市场上, 信号 也会产生新的订单,增加市场上的位置。

  • 并发:会生成新的订单,而无需等待其他订单的执行。

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

  • 不积累

  • 不允许并发 如果希望实现这两种行为之一,可以通过 cerebro 进行控制:

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

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

样例 ==== backtrader 的源码中包含一个用于测试功能的示例。

要使用的主要信号。

class SMACloseSignal(bt.Indicator):
    lines = ('signal',)
    params = (('period', 30),)

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

如果指定了该选项,则使用 Exit Signal

class SMAExitSignal(bt.Indicator):
    lines = ('signal',)
    params = (('p1', 5), ('p2', 30),)

    def __init__(self):
        sma1 = bt.indicators.SMA(period=self.p.p1)
        sma2 = bt.indicators.SMA(period=self.p.p2)
        self.lines.signal = sma1 - sma2

第一次运行:多头和空头#

$ ./signals-strategy.py --plot --signal longshort.. thumbnail:: signal-longshort.png

请注意:

  • 绘制了 Signal 。这是正常的,因为它只是一个指标,所以应用于它的绘图规则适用。

  • 策略真的是 多头 (long)空头 (short) 。这可以看出来,因为 现金 (cash) 水平从未回到 价值 (value) 水平。

  • 注:即使是一个愚蠢的想法…(而且没有佣金),这个策略也没有亏钱…

第二次运行:仅多头#

$ ./signals-strategy.py --plot --signal longonly

输出结果

请注意:- Here, after each sell , the cash level will return to the value level, meaning the strategy has exited the market.

  • Note: No losses again… Third run: short only

$ ./signals-strategy.py –plot –signal shortonly

Output:

Things to note:

  • The first operation is a sell operation, as expected, occurring later than the first operation in the first two examples. It only occurs when close is lower than SMA and simple subtraction produces a negative number.

  • After each buy operation, the cash level is restored to the value level, meaning the strategy exits the market.

  • Note: Lastly, the system has incurred losses.

Fourth run: long + long exit#

:: $ ./signals-strategy.py –plot –signal longonly –exitsignal longexit output

../_images/signal-long-longexit.png

注意:

  • 多个交易是相同的,但由于 exit 信号交叉到下行,快速移动平均线比慢速移动平均线更早终止了某些交易

  • 系统通过现金变为每笔交易结束时的价值显示出其 仅做多 的属性

  • 侧记:再次赚了一些钱…即使有一些修改的交易

使用方法#

$ ./signals-strategy.py --help
usage: signals-strategy.py [-h] [--data DATA] [--fromdate FROMDATE]
                           [--todate TODATE] [--cash CASH]
                           [--smaperiod SMAPERIOD] [--exitperiod EXITPERIOD]
                           [--signal {longshort,longonly,shortonly}]
                           [--exitsignal {longexit,shortexit}]
                           [--plot [kwargs]]

信号策略示例

可选参数:
  -h, --help            显示此帮助消息并退出
  --data DATA           要读取的特定数据(默认值:../../datas/2005-2006-day-001.txt)
  --fromdate FROMDATE   起始日期,格式为YYYY-MM-DD(默认值:None)
  --todate TODATE       结束日期,格式为YYYY-MM-DD(默认值:None)
  --cash CASH           要开始的现金(默认值:50000)
  --smaperiod SMAPERIOD
                        移动平均线的周期(默认值:30)
  --exitperiod EXITPERIOD
                        出口控制SMA的周期(默认值:5)
  --signal {longshort,longonly,shortonly}
                        用于主信号的信号类型(默认值:longshort)
  --exitsignal {longexit,shortexit}
                        用于出场信号的信号类型(默认值:None)
  --plot [kwargs], -p [kwargs]
                        绘制读取的数据并应用通过kwargs传递的任何参数 例如:--plot style="candle"(绘制蜡烛图)(默认值:None).. literalinclude:: signals-strategy.py
 :language: python
 :lines: 21-