1 引言

目前基于Python的量化回测框架有很多,开源框架有zipline、vnpy、pyalgotrader和backtrader等,而量化平台有Quantopian(国外)、聚宽、万矿、优矿、米筐、掘金等,这些量化框架或平台各有优劣。就个人而言,比较偏好用backtrader,因为它功能十分完善,有完整的使用文档,安装相对简单(直接pip安装即可)。优点是运行速度快,支持pandas的矢量运算;支持参数自动寻优运算,内置了talib股票分析技术指标库;支持多品种、多策略、多周期的回测和交易;支持pyflio、empyrica分析模块库、alphalens多因子分析模块库等;扩展灵活,可以集成TensorFlow、PyTorch和Keras等机器学习、神经网络分析模块。而不足之处在于,backtrader学习起来相对复杂,编程过程中使用了大量的元编程(类class),如果Python编程基础不扎实(尤其是类的操作),学起来会感到吃力。本文作为backtrader的入门系列之一,对其运行框架进行简要介绍,并以实际案例展示量化回测的过程。

2 backtrader简介

如果将backtrader包分解为核心组件,主要包括以下组成部分:
(1)数据加载(Data Feed):将交易策略的数据加载到回测框架中。

(2)交易策略(Strategy):该模块是编程过程中最复杂的部分,需要设计交易决策,得出买入/卖出信号。
(3)回测框架设置( Cerebro):需要设置(i)初始资金(ii)佣金(iii)数据馈送(iv)交易策略(v)交易头寸大小。
(4)运行回测:运行Cerebro回测并打印出所有已执行的交易。
(5)评估性能(Analyzers):以图形和风险收益等指标对交易策略的回测结果进行评价。

“Lines”是backtrader回测的数据,由一系列的点组成,通常包括以下类别的数据:Open(开盘价), High(最高价), Low(最低价), Close(收盘价), Volume(成交量), OpenInterest(无的话设置为0)。Data Feeds(数据加载)、Indicators(技术指标)和Strategies(策略)都会生成 Lines。价格数据中的所有”Open” (开盘价)按时间组成一条 Line。所以,一组含有以上6个类别的价格数据,共有6条 Lines。如果算上“DateTime”(时间,可以看作是一组数据的主键),一共有7条 Lines。当访问一条 Line 的数据时,会默认指向下标为 0 的数据。最后一个数据通过下标 -1 来访问,在-1之后是索引0,用于访问当前时刻。因此,在回测过程中,无需知道已经处理了多少条/分钟/天/月,”0”一直指向当前值,下标 -1 来访问最后一个值。

3 回测应用实例

量化回测说白了是使用历史数据去验证交易策略的性能,因此回测的第一步是搭建交易策略,这也是backtrader要设置的最重要和复杂的部分,策略设定好后,其余部分的代码编写是手到擒来。

01构建策略(Strategy)

交易策略类代码包含重要的参数和用于执行策略的功能,要定义的参数或函数名如下:

(1)params-全局参数,可选:更改交易策略中变量/参数的值,可用于参数调优。

(2)log:日志,可选:记录策略的执行日志,可以打印出该函数提供的日期时间和txt变量。

(3) __init__:用于初始化交易策略的类实例的代码。

(4)notify_order,可选:跟踪交易指令(order)的状态。order具有提交,接受,买入/卖出执行和价格,已取消/拒绝等状态。

(5)notify_trade,可选:跟踪交易的状态,任何已平仓的交易都将报告毛利和净利润。

(6)next,必选:制定交易策略的函数,策略模块最核心的部分。

下面以一个简单的单均线策略为例,展示backtrader的使用过程,即当收盘价上涨突破20日均线买入(做多),当收盘价下跌跌穿20日均线卖出(做空)。为简单起见,不报告交易回测的日志,因此log、notify_order和notify_trade函数省略不写。

class my_strategy1(bt.Strategy):#全局设定交易策略的参数params=(('maperiod',20),)def __init__(self):#指定价格序列self.dataclose=self.datas[0].close# 初始化交易指令、买卖价格和手续费self.order = Noneself.buyprice = Noneself.buycomm = None#添加移动均线指标,内置了talib模块self.sma = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.maperiod)def next(self):if self.order: # 检查是否有指令等待执行, return# 检查是否持仓   if not self.position: # 没有持仓#执行买入条件判断:收盘价格上涨突破20日均线if self.dataclose[0] > self.sma[0]:#执行买入self.order = self.buy(size=500)         else:#执行卖出条件判断:收盘价格跌破20日均线if self.dataclose[0] < self.sma[0]:#执行卖出self.order = self.sell(size=500)

02数据加载(Data Feeds)

策略设计好后,第二步是数据加载,backtrader提供了很多数据接口,包括quandl(美股)、yahoo、pandas格式数据等,我们主要分析A股数据。

mpl.rcParams['axes.unicode_minus']=False

#先引入后面可能用到的包(package)
import pandas as pd
from datetime import datetime
import backtrader as bt
import matplotlib.pyplot as plt
%matplotlib inline   #正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']#使用tushare旧版接口获取数据
import tushare as ts
def get_data(code,start='2010-01-01',end='2020-03-31'):df=ts.get_k_data(code,autype='qfq',start=start,end=end)df.index=pd.to_datetime(df.date)df['openinterest']=0df=df[['open','high','low','close','volume','openinterest']]return df

dataframe=get_data('600000')

#回测期间
start=datetime(2010, 3, 31)
end=datetime(2020, 3, 31)
# 加载数据
data = bt.feeds.PandasData(dataname=dataframe,fromdate=start,todate=end)

03 回测设置(Cerebro)

回测设置主要包括几项:回测系统初始化,数据加载到回测系统,添加交易策略, broker设置(如交易资金和交易佣金),头寸规模设置作为策略一部分的交易规模等,最后显示执行交易策略时积累的总资金和净收益。

# 初始化cerebro回测系统设置
cerebro = bt.Cerebro()
#将数据传入回测系统
cerebro.adddata(data)
# 将交易策略加载到回测系统中
cerebro.addstrategy(my_strategy1)
# 设置初始资本为10,000
startcash = 10000
cerebro.broker.setcash(startcash)
# 设置交易手续费为 0.2%
cerebro.broker.setcommission(commission=0.002)

04 执行回测

输出回测结果。

print(f'净收益: {round(pnl,2)}')

d1=start.strftime('%Y%m%d')
d2=end.strftime('%Y%m%d')
print(f'初始资金: {startcash}n回测期间:{d1}:{d2}')
#运行回测系统
cerebro.run()
#获取回测结束后的总资金
portvalue = cerebro.broker.getvalue()
pnl = portvalue - startcash
#打印结果
print(f'总资金: {round(portvalue,2)}')初始资金: 10000
回测期间:20100331:20200331
总资金: 12065.36
净收益: 2065.36

05可视化

对上述结果进行可视化,使用内置的matplotlib画图。至此,简单的单均线回测就完成了。下面图形展示了浦发银行在回测期间的价格走势、买卖点和交易总资金的变化等。当然,本文着重以最简化的例子展示backtrader的框架和运行过程,要想更详细的展示回测过程和结果,还需要加入其他函数和模块,关于Analyzers分析模块的应用请留意下一篇推文。

%matplotlib inline #在jupyter notebook上运行
cerebro.plot(style='candlestick')

4 结语

backtrader是目前功能最完善的Python量化回测框架之一(单机版),得到欧洲很多银行、基金等金融机构的青睐,并应用于实盘交易中。作为入门序列之一,本文简单介绍了backtrader框架的各个组成部分,然后以20日单均线策略为例,展示了回测系统的编程和运行。公众号接下来将以专题的形式为大家全面介绍backtrader的应用。学习没有捷径,要想全面而深入地学习backtrader回测框架,最好的方法是研读其官方文档。

参考资料:

backtrader官方文档:

https://www.backtrader.com/docu/

vnpy怎么创建策略并回测_【手把手教你】入门量化回测最强神器backtrader(一)相关推荐

  1. alpha因子常见问题_手把手教你构建量化因子分析体系

    原标题:手把手教你构建量化因子分析体系 挖掘Alpha因子.评价Alpha因子.改进Alpha因子是量化投资者职业生涯永恒的奋斗目标,而一套严密有效的因子分析体系是这一切的基石."不以规矩, ...

  2. gitbash登录码云报错_手把手教你入门git仓库和关联码云

    gitHub(国外)和Gitee(码云,国内的) 环境配置教程 注册码云账号和git安装教程的具体指导(生成密钥,环境配置,绑定邮箱用户) 百度网盘下载链接(.pdf文件):https://pan.b ...

  3. 谈一谈人工智能怎么入门_手把手教你入门

    要问现在的科技界什么最火?答案八九不离十是人工智能,机器学习,深度学习等等.有人说人工智能的未来是泡沫,可是公司门口的指纹门禁,手机拍照时的人脸聚焦,居家使用的扫地机器人,凡此种种,这些都是人工智能的 ...

  4. 亲测,手把手教你用Python抢票

    亲测,手把手教你用Python抢票 原创 2015-12-10 大数据文摘 大数据文摘 关于转载授权 大数据文摘作品,欢迎个人转发朋友圈,自媒体.媒体.机构转载务必申请授权,后台留言"机构名 ...

  5. 软件_手把手教vscode配置c++,python开发环境

    原创:软件_手把手教vscode配置c++,python开发环境 之前主用Python作为项目开发语言,将项目迁移到arm边缘盒子上后发现arm的cpu不给力,软件速度低于预期,所以计划将部分程序改为 ...

  6. vnpy怎么创建策略并回测_基于vnpy、rqdata的回测打通历程

    本文用于记录本人回测填坑路上蹚过的坑. 历史数据方面,最近听说rqdata数据质量不错,而且可以通过米匡注册用户享有1个月免费使用期,于是打算用于回测的数据来源. 话不多说. 安装vnpy2.0.5, ...

  7. python k线合成_手把手教你写一个Python版的K线合成函数

    手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...

  8. 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...

    话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...

  9. python 靶心_手把手教你使用Python实战反欺诈模型|原理+代码

    原标题:手把手教你使用Python实战反欺诈模型|原理+代码 作者 | 萝卜 来源 | 早起Python(ID: zaoqi-python) 本文将基于不平衡数据,使用Python进行 反欺诈模型数据 ...

最新文章

  1. 刷题中,效率好低,哈哈哈 -----1.Two Sum
  2. 【Android】系统目录理解
  3. docker端口映射或启动容器时报错 driver failed programming external connectivity on endpoint
  4. vue自定义指令(详细)
  5. LeetCode 389. Find the Difference
  6. 【翻译】Sencha Cmd中脚本压缩方法之比较
  7. IntelliJ IDEA 运行你的第一个Java应用程序
  8. .net core平台使用遇到的坑
  9. 《Java核心技术 卷12》读书笔记
  10. 5G及移动边缘计算(MEC)学习笔记(1)
  11. 【PRD】倒推“Soul”APP产品需求文档
  12. 体验为王-2021友盟+移动性能优化比赛第一名作品
  13. 在mysql中 使用in关键字实现子查询_MySQL 之子查询
  14. 华为交换机:STP测试实验
  15. 获取客户端mac地址 php,js获取客户端mac地址的方法
  16. css中“~”(波浪号)、“,”(逗号)、 “ + ”(加号)和 “ > ”(大于号)是什么意思?
  17. Power OJ 2844: New contest【模拟】
  18. 帮我看看怎么回事的错误
  19. 如果手里有现金,是提前还房贷还是买基金?
  20. 【Nginx】第二十二节 redirect跟permanent区别

热门文章

  1. HALCON示例程序color_segmentation_pizza.hdev披萨肉饼识别。
  2. opencv 文件模块 解析
  3. java delegate怎么写_美团面试官:你说你们公司的Mybatis分页插件是你写的,给我说说它的设计原理?...
  4. css 宋体_Java前端基础(一)之html/css
  5. 微信转账一次显示两个_微信为啥分红包和转账两大功能?这4个区别你要知道,望相互转告...
  6. 史蒂夫乔布斯6月斯坦佛大学演讲: 必须找到你所钟爱的东西
  7. Spring AOP(三)--XML方式实现
  8. Ubuntu下安装SSH服务
  9. 一些应该记住的东西(持续更新?再也不会更新了)
  10. python进行数据分析