1、backtrader介绍 关于backtrader本身的背景此处不做过多的介绍,中文文档的传送门: http://backtrader.com.cn/ 中文文档写的很好。
不过对于熟悉python语言的同学,比如我这种的 非专业的python语言开发者来说是有一个很大的弊端,就是没有办法把照着文档一步一步的把策略回测起来。
因为文档中的行情源来自于雅虎,由于不可抗拒的原因,我们应该是没有办法 直接获取雅虎的行情源,并且我们对老美的行情数据并不怎么感兴趣,我们还是非常热爱大A,虽然他常常让我们关灯吃面。
因此本文档会把行情源换成我们大A行情源,并且会把回测结果用图像展示出来,话不多说,先上结果,以下是回测结果图形的展示:
以下是搭建backtrader的过程: 基本要求是: Python 2.7 Python 3.2 / 3.3 / 3.4 / 3.5 pip install backtrader pip install matplotlib==3.2.2(此处一定要使用3.2.2版本,如果直接使用pip install matplotlib命令进行安装最新的版本,会导致显示回测结果图像时报错) 后续代码运行过程中缺什么包就是用,pip安装什么包
废话不多,上代码:
import datetime #
import os.path # 路径管理
import sys # 获取当前运行脚本的路径 (in argv[0])
#导入backtrader框架
import backtrader as bt
import pandas as pd
# 创建策略继承bt.Strategy
class TestStrategy(bt.Strategy):
def log(self, txt, dt=None):
# 记录策略的执行日志
dt = dt or self.datas[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt))
def __init__(self):
# 保存收盘价的引用
self.dataclose = self.datas[0].close
# 跟踪挂单
self.order = None
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
# broker 提交/接受了,买/卖订单则什么都不做
return
# 检查一个订单是否完成
# 注意: 当资金不足时,broker会拒绝订单
if order.status in [order.Completed]:
if order.isbuy():
self.log('已买入, %.2f' % order.executed.price)
elif order.issell():
self.log('已卖出, %.2f' % order.executed.price)
# 记录当前交易数量
self.bar_executed = len(self)
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('订单取消/保证金不足/拒绝')
# 其他状态记录为:无挂起订单
self.order = None
def next(self):
# 记录收盘价
self.log('Close, %.2f' % self.dataclose[0])
# 如果有订单正在挂起,不操作
if self.order:
return
# 如果没有持仓则买入
if not self.position:
# 今天的收盘价 < 昨天收盘价
if self.dataclose[0] < self.dataclose[-1]:
# 昨天收盘价 < 前天的收盘价
if self.dataclose[-1] < self.dataclose[-2]:
# 买入
self.log('买入, %.2f' % self.dataclose[0])
# 跟踪订单避免重复
self.order = self.buy()
else:
# 如果已经持仓,且当前交易数据量在买入后5个单位后
if len(self) >= (self.bar_executed + 5):
# 全部卖出
self.log('卖出, %.2f' % self.dataclose[0])
# 跟踪订单避免重复
self.order = self.sell()
if __name__ == '__main__':
# 创建Cerebro引擎
cerebro = bt.Cerebro()
# Cerebro引擎在后台创建broker(经纪人),系统默认资金量为10000
# 为Cerebro引擎添加策略
cerebro.addstrategy(TestStrategy)
# Create a Data Feed
# 本地数据,笔者用Wind获取的东风汽车数据以csv形式存储在本地。
# parase_dates = True是为了读取csv为dataframe的时候能够自动识别datetime格式的字符串,big作为index
# 注意,这里最后的pandas要符合backtrader的要求的格式
dataframe = pd.read_csv('dfqc.csv', index_col=0, parse_dates=True)
dataframe['openinterest'] = 0
data = bt.feeds.PandasData(dataname=dataframe,
fromdate = datetime.datetime(2015, 1, 1),
todate = datetime.datetime(2016, 12, 31)
)
# Add the Data Feed to Cerebro
cerebro.adddata(data)
# 设置投资金额100000.0
cerebro.broker.setcash(100000.0)
# 引擎运行前打印期出资金
print('组合期初资金: %.2f' % cerebro.broker.getvalue())
cerebro.run()
# 引擎运行后打期末资金
print('组合期末资金: %.2f' % cerebro.broker.getvalue())
# Plot the result
cerebro.plot()
上面这段代码整个框架来自于backtrader的官网 (http://backtrader.com.cn/) 笔者自己修改了获取数据的方式,以及增加了打印出了运行结果, 其中数据源文件:dfqc.csv的下载地址 链接:https://pan.baidu.com/s/1slnULbv 密码:wi3k 下载完dfqc.csv文件放到和需要运行的Python代码的同级 大家安装完backtrader, 放到行情数据之后,就可以把代码可以复制过去运行,运行的结果就是如上图,图像就描述了策略的运行结果
以上的博文借鉴了Backtrader量化平台教程(一):backtrader的整体框架_钱塘小甲子的博客-CSDN博客_backtrader
感谢大佬