搭建 backtrader 量化框架

安装 Backtrader 库:

pip install backtrader

如果需要绘图的话,还要安装 matplotlib 库,否则调用 cerebro.plot() 函数时会报错。另外,backtrader 与 matplotlib 3.3以上版本不兼容,如果以前安装过 3.3 版本的话,需要卸载并安装 3.2 版本:

pip uninstall matplotlib
pip install matplotlib==3.2.2

那么,量化框架就搭好了。

backtrader 的运行流程

制定策略

  1. 确定潜在的可调参数
  2. 实例化您在策略中需要的指标
  3. 写下进入/退出市场的逻辑

创建Cerebro引擎(西班牙语大脑的意思)

  1. 注入策略
  2. 使用cerebro.adddata加载回测数据
  3. 执行cerebro.run
  4. 使用cerebro.plot绘制可视化图表

backtrader 简单应用

OK,按照上面的流程,我们来做一个简单的回测。下面的代码是直接抄自 backtrader 官网的 Hello Algotrading! 然后我唯一的改动就是把 data feed 的获取方式从原本是通过调用 yahoo API 在线获取改成了读取本地 csv 数据(样本数据见文末附件)。

from datetime import datetime
import backtrader as bt

# Create a subclass of Strategy to define the indicators and logic

class SmaCross(bt.Strategy):

  # list of parameters which are configurable for the strategy

  params = dict(
​    pfast=10, # period for the fast moving average
​    pslow=20  # period for the slow moving average
  )

  def __init__(self):
​    sma1 = bt.ind.SMA(period=self.p.pfast) # fast moving average
​    sma2 = bt.ind.SMA(period=self.p.pslow) # slow moving average
​    self.crossover = bt.ind.CrossOver(sma1, sma2) # crossover signal

  def next(self):
​    if not self.position: # not in the market
​      if self.crossover > 0: # if fast crosses slow to the upside
​        self.buy() # enter long
​    elif self.crossover < 0: # in the market & cross to the downside
​      self.close() # close long position

cerebro = bt.Cerebro() # create a "Cerebro" engine instance

# Create a data feed,这里我改成了获取本地数据
# data = bt.feeds.YahooFinanceData(dataname='MSFT', fromdate=datetime(2011, 1, 1), todate=datetime(2012, 12, 31))
data = bt.feeds.GenericCSVData(
  dataname='history_k_data.csv',
  datetime=0, # 日期字段位置
  open=2, # 开盘价
  high=3, # 最高价
  low=4, # 最低价
  close=5,  # 收盘价
  volume=7,  # 成交量
  dtformat=('%Y-%m-%d'), # 定义日期格式
  fromdate=datetime(2017, 6, 1), # 起始时间
  todate=datetime(2017, 12, 29)  # 结束时间
)

cerebro.adddata(data) # Add the data feed
cerebro.addstrategy(SmaCross) # Add the trading strategy
cerebro.run() # run it all
cerebro.plot() # and plot it with a single command

执行结果:Figure_0.png

通过回测图形可以看到,忙活了大半年居然赚了 0.04 元。

【样本数据下载】