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

发布时间:2024年01月16日

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)

文章来源:https://blog.csdn.net/yaoyefengchen/article/details/135615526
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。