Pyalgotrade量化交易回测框架

现在就开始干活了。先要测试一下pyalgotrade回测数据对不对。我找了个参照标准:在聚宽上开通了个账号,按入门教程写了个策略:2016-2018年每个交易日买入100股平安银行(000001),回测结果如下:

现在用pyalgotrade来实现一下这个策略。先用tushare下载平安银行及沪深300指数的2016年数据。

首先从csv文件建立数据源。

from pyalgotrade_tushare import tools, barfeedinstruments = ["000001"]
feeds = tools.build_feed(instruments, 2016, 2018, "histdata")

如果没有下载过数据,会自动下载以后存到histdata目录里,如果下载过,就自动使用目录里的数据了。feeds是BarFeed类型,就是其中的数据驱动pyalgotrade回测框架运行。

接着就从Pyalgotrade.strategy.BacktestingStrategy继承自己的策略类。

class MyStrategy(strategy.BacktestingStrategy):def __init__(self, feed, instrument, brk):super().__init__(feed, brk)self.__position = Noneself.__instrument = instrumentself.getBroker()self.__cost = 0.0def onEnterOk(self, position):execInfo = position.getEntryOrder().getExecutionInfo()# self.info("买入 %.2f" % (execInfo.getPrice()))def onEnterCanceled(self, position):self.__position = Nonedef onExitOk(self, position):execInfo = position.getExitOrder().getExecutionInfo()self.info("卖出 %.2f" % (execInfo.getPrice()))self.__position = Nonedef onExitCanceled(self, position):# If the exit was canceled, re-submit it.self.__position.exitMarket()def onBars(self, bars):brk = self.getBroker()shares = 100price = bars[self.__instrument].getPrice()if brk.getCash() < price*shares:self.info("现金不足")returnself.__position = self.enterLong(self.__instrument, shares, True)self.__cost += brk.getCommission().calculate(brk, price, shares)self.info("可用现金%.2f 股价%.2f 持股数量%d 市值1:%.2f 市值2:%.2f 计算市值:%.2f 交易成本%.2f" % (brk.getCash(), price, brk.getShares(self.__instrument), brk.getEquity(), self.getResult(), (brk.getCash() + brk.getShares(self.__instrument)*price), self.__cost))# x = input("按任意键继续")

其中onBar是必须重写的,即每次数据更新要执行的操作。

然后设置手续费,滑点等设置。

# 设置手续费
broker_commision = broker.backtesting.TradePercentage(0.0003)
brk = broker.backtesting.Broker(cash, feeds, broker_commision)

Broker对象是进行交易的类。

然后生成策略对象:

myStrategy = MyStrategy(feeds,     instruments[0], brk)

接下来生成用于计算回测指标的四个对象,并将其添加进入策略中:

    retAnalyzer = returns.Returns()myStrategy.attachAnalyzer(retAnalyzer)sharpeAnalyzer = sharpe.SharpeRatio()myStrategy.attachAnalyzer(sharpeAnalyzer)drawDownAnalyzer = drawdown.DrawDown()myStrategy.attachAnalyzer(drawDownAnalyzer)tradesAnalyzer = trades.Trades()myStrategy.attachAnalyzer(tradesAnalyzer)

如果要作图,类似的,也要将绘图对象添加进入策略对象。

from pyalgotrade import plotterplter = plotter.StrategyPlotter(myStrategy)
plter.getOrCreateSubplot("return").addDataSeries("retuens", retAnalyzer.getReturns())
plter.getOrCreateSubplot("CumReturn").addDataSeries("CumReturn", retAnalyzer.getCumulativeReturns())

准备工作做完,就可以执行回测了,用

myStrategy.run()

执行以后就可以输出回测结果,输出图形了。限于篇幅,就不放代码了。详细代码见:

https://github.com/zwdnet/MyQuant/blob/master/01/testdata.py

现在来看看回测结果。

其中年化收益率那里应该是三年的策略收益,这样看两个的回测结果是基本一致的,但并不完全一致。原因呢?

我看了一下每个交易日的情况:

聚宽上面的:

我本地文件里的数据

 

在本地输出每个交易日的情况:

可以看到2016-01-05,聚宽的股价数据是8.99,tushare下载的数据是9.07。2016-01-06,聚宽的数据是9.10,tushare是9.179。

我在聚宽的论坛里发帖问了,被告知可能是数据复权方法,滑点设置等差异引起的。另外,pyalgotrade貌似是第一天产生交易信号第二天再执行交易。好在差别也不大,就这样吧。还有一些问题,比如pyalgotrade里貌似没有没有直接计算alpha值,beta值,信息比率等数据的函数,用到了再说吧。

最后再总结一下用pyalgotrade进行量化交易回测的一般步骤:

①用数据生成BarFeed对象,作为驱动框架的数据来源。

②用Broker对象设置交易成本,滑点等。

③从strategy.BacktestingStrategy建立Strategy对象,并重写onBars成员函数,其内容为每次交易事件时都要执行的动作。其中可能会用到technical对象,用于计算一些技术指标。

④实例化strategy对象,建立回测指标对象和绘图对象,并将它们与strategy绑定。

⑤执行回测。

⑥输出回测结果,绘图。

下一步,该真正进行量化交易策略的学习研究了。

 

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

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

相关文章

1.4三态缓存(tristate buffer)与 多路复用器(Multiplexers)

首先解释名词。由于想了好多例子&#xff0c;结果发现没有太好的。于是换一种办法&#xff0c;直接上图和真值表。。这个东西就是多路复用器&#xff08;MUX&#xff09;从图中和真值表可以总结出&#xff1a;当s为0选择D0通过&#xff0c;也就是YD0&#xff0c;而不在乎D1上的…

art-template用户注册方法

应用场景nodejs Express框架&#xff0c;使用art-template模板引擎。 后台注册方法代码&#xff1a; var template require(art-template);template.helper(myRegFunc, function (str1, str2) {return "我是后台方法: " str1 str2;}); 前台使用&#xff1a; <…

如何导出已安装的安卓app为apk包

下载 “夜神模拟器” &#xff0c; 鼠标长安应用&#xff0c;拖拽到 “apk导出”处 即可

easyui-datagrid行数据field原样输出html标签

easyui-datagrid 绑定的行 field 原样输出html标签。处理效果如图&#xff1a; Html页面代码如下&#xff1a; ...<tr><th field"id" width"5" align"center">编号</th><th field"name" width"20" ali…

Python爬虫淘宝商品详情页价格、类似数据

在讲爬取淘宝详情页数据之前&#xff0c;先来介绍一款 Chrome 插件&#xff1a;Toggle JavaScript (它可以选择让网页是否显示 js 动态加载的内容)&#xff0c;如下图所示&#xff1a; 当这个插件处于关闭状态时&#xff0c;待爬取的页面显示的数据如下: 当这个插件处于打开状态…

微信公众号开发(—)接口与服务器关联

微信公众号开发(—) 以下都是借鉴的微信公众平台的文档加老师指点和自行的理解。 1.一台有微信的手机.(别问我老人机可以不 有微信就可以&#xff01;&#xff01;&#xff01;) 2.需要有一个微信公众平台的测试号&#xff08;订阅号,服务号也可以按自己需求来&#xff09;. 3.…

nodejs支持ssi实现include shtml页面

express 对于include的代码默认不处理&#xff0c;直接输出&#xff0c;没办法执行include的内容&#xff0c;但可以通过Nginx实现。 1、 配置nginx设置开启ssi模式。 server {…ssi on;ssi_silent_errors on;ssi_types text/shtml;… 2、添加include页面 <!--# include vi…

Windows PC软件反编译逆向破解

文章目录 一.OllyDbg工具简介二.OllyDbg分析Crakeme示例1三.OllyDbg分析Crakeme示例2四.总结作者的github资源&#xff1a; 系统安全&#xff1a;https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis网络安全&#xff1a;https://github.com/eastmountyxz/Networ…

微信公众号天气与聊天机器人小功能

微信公众号小功能 以下都是借鉴的微信公众平台的文档加老师指点和自行的理解。 &#xff08;1&#xff09;微信公众号发送地区回复现在和未来五天天气情况 &#xff08;2&#xff09;发送语音和智能机器人聊天 一、调用天气预报接口 实现微信公众号发送地区回复现在和未来五天…

安卓app逆向破解脱壳教程

From&#xff1a;Hook 神器家族的 Frida 工具使用详解&#xff1a;https://blog.csdn.net/FlyPigYe/article/details/90258758 详解 Hook 框架 frida ( 信抢红包 )&#xff1a;https://www.freebuf.com/company-information/180480.html APP逆向神器之Frida【Android初级篇】…

关注微信公众号使其自动发送欢迎你关注消息

关注微信公众号使其自动发送欢迎你关注消息 一般我们关注微信公众号时。他都会自动推送一条消息。欢迎您关注了某公众号。而今天我们所做的就是这个功能。 关注公众号时我们需要获取到用户的一些个人基本信息。 而获取基本信息就要看他的运行原理。到底是怎么运行。 当我们申请…

微信公众号——永久素材的上传

微信公众号永久素材的上传 思路&#xff1a;1.需要上传到本地&#xff08;因为后面需要用的本地的绝对路径 2.上传到微信服务器 3.添加信息到本地数据库 一、上传图片到本地 文件上传的方法 以下是我的代码 首先更改文件上传的配置 而后写我们的文件上传方法 if (request…

安卓逆向之基于Xposed-ZjDroid脱壳 逆向分析(脱壳)

安卓逆向——某力播逆向分析(脱壳) 一、环境 这一步真的头疼&#xff0c;环境很重要&#xff0c;各种测试&#xff0c;一下是我测试的环境&#xff0c;由于没有真机&#xff0c;就拿虚拟机做测试 1. Xposed 2. FDex2 3. fiddler 4. 软件 二、抓包 通过 …

安卓逆向代码反混淆 Simplify工具 JEB2反混淆神器

【技术分享】Android程序反混淆利器——Simplify工具 https://www.anquanke.com/post/id/85388 发布时间&#xff1a;2017-01-23 17:21:23 问题背景 Android程序代码混淆是Android开发者经常用来防止app被反编译之后迅速被分析的常见手法。在没有混淆的代码中&#xff0c;被…

Vmware虚拟机的安装和使用

安装虚拟机 一、安装虚拟机Vmware Workstation 下一步 下一步 如果C盘剩余空间大&#xff08;大于50G&#xff09;&#xff0c;可安装在C盘 二、在虚拟机中安装Linux系统&#xff1a; 准备工作&#xff1a; Linux系统镜像文件&#xff08;ISO文件&#xff09; 1 、新建虚拟机…

【项目经验】如何用TexturePacker Physicseditor开发游戏

首先感谢Andreas的license。先广告一下Andreas。 -----------------------------------------------------------------------------------------http://www.codeandweb.com/texturepacker - The sprite sheet creator turns chaos into orderhttp://www.codeandweb.com/physic…

smbd的安装与使用

文件共享服务软件 samba 安装与配置 安装了samba服务的主机&#xff0c;可以将文件共享给其它用户&#xff0c;其它用户可以对文件进行读写操作。 安装 以Ubuntu Linux为例 1、 安装 2、 检查是否安装成功 启动 samba服务&#xff1a; 查看samba服务状态&#xff1a; 3、 添…

Laravel-admin 分类避免踩坑

一、模型层引入 use Encore\Admin\Traits\AdminBuilder; use Encore\Admin\Traits\ModelTree; 在方法中使用 use ModelTree,AdminBuilder; 最终代码为 <?phpnamespace App\Model;use Illuminate\Database\Eloquent\Model; use Encore\Admin\Traits\AdminBuilder; use Enco…

python使用python-barcode生成任意长度字符串的条形码(一维码)详细教程

使用python-barcode生成一维码 1.安装python包 pip install Pillow pip install python-barcode2.实例程序 # -*- coding: utf-8 -*-import barcode import random from barcode.writer import ImageWriter import os from PIL import Image#生成一维码的类型的种类 "&…

Objective-C学习笔记(一)–类

1、类的定义与实现1.1说明所有的类都是继承NSObject。类的接口与实现是分开的&#xff0c;一般类的定义是放在.h文件【包含类的名称、成员变量、方法、属性、继承关系 、遵从的协议】&#xff1b;实现部分是放在.m文件中【包含每个属性和方法的具体实现以及协议的方法实现】语法…