1 Installation【安装】
1.1Requirements and versions【所需要的库以及版本】
backtrader is self-contained with no external dependencies (except if you want to plot)
- Python3.X【也可以支持2.X,但是2.X未来不会维护了,所以默认3.X版本】
- Matplotlib>=1.4.1
1.2 Install from pypi(including matplotlib)【安装方式】
这里仅介绍pip方式
pip install backtrader
2.Quickstart【快速启动】
提示:注意backtrader更新,需要维护好自己的代码块。
Using the platform【使用平台】
在运行backtrader之前,我们必须弄清楚两个概念。
一个是line【这个是backtrader独有的概念】
一个是索引0的方法
- 1.line:
这里笔者能够理解的就是一列数据,比如df['close']是df的一列,也是一line。
而要要运行backtrader,就必须至少传入6line,它们分别是:
Open, High, Low, Close, Volume, OpenInterest
OpenInterest:为持仓量,初始默认为0
如果我们还要考虑“datatime”【交易时间】,那么传入到backtrader,就是7line,不过一般datatime会被处理成df.index。
- 2. Index 0 Approach:
我们访问当前值的位置始终是0,即close[0]
self.sma = SimpleMovingAverage(.....)#初始化self.sma
av = self.sma[0]#av代表self.sma[0]当前值
在我们进行比较和分析的过程中,你无须知道len(line)有多长,无需知道已经处理了多少个条/分钟/天/月,因为“ 0”唯一地标识当前时刻。
There is no need to know how many bars/minutes/days/months have been processed, because “0”uniquely identifies the current instant.
访问0索引之前的输出值:
previous_value = self.sma[-1]
以此类推,[-2],[-3]...
案例一:简单运行backtrader:
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import backtrader as bt
if __name__ == '__main__':
cerebro = bt.Cerebro()
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
Starting Portfolio Value:初始投资组合价值
bs_func:cerebro.broker.getvalue()
Final Portfolio Value:最终投资组合价值
bs_func:cerebro.broker.getvalue()
run_result:
Starting Portfolio Value: 10000.00
Final Portfolio Value: 10000.00
实例讲解:
- 1.引入backtrader库的书写方法
- 2.实例化交易资金
- 3.运行【无策略,数据加载】
- 4.打印结果
- 5.Starting Portfolio Value默认为1万资金。
案例二:设置Starting Portfolio Value交易资金
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import backtrader as bt
if __name__ == '__main__':
cerebro = bt.Cerebro()
cerebro.broker.setcash(100000.0)
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
通过实例化的cerebro.broker.setcash函数进行修改初始交易资金金额
run_result:
Starting Portfolio Value: 100000.00
Final Portfolio Value: 100000.00
案例三:添加数据【Adding a Data Feed】
这里主要是因为backtrader使用的是YahooFinanceCSVData数据接口,笔者是用的本地的csv文本,所以要注意以下几点:
1.backtrader只接受7line,datetime as df.index,剩余6列作为col,一般而言,由于爬虫,购买或者专业的接口的不同,业务需求不同,都会使得原始数据无法直接在backtrader进行加载。
2.如何增加数据line,则需要对于backtrader的函数进行修改,这个未来介绍。
3.策略以及训练才是我们的目的,因此,我们需要对照自己的策略对于数据的要求,策略训练评估的要求,对于数据进行处理。
import os.path # 路径管理
import sys # 获取当前运行脚本的路径 (in argv[0])
import pandas as pd
from datetime import datetime
import backtrader as bt
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
#create a data feed
if __name__ == '__main__':
# 创建Cerebro引擎
cerebro = bt.Cerebro()
# Cerebro引擎在后台创建broker(经纪人),系统默认资金量为10000
# 为Cerebro引擎添加策略
#cerebro.addstrategy(TestStrategy)
pf_bank = pd.read_csv('sh600000.csv', index_col=0, parse_dates=True) # 导入数据
pf_bank['date'] = pd.to_datetime(pf_bank.date) # 将str格式转为date格式
pf_bank = pf_bank.sort_values(by='date')
pf_bank = pf_bank.reset_index(drop=True)
# 所以必须先print(pf_bank.info()),查询date因子的格式情况,然后进行转换
pf_bank.index = pd.to_datetime(pf_bank.date) # 变为索引
pf_bank['openinterest'] = 0
pf_bank = pf_bank[['open', 'high', 'low', 'close', 'volume', 'openinterest']]
print(pf_bank)
# openinterest:持仓量(Open Interest)
start = datetime(2018, 3, 31)
end = datetime(2019, 3, 31)
# 加载数据
data = bt.feeds.PandasData(dataname=pf_bank, fromdate=start, todate=end)
# 加载交易数据
cerebro.adddata(data)
# 设置投资金额1000.0
cerebro.broker.setcash(1000.0)
# 每笔交易使用固定交易量
cerebro.addsizer(bt.sizers.FixedSize, stake=10)
# 设置佣金为0.0
cerebro.broker.setcommission(commission=0.0)
# 引擎运行前打印期出资金
print('组合期初资金: %.2f' % cerebro.broker.getvalue())
cerebro.run()
# 引擎运行后打期末资金
print('组合期末资金: %.2f' % cerebro.broker.getvalue())
run_result:
Starting Portfolio Value: 1000.00
Final Portfolio Value: 1000.00
matters needing attention :
- openinterest处理均为0,而且需要自己进行添加
- 由于没有加载策略,所以即便初始化了交易账户资金以及加载数据,仍然没有任何变化
- 我们要理解一点的是,一般而言的量化回测都是通过矢量化的方式去生成:
一般而言,我们的处理是先生成信号,持仓位置以及空仓位置,再加载账户进行处理。
- backtrader是通过只是反复比较前后三个bar【条】数据来判断,近似于实盘交易,因此在交易和持仓过程中的止盈止损才更好设置。
backtrader是根据数据不断传输中,产生买入-持仓-卖出-空仓的过程。
- 只有理解了市面上的一般性回测与backtrader回测的不同,才能继续深入理解和学习。
本文暂时没有评论,来添加一个吧(●'◡'●)