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

74df9398becab996de171ea07f6bfe33.png

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 来访问最后一个值。

d39e358657485f6be6e1a1c683160cc9.png

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')

6db6fda99cbb7e24ec95a787448de229.png

4 结语

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

参考资料:

backtrader官方文档:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构基础:算法的基础知识笔记

1、算法的概念算法是问题求解过程中的精确描述&#xff0c;它为解决某一特定类型的问题规定了一个运算过程。2、算法的特点2.1 有穷性一个算法必须在有穷的步骤结束后结束&#xff0c;并且每一步都在有穷时间内完成。2.2 确定性算法的执行过程中每一步都要有确定的定义&#xf…

数据结构基础:图结构的学习笔记

1、图的定义图是比树更加复杂的数据结构&#xff0c;在图的结构当中&#xff0c;任意两个节点之间都有可能有直接关系&#xff0c;所以图中一个节点的前驱和后继的数目是没有限制的。2、图的用途用于描述各种复杂的数据对象&#xff0c;在自然科学、社会科学和人文科学等很多领…

企业网站 源码 服务邮箱:_企业网站建设对于服务器的选择至关重要

网站建设是离不开租用服务器的&#xff0c;这是目前大多数企业都在做的。但有些企业由于对网站服务器的租用技巧及经验的缺乏&#xff0c;经常会导致网站在运营过程中出现非常多的问题&#xff0c;严重影响了企业业务的正常开展。石家庄网站建设方面的人才来说明几点不容忽视的…

linux sli 提高效率,从原理到性能提升 MCP78智能SLI全解析

NVIDIA正式发布了“Hbrid SLI”技术在昨日的2008 CES上&#xff0c;NVIDIA正式向外界发布了“Hbrid SLI”技术&#xff0c;即我们所俗称的混合SLI&#xff0c;而NVIDIA在发布时已更正式名为“智能SLI技术”。虽然这仅仅是NVIDIA在此次消费电子展上的宣讲主题之一&#xff0c;但…

[GitHub]第三讲:简单分支操作

Git 最核心的操作对象是版本&#xff08; commit &#xff09;&#xff0c;最核心的操作技巧就是分支。 什么是分支&#xff1f; 仓库创建后&#xff0c;一旦有了新 commit&#xff0c;默认就会放到一个分支上&#xff0c;名字叫 master。前面咱们一直看到的多个版本组成的一条…

算法基础:常用的排序算法知识笔记

1、算法外排序分类2、冒泡排序冒泡排序&#xff08;Bubble Sort&#xff09;属于交换排序&#xff0c;它的原理是&#xff1a;循环两两比较相邻的记录&#xff0c;如果反序则交换&#xff0c;直到没有反序的记录为止。实现算法&#xff1a;/*** 冒泡排序优化后的算法* 设置一个…

302状态码_http状态码是什么?301 302 404的SEO应用场景

什么是HTTP状态码&#xff1f;简单的讲&#xff0c;就是用以表示网页服务器HTTP响应状态的3位数字代码。其中1xx表示临时响应&#xff0c;2xx表示成功处理了请求&#xff0c;3xx代表重定向&#xff0c;4xx表示请求错误&#xff0c;而5xx表示服务器错误。除了网页正常返回200之外…

算法基础:常用的查找算法知识笔记

1、查找表和查找效率的概念查找表是指由同一类型的数据元素构成的集合。分为静态查找表和动态查找表。1.1 静态查找表1、查询某个特定元素是否在查找表的集合当中2、查询某个特定元素的各种属性1.2 动态查找表1、在查找表中插入一个数据元素2、在查找表中删除一个元素1.3 关键字…

注解参数怎么使用变量_硅橡胶胶水有哪些特点?使用参数表现的怎么样?如何储存?...

作为单组分产品&#xff0c;硅橡胶胶水的使用方法简单又灵活。直接涂抹在粘接基面上&#xff0c;固化之后即可抵抗外界的压力与冲击。别看它的规格不是很打&#xff0c;却可以顺顺利利完成粘接&#xff0c;形成保护膜。硅橡胶胶水有哪些特点?没有固化之前&#xff0c;是半透明…

Java中return的两种用法

一、return语句总是用在方法中&#xff0c;有两个作用。 一个是返回方法指定类型的值&#xff08;这个值总是确定的&#xff09;。 一个是结束方法的执行&#xff08;仅仅一个return语句&#xff09;。 一般的就百是用在有反回值的方法中&#xff0c;用来返回方度法指定问类…

算法基础:递归算法知识笔记

1、递归算法定义递归算法是将重复问题分解为同类的子问题而解决问题的方法&#xff0c;其核心思想是分治策略。简单来说就是自己调用自己。直到达到退出递归的条件&#xff0c;则完成递归。2、递归的步骤1、找整个递归的终止条件&#xff1a;递归应该在什么时候结束&#xff1f…

ttl继承逻辑门的逻辑功能与参数测试 实验总结_LMS电声测试仪,LMS-V测试系统,精声电声...

LMS-V测试系统LMS扬声器测试仪从推出到现在25年的时间&#xff0c;在全世界被很多扬声器开发与制造厂家广泛应用研发与生产质量控制&#xff0c;传统的LMS扬声器测试仪采用ISA卡的形式提供&#xff0c;所以面临着越来越多的零件过时&#xff0c;所以为了彻底解决这些问题&#…

java中break标记的使用

笔试题目&#xff1a;break目前位于内层的for循环&#xff0c;如何才能让break作用于外层 的for循环。可以标记解决 标记的命名只要符合标识符的命名规则即可。 Test public void test2(){aaa:for(int j 0 ; j<3 ; j){ // j0 外层for循环for(int i 0 ; i< 2 ; i){ //…

电脑基础知识入门:键盘上的英文,意思和功能汇总!

电脑键盘是把文字信息的控制信息输入电脑的通道&#xff0c;从英文打字机的键盘演变而来的。它最早出现在电脑上的时候&#xff0c;还是一种叫做“电传打字机”的部件。那些陌生的键盘按键都有什么用途?很多孩子不知道键盘上功能键和字母数字键以外的键盘按键有什么用&#xf…

elementui el-dialog 离顶部的位置_驻马店建筑物避雷带的安装位置,本月报价

首页 > 新闻中心发布时间&#xff1a;2020-11-06 18:23:42 导读&#xff1a;科杰防雷为您提供驻马店建筑物避雷带的安装位置的相关知识与详情&#xff1a; 该系统在正常运行时&#xff0c;不管三相负荷平衡不平衡&#xff0c;在中性线N带电情况下&#xff0c;PE线不会带电。…

android 弹出框带标题栏,Android开发靠标题栏的弹框

一、效果图title_dialog.png二、思路首先它是一个弹框&#xff0c;只是弹框的布局做些处理&#xff0c;布局占满屏幕&#xff0c;只有需要白色的布局的背景设为白色。其他没设置背景颜色&#xff0c;自然用dialog的style的windowBackground三、案例关键代码dialog的xmlxmlns:ap…

算法基础:图的相关算法知识笔记

一、图的相关算法1、图的分类知识如下图&#xff1a;2、生成树概念对连通图进行遍历&#xff0c;过程中所经过的边和顶点的组合可看做是一棵普通树&#xff0c;通常称为生成树。连通图的生成树具有这样的特征&#xff1a;边的数量 顶点数 - 13、最小生成树在连通网的所有生成树…

java中break和continue的用法例子

break用于switch语句 1. break用于switch语句中&#xff0c;终止switch语句 下面先看 加上break,效果如下 我们可以看到&#xff0c;没有用过break关键字时&#xff0c;不会在判断下一个case的值&#xff0c;直接向后运行&#xff0c;直到遇到break&#xff0c;或者整体swit…

ftp 工具_ftp工具,ftp工具有哪些

对于ftp工具&#xff0c;你了解多少&#xff1f;其实一般人也接触不到这种软件。ftp工具主要是针对从事网站管理的工作人员比较有利的一款工具。可以帮助他们快速的解决工作中的问题。方便、简单、快捷又明了的解决问题。那ftp工具有哪些呢&#xff1f;接下来给大家推荐四款好用…

盘点世界十大软件外包公司排名是哪些公司

排名第一:IBMIBM,总部在纽约的阿蒙克。托马斯沃森19世纪80年代在美国成立,是全球最大的信息技术和商业解决方案公司,在全球拥有超过30万名员工,业务遍及160多个国家和地区。电脑上的制作非常出名,事实上,IBM在软件方面取得了巨大的成就,特别是在一些IBM服务器上使用的软件平台上…