使用信号策略#
即使不编写 策略,也可以使用* 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
有五种类型的信号,分为两组。 退出组 :
退出组包含以下信号:
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
注意:
多个交易是相同的,但由于 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-