天天看点

backtrader 自定义indicator_BackTrader回测工具(一)

backtrader 自定义indicator_BackTrader回测工具(一)

18年的时候开始做量化分析,当时看了市场上很多的回测工具。大部分都比较笨重,后来主要用的是ricequant的离线回测平台。功能很全,没有什么毛病,主要就是速度比较慢。这个平台前段时间停止服务了,不想用在线平台,只能换一个新工具。

在看到backtrader之前,我把abu的开源代码看了一遍,觉得难度不大,想在abu的基础上自己改一个平台出来。策略部分的功能基本上都开发完成,debug也完成了。偶然发现了BackTrader。简单看了一下,觉得架构设计的非常漂亮,试跑了一下,速度快的惊人。看了一下源代码,才知道自己离专业Python开发者还差的不少,于是放弃了自研的想法,站在巨人的肩膀上前进。下面介绍一下BackTrader这个工具,也作为自己这一段时间学习的总结。

BackTrader主要模块:

  • Cerebro:执行引擎。数据,策略,分析等模块注册到这个引擎。由引擎驱动整体流程。
  • DataFeed:数据模块。支持多种格式的数据接口,包括对pandas数据的支持。
  • Strategy:策略模块。定义买卖的策略。
  • Indicator:指标模块。支持talib,可以自己开发指标。策略依赖指标来驱动交易。
  • Order:订单模块。市价,限价等等各种格式的订单。
  • Broker:交易商模块。对资金进行管理。
  • Analyzer:分析模块。夏普比例,回撤等指标。
  • Observer:监控模块。在每天的执行完成后,对系统的情况进行监控。

上面列出了主要的一些模块,以及一句话介绍。接下来介绍一下BackTrader的执行流程。

  1. 实例化Cerebro对象
  2. 按需添加Data, Strategy, Indicator等模块
  3. 运行Cerebro实例
  4. 完成回测后画图

从官网上拖一个例子:

import 
           

上面的例子只有四行,什么都没加,没有数据也没有策略,什么都做不了,但是可以运行。

一个最小的案例必须有数据和策略。

数据部分:

数据可以是pandas结构。这里举一个pandas的例子。我是用的是tushare的数据接口。这部分内容看官可以自己上tushare的官网上看一下。我这里直接从dataframe这里往下走。

tushare的数据并不能直接用,需要简单处理一下。

dataline 
           

注:open, high, low, close, volume, openinterest这几个字段都必须有。我跑的时候少了volume,结果报错。找了好久才发现这个原因。

其中trade_date字段要作为index,格式必须是datetime对象。

策略部分:

策略的类必须的自己实现。这里我用一个官网的例子,删掉了非关键的部分。

class 
           

TestStrategy继承了bt.Strategy基类。在里封装了两个函数:一个是__init__,用于初始化,另外一个next()是实际执行的函数。

init函数里面定义了一个别名(self.dataclose),方便后面对数据的引用。self.dataclose是我们输入策略的时间序列。

随便说一句,bt里面定义了很多别名,比如p代表params,l代表line,这样比较方便。

next函数会每个event循环。一般都是按照时间event。每个bar循环一次。比如有10个bar,默认会循环10次(有些指标计算会有时间滞后,会少于这个时间)。在上面的例子里面,策略的含义是,上一个bar的收盘价比上上一个的收盘价低就执行买入。

这里要提到一个概念:lines。self.dataclose就是一个line。

BackTrader里面把时间序列数据定义为了一个line。line类似一个列表,line[0]指的是今天的数据,line[-1]是昨天。以此类推。后面我们在设计indicator,observer的时候,也需要定义line。

这个line是一个linebuff的实例。这个类考虑了很多性能优化的设计。

注意:line不支持slice。类似line[n:m]这样的操作是错误的。要用专门的get方法类似下面

self
           

OK。到这里,有了data和stretage,一个最小的回测实例就实现了。这个实例还非常的简单,离实际的应用还很远,后面我们会继续介绍其中的每个模块。今天先到这里。