一、BackTrader介绍
BackTrader是开源免费的量化交易策略回测系统, 运行流程:
- 引入backtrader
- 加载和注入数据Feed(cerebro.adddata)
- 执行:cerebro.run()
- 可视化结果: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