BackTrader 量化软件支持两种交易模式:
下图是 Signal 信号交易模块属性示意图:
Signal模块结构相对比较简单, 主要数据是通过SIGNAL_LONG多头信号、 SIGNAL_SHORT空头信号等全局参数传递的。BackTrader量化软件的信号交易模式的核心是其内置的各种金融指标Indicator。
下图是BackTrader量化软件中的金融指标Indicator子模块的关系属性图:
由图可以看出, Indicator指标子模块主要相关的子模块库有:Cerebro、 Feed数据源、 Lineseries、 Talib等。
本实例代码: SingleStratergy.py 。
Signal 信号交易模式是一种全新的交易体系。Signal 信号交易基本流程与传统量化程序一样,也分为四个步骤:
本案例生成图片如下所示:
上图中在最下面增加了一条 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 信号相关的专业函数。最简单的信号模式编程,就是把信号函数相关代码放在一起,通常放在初始化函数中,步骤如下:
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信号交易模式的特点是: 交易信号可以累加, 很容易将多种策略进行叠加, 然后做多策略组合交易。
本实例代码: SingleStratergy2.py 。
SignalStrategy 信号策略类关系属性示意图如下:
由图可以看出,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量化软件提供了两种主流的交易模式:传统策略交易模式和信号交易模式。传统策略交易模式将所有自定义函数集中在一个策略类中,便于进行策略编程和管理。尽管这种模式对初学者来说可能相对复杂,但通过使用策略模板,编程过程大为简化。用户只需调整next
和init
函数中的参数设置,即可实现策略逻辑。
相比之下,信号交易模式在多策略组合交易中显示出其独特优势。这种模式更加灵活和直观,使得用户能够更容易地组合和管理多种交易策略。实际操作中,大多数交易者仍然倾向于使用传统策略交易模式,主要由于其稳定性和成熟度。
本案例生成图片如下: