一、BackTrader介绍

BackTrader是开源免费的量化交易策略回测系统, 运行流程:

  1. 引入backtrader
  2. 加载和注入数据Feed(cerebro.adddata)
  3. 执行:cerebro.run()
  4. 可视化结果:cerebro.plot()

二、安装BackTrader

1、安装环境要求:

  • Python 2.7
  • Python 3.2 / 3.3/ 3.4 / 3.5
  • pypy/pypy3
  • Matplotlib> = 1.4.1(如果需要绘图的话需要配置)

2、兼容Python2.x/3.x

from __future__ import (absolute_import, division, print_function,unicode_literals)

3.1、通过pip安装:

pip install backtrader

如果想同时安装matplotlib: pip install backtrader[plotting]

3.2、通过源安装

https://github.com/mementum/backtrader python安装源文件,自己搜索

3.3、通过pycharm安装

新建项目 -> Files -> Settings -> Project 项目名称 -> Project Interpreter -> 右侧加号,搜索backtrader Install Package即可

三、backtrader用法

1、使用前说明

常用数据名称: 开盘价,最高价,最低价,收盘价,成交量,持仓量

数据索引方式: 当前值:[0] 前一个值:[-1] 前2个值:[-2] ……

说明:所有的数字都是历史值,所以只能往后推

1、基本功能
from __future__ import (absolute_import, division, print_function,unicode_literals) 
#让python2兼容python3,python3环境下可以不用写

#引入backtrader
import backtrader as bt

if __name__ == '__main__':
    cerebro = bt.Cerebro()
    cerebro.broker.setcash(100.0) #可以自定义金额

    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())

    cerebro.run()

    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

执行结果:

Starting Portfolio Value: 100.00

Final Portfolio Value: 100.00

2、添加数据

说明: os.path.dirname 当前文件的绝对路劲目录(不包含文件名) __file__ 当前文件绝对路劲+文件名 os.path.abspath(path) 输出绝对路劲、当前目录、上级目录等(反斜杠) sys.argv[0] 当前文件绝对路劲+文件名(本地目录,正斜杠,用的时候需要转化成反斜杠)

print(sys.argv[0]) #输出:D:/python/futures/macd.py
print(os.path.abspath(sys.argv[0])) #输出:D:\python\futures\macd.py
print(os.path.dirname(os.path.abspath(sys.argv[0]))) #输出:D:\python\futures

代码:

import datetime  # For datetime objects
import os.path  # To manage paths
import sys  # To find out the script name (in argv[0])

# Import the backtrader platform
import backtrader as bt

if __name__ == '__main__':
    # Create a cerebro entity
    cerebro = bt.Cerebro()

    # Datas are in a subfolder of the samples. Need to find where the script is
    # because it could have been called from anywhere
    modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
    datapath = os.path.join(modpath, '../../datas/orcl-1995-2014.txt')

    # Create a Data Feed
    data = bt.feeds.YahooFinanceCSVData(
        dataname=datapath,
        # Do not pass values before this date
        fromdate=datetime.datetime(2000, 1, 1),
        # Do not pass values after this date
        todate=datetime.datetime(2000, 12, 31),
        reverse=False)

    # Add the Data Feed to Cerebro
    cerebro.adddata(data)

    # Set our desired cash start
    cerebro.broker.setcash(100000.0)

    # Print out the starting conditions
    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())

    # Run over everything
    cerebro.run()

    # Print out the final result
    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

运行结果:

Starting Portfolio Value: 1000000.00

Final Portfolio Value: 1000000.00