《BackTrader量化交易图解》第11章:signal 信号交易模式

11. signal 信号交易模式

11.1 Indicator 指标模块框架图

BackTrader 量化软件支持两种交易模式:

  • Strategy,传统策略模式,即策略类函数模板;
  • Signal,信号交易模式,通过设置买卖点信号进行交易。

下图是 Signal 信号交易模块属性示意图:

btr_signal

Signal模块结构相对比较简单, 主要数据是通过SIGNAL_LONG多头信号、 SIGNAL_SHORT空头信号等全局参数传递的。BackTrader量化软件的信号交易模式的核心是其内置的各种金融指标Indicator。

下图是BackTrader量化软件中的金融指标Indicator子模块的关系属性图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由图可以看出, Indicator指标子模块主要相关的子模块库有:Cerebro、 Feed数据源、 Lineseries、 Talib等。

11.2 案例:信号交易的基本操作

本实例代码: SingleStratergy.py

Signal 信号交易模式是一种全新的交易体系。Signal 信号交易基本流程与传统量化程序一样,也分为四个步骤:

  1. 设置一个回测主函数;
  2. 设置量化回测参数;
  3. 调用量化回测程序,开始 run 运行回测分析;
  4. 回测数据分析,或者根据回测推荐结果进行交易。

本案例生成图片如下所示:

SignalStrategy

上图中在最下面增加了一条 SMA_Signal 交易信号的指标曲线,采用的是独立的 subplot 子图模式。SMA_Signal 代码如下:

class SMA_Signal(bt.Indicator):
    # 定义信号名称  lines=
    lines = ("mysignal",)
    # 定义MA均线策略的周期参数变量period,默认值是15
    params = (("period", 15),)

    # 调用初始化函数
    def __init__(self):
        # 增加一个信号参数 mysignal
        # mysignal信号是源自当前的价格数据,与SMA均线价格的差值,默认是收盘价close
        # >0:long,多头信号,买入
        # <0:short,空头信号,卖出
        # =0:None,无操作,
        self.lines.mysignal = self.data - bt.indicators.SMA(period=self.p.period)
        #
        # 改用open等其他数据字段测试。也可以是sma,rsi等其他衍生指标数据
        # self.lines.mysignal = self.data.close - bt.indicators.SMA(period=self.p.period)
        #
        # self.lines.mysignal = self.data.open - bt.indicators.SMA(period=self.p.period)
        # self.lines.mysignal = self.data.low - bt.indicators.SMA(period=self.p.period)
        # self.lines.mysignal = self.data.high - bt.indicators.SMA(period=self.p.period)

信号交易模式在量化交易中扮演着关键角色,其类定义主要基于Indicator(指标类),而非Strategy(策略类)。这种模式着重于根据买卖点信号来指导交易决策,这些信号本质上可以被视为一种特定的金融指标。实际上,任何金融指标理论上都可以作为交易信号使用。

在BackTrader框架中,信号函数的首行通常以lines开始,用于定义一系列交易信号的变量名称。在这里,lines承担着特殊的意义,它代表着基于时间序列的数据集合,类似于Pandas中的Series数据列。例如,Pandas中的金融数据集可能包括开盘价、收盘价等多个纵向字段,BackTrader中的每个字段相当于一个lines数据组。在案例源码中,采用的变量名称为mysignal(自定义的买卖信号),当然这个名称是可以根据需要更改的。

信号模式的编程相对简洁明了,与常规的策略执行流程相比,它可以简化next策略执行函数,有时甚至仅需一个init初始化函数。在函数中定义的信号变量名称必须与lines代码中定义的名称保持一致,以确保程序逻辑的正确性。

BackTrader 中,买入价格默认都是收盘价,也可以改为开盘价、最低价、最高价等。

mysignal 信号计算结果有三种情况:

  • 大于零,就是多头信号,可以买入;
  • 小于零,就是空头信号,可以卖出;
  • 等于零,无需操作。

BackTrader 中内置了很多与 long 信号和 short 信号相关的专业函数。最简单的信号模式编程,就是把信号函数相关代码放在一起,通常放在初始化函数中,步骤如下:

  1. 设置量化入口变量;
  2. 初始化函数,读取交易数据,添加数据;
  3. 编写 add_signal 添加信号函数。

add_signal 添加信号函数代码如下:

print("\n\t#2-3,添加BT量化回溯程序,对应的买卖点signal信号参数")
print("\n\t# 案例当中,使用的是SMA均线与当前价格的差值,作为买卖点信号")
print("\n\t# 买入long,卖出shrot信号,都是采用这个")
cerebro.add_signal(bt.SIGNAL_LONGSHORT, SMA_Signal, period=15)

本节案例比较简单, 多头、 空头都使用同样的信号函数, 在实际编程中需要将它们进行分组, 让空头、 多头分别使用独立的信号函数, 然后设置各组信号函数的相关参数。

BackTrader的交易信号有很多种变化模式, 并且有不同的退出、 进入的信号。 Signal信号交易模式的特点是: 交易信号可以累加, 很容易将多种策略进行叠加, 然后做多策略组合交易

11.3 SignalStrategy 信号策略类

本实例代码: SingleStratergy2.py

SignalStrategy 信号策略类关系属性示意图如下:

btr_signl_sta

由图可以看出,SignalStrategy 类属于 Strategy 类,其主要子模块有 Analyzer、Order 等。

本案例自定义的信号策略类代码如下:

# 创建一个:SignalStrategy最简单的信号策略类class
# 用于输出买卖执行信息
class MySignalStrategy(bt.SignalStrategy):
    def notify_order(self, order):
        # 检查订单order是否完成
        if order.status == order.Completed:
            xss = ""
            css = ",成交价:{:.2f},小计 Cost: {:.2f},佣金 Comm %{:.2f}".format(
                order.executed.price, order.executed.value, order.executed.comm
            )
            if order.isbuy():
                xss = "买单执行 BUY EXECUTED"
            elif order.issell():
                xss = "卖单执行 SELL EXECUTED"

            #
            tim = format(order.data.datetime.datetime())
            tss = tim + ",@ " + xss + css
            print(tss)

该自定义类包含了一个 notify_order 订单处理函数用于处理交易订单信息。需要注意,在主流程中使用 signal_strategy 函数添加自定义的交易信号策略:

print("\n\t# 增加一个自定义信号策略")
print("\n\t# 用于输出买卖执行信息")
cerebro.signal_strategy(MySignalStrategy)

买卖执行的输出信息如下:

2021-07-30 23:59:59.999989,@ 买单执行 BUY EXECUTED,成交价:9.36,小计 Cost: -91.00,佣金 Comm %0.09
2021-07-30 23:59:59.999989,@ 买单执行 BUY EXECUTED,成交价:9.36,小计 Cost: 93.60,佣金 Comm %0.09
2021-08-18 23:59:59.999989,@ 卖单执行 SELL EXECUTED,成交价:9.57,小计 Cost: 93.60,佣金 Comm %0.10
2021-08-18 23:59:59.999989,@ 卖单执行 SELL EXECUTED,成交价:9.57,小计 Cost: -95.70,佣金 Comm %0.10
2021-08-19 23:59:59.999989,@ 买单执行 BUY EXECUTED,成交价:10.08,小计 Cost: -95.70,佣金 Comm %0.10

信号交易函数返回值,是一个动态数据或者一组数据,在 BackTrader 中对应一组数据 lines。

在量化交易领域,BackTrader量化软件提供了两种主流的交易模式:传统策略交易模式和信号交易模式。传统策略交易模式将所有自定义函数集中在一个策略类中,便于进行策略编程和管理。尽管这种模式对初学者来说可能相对复杂,但通过使用策略模板,编程过程大为简化。用户只需调整nextinit函数中的参数设置,即可实现策略逻辑。

相比之下,信号交易模式在多策略组合交易中显示出其独特优势。这种模式更加灵活和直观,使得用户能够更容易地组合和管理多种交易策略。实际操作中,大多数交易者仍然倾向于使用传统策略交易模式,主要由于其稳定性和成熟度。

本案例生成图片如下:

SignalStrategy2

代码仓库链接:CPythoner/BackTraderDemo at develop (github.com)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
由于backtrader是一个Python开源框架,可以用于量化交易,因此可以通过编程来实现量化交易策略。下面是一个简单的backtrader量化交易案例图解。 假设我们有一些历史股票价格数据,我们想要用backtrader来实现一个简单的均线策略。具体来说,当股票价格上穿均线时,我们会买入股票;当股票价格下穿均线时,我们会卖出股票。 首先,我们需要导入backtrader库: ``` import backtrader as bt ``` 接下来,我们需要定义一个backtrader策略类。在该类中,我们需要定义以下方法: 1. __init__(): 初始化策略。 2. next(): 定义策略的逻辑。 具体代码如下: ``` class MyStrategy(bt.Strategy): def __init__(self): self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=10) self.order = None def next(self): if self.order: return if not self.position: if self.data.close[0] > self.sma[0]: self.order = self.buy() else: if self.data.close[0] < self.sma[0]: self.order = self.sell() ``` 在__init__()方法中,我们定义了一个简单移动平均指标(SMA),并将其计算在每个数据点上。我们还定义了一个空的订单变量,该变量将在接下来的逻辑中用于检查我们是否已经下了订单。 在next()方法中,我们首先检查我们是否有未完成的订单。如果我们有未完成的订单,我们就返回,等待订单完成后再继续。如果我们没有未完成的订单并且我们没有持仓,我们就检查当前价格是否高于SMA。如果是,我们就下单买入。如果我们已经持有了仓位,我们就检查当前价格是否低于SMA。如果是,我们就下单卖出。 接下来,我们需要加载我们的数据。假设我们有一个名为“data.csv”的文件,其中包含了我们的股票价格数据。我们可以使用以下代码来加载数据: ``` data = bt.feeds.GenericCSVData( dataname='data.csv', fromdate=datetime(2019, 1, 1), todate=datetime(2020, 1, 1), dtformat=('%Y-%m-%d'), open=1, high=2, low=3, close=4, volume=5, openinterest=-1 ) ``` 在这里,我们使用了backtrader的GenericCSVData源,该源允许我们从CSV文件中加载数据。我们还指定了数据的时间范围,以及每个数据点的格式和位置。 接下来,我们需要实例化我们的策略并运行回测。我们可以使用以下代码来完成这个过程: ``` cerebro = bt.Cerebro() cerebro.addstrategy(MyStrategy) cerebro.adddata(data) cerebro.run() ``` 在这里,我们使用backtrader的Cerebro类来实例化我们的交易引擎。我们还向引擎中添加了我们的策略和数据。最后,我们运行回测并输出结果。 总的来说,backtrader是一个非常强大的Python框架,可以用于快速实现量化交易策略。在上面的例子中,我们演示了如何使用backtrader来实现一个简单的均线策略。当然,您可以根据自己的需求和想法来设计和实现不同的量化交易策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C与Python实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值