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

本文详细介绍了BackTrader量化交易框架中的Signal信号交易模式,包括Indicator模块框架、信号交易基本操作和SignalStrategy信号策略类。信号模式通过设置买卖点信号进行交易,核心是各种金融指标,如SMA_Signal。信号函数根据时间序列数据产生交易决策,例如大于零为多头买入,小于零为空头卖出。BackTrader提供了灵活的信号组合,适合多策略交易。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

### BackTrader 量化交易平台资源获取 对于希望深入了解 `BackTrader` 的用户来说,获取高质量的学习资料至关重要。虽然直接提供特定 PDF 文件下载链接可能涉及版权问题[^1],可以建议访问官方文档网站以及合法渠道购买或借阅相关书籍。 #### 官方文档与社区资源 - **官方网站**: 访问 [BackTrader官网](https://www.backtrader.com/) 获取最新版本说明、教程和支持论坛。 - **GitHub仓库**: 浏览 [BackTrader GitHub页面](https://github.com/mementum/backtrader),这里不仅有详细的安装指南和技术细节描述,还有活跃开发者贡献的各种案例研究和脚本分享。 #### 合法途径获得专业图书 为了更深入理解如何应用 `BackTrader` 进行实际交易模拟及数据分析工作,推荐通过正规书店或电子书平台(如亚马逊 Kindle Store 或者国内当当网等)查找并购买《BackTrader量化交易图解》这类专著。这些书籍通常会附带丰富的实例解析和图表展示,有助于读者更好地掌握该工具的应用技巧[^2]。 ```python import backtrader as bt class MyStrategy(bt.Strategy): params = ( ('maperiod', 15), ) def __init__(self): self.sma = bt.indicators.SimpleMovingAverage( self.data.close, period=self.params.maperiod) def next(self): if not self.position: if self.data.close[0] > self.sma[0]: self.buy() elif self.data.close[0] < self.sma[0]: self.sell() cerebro = bt.Cerebro() data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2020, 1, 1), todate=datetime(2021, 1, 1)) cerebro.adddata(data) cerebro.addstrategy(MyStrategy) print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.run() print('Ending Portfolio Value: %.2f' % cerebro.broker.getvalue()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C与Python实战

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

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

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

打赏作者

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

抵扣说明:

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

余额充值