vnpy怎么创建策略并回测_【手把手教你】入门量化回测最强神器backtrader(一)
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(一)相关推荐
- alpha因子常见问题_手把手教你构建量化因子分析体系
原标题:手把手教你构建量化因子分析体系 挖掘Alpha因子.评价Alpha因子.改进Alpha因子是量化投资者职业生涯永恒的奋斗目标,而一套严密有效的因子分析体系是这一切的基石."不以规矩, ...
- gitbash登录码云报错_手把手教你入门git仓库和关联码云
gitHub(国外)和Gitee(码云,国内的) 环境配置教程 注册码云账号和git安装教程的具体指导(生成密钥,环境配置,绑定邮箱用户) 百度网盘下载链接(.pdf文件):https://pan.b ...
- 谈一谈人工智能怎么入门_手把手教你入门
要问现在的科技界什么最火?答案八九不离十是人工智能,机器学习,深度学习等等.有人说人工智能的未来是泡沫,可是公司门口的指纹门禁,手机拍照时的人脸聚焦,居家使用的扫地机器人,凡此种种,这些都是人工智能的 ...
- 亲测,手把手教你用Python抢票
亲测,手把手教你用Python抢票 原创 2015-12-10 大数据文摘 大数据文摘 关于转载授权 大数据文摘作品,欢迎个人转发朋友圈,自媒体.媒体.机构转载务必申请授权,后台留言"机构名 ...
- 软件_手把手教vscode配置c++,python开发环境
原创:软件_手把手教vscode配置c++,python开发环境 之前主用Python作为项目开发语言,将项目迁移到arm边缘盒子上后发现arm的cpu不给力,软件速度低于预期,所以计划将部分程序改为 ...
- vnpy怎么创建策略并回测_基于vnpy、rqdata的回测打通历程
本文用于记录本人回测填坑路上蹚过的坑. 历史数据方面,最近听说rqdata数据质量不错,而且可以通过米匡注册用户享有1个月免费使用期,于是打算用于回测的数据来源. 话不多说. 安装vnpy2.0.5, ...
- python k线合成_手把手教你写一个Python版的K线合成函数
手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...
- 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...
话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...
- python 靶心_手把手教你使用Python实战反欺诈模型|原理+代码
原标题:手把手教你使用Python实战反欺诈模型|原理+代码 作者 | 萝卜 来源 | 早起Python(ID: zaoqi-python) 本文将基于不平衡数据,使用Python进行 反欺诈模型数据 ...
最新文章
- 刷题中,效率好低,哈哈哈 -----1.Two Sum
- 【Android】系统目录理解
- docker端口映射或启动容器时报错 driver failed programming external connectivity on endpoint
- vue自定义指令(详细)
- LeetCode 389. Find the Difference
- 【翻译】Sencha Cmd中脚本压缩方法之比较
- IntelliJ IDEA 运行你的第一个Java应用程序
- .net core平台使用遇到的坑
- 《Java核心技术 卷12》读书笔记
- 5G及移动边缘计算(MEC)学习笔记(1)
- 【PRD】倒推“Soul”APP产品需求文档
- 体验为王-2021友盟+移动性能优化比赛第一名作品
- 在mysql中 使用in关键字实现子查询_MySQL 之子查询
- 华为交换机:STP测试实验
- 获取客户端mac地址 php,js获取客户端mac地址的方法
- css中“~”(波浪号)、“,”(逗号)、 “ + ”(加号)和 “ > ”(大于号)是什么意思?
- Power OJ 2844: New contest【模拟】
- 帮我看看怎么回事的错误
- 如果手里有现金,是提前还房贷还是买基金?
- 【Nginx】第二十二节 redirect跟permanent区别
热门文章
- HALCON示例程序color_segmentation_pizza.hdev披萨肉饼识别。
- opencv 文件模块 解析
- java delegate怎么写_美团面试官:你说你们公司的Mybatis分页插件是你写的,给我说说它的设计原理?...
- css 宋体_Java前端基础(一)之html/css
- 微信转账一次显示两个_微信为啥分红包和转账两大功能?这4个区别你要知道,望相互转告...
- 史蒂夫乔布斯6月斯坦佛大学演讲: 必须找到你所钟爱的东西
- Spring AOP(三)--XML方式实现
- Ubuntu下安装SSH服务
- 一些应该记住的东西(持续更新?再也不会更新了)
- python进行数据分析