现在就开始干活了。先要测试一下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绑定。

⑤执行回测。

⑥输出回测结果,绘图。

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

Pyalgotrade量化交易回测框架相关推荐

  1. python量化回测框架_股票量化交易回测框架pyalgotrade源码阅读(一)

    PyAlgoTrade是什么呢? 一个股票量化交易的策略回测框架. 而作者的说明如下. To make it easy to backtest stock trading strategies. 简单 ...

  2. 6款优秀的量化交易回测框架!VNPY位居第一

    一个策略从想法,到测试,在到实盘,然后改进,进入另一个循环,需要很多的时间和精力.这时候选择一款高效.灵活的测试系统就是当务之急了.即使最后你可能需要写自己的系统,但是这些框架的软工架构还是很值得借鉴 ...

  3. python外汇交易回测系统_StarQuant - 综合量化交易回测系统/平台

    Welcome to StarQuant StarQuant(中文名:易数交易系统)是一个轻量的.面向个人( 普通)用户的综合量化交易回测系统,目前主要用于期货期权程序化交易(CTP接口,在实盘测试中 ...

  4. 量化交易-回测调参-神龙摆尾

    系列文章目录 第一章 神龙摆尾 文章目录 目录 系列文章目录 文章目录 前言 一.所涉结构模型简介 二.策略实现 1.策略源代码 2.初步参数调优-选股参数 3.进一步参数调优-卖出参数 总结 前言 ...

  5. 基于强化学习的期权量化交易回测系统1

    概述 量化交易平台很重要的一个环节就是回测系统,可以通过对历史行情的回放,验证量化交易策略的性能表现.量化交易强化学习环境,则是向Agent提供一个交互的环境,Agent(即量化策略)根据市场环境(强 ...

  6. 【思考14】量化交易回测中,关于涨跌停的处理方式

    这篇文章免费,可以在知乎看到 有好多人在量化交易的回测过程中,对股票.期货之类的涨跌停比较在意,害怕涨跌停了之后交易不了,本文就尝试梳理下我对涨跌停的看法以及我在回测中的应对方式. 在开始本文对涨跌停 ...

  7. 基于强化学习的期权量化交易回测系统5

    我们现在已经可以在主循环中获取行情数据,并且传给了Agent类.接下来Agent类会调用策略类,由于决定采取的行动.在策略类做决策时,需要参考用户仓位Position信息,还有就是权利金.保证金.手续 ...

  8. python股票回测_Python量化交易-回测简单的交易策略

    这篇文章主要介绍如何使用Python对一些简单的交易策略进行回测,对这块比较感兴趣的朋友可以看一看. 1.获取证券数据 本文以A股市场为例,先获取A股近10年的数据并保存到数据库. 1.1.安装数据库 ...

  9. 5、Python量化交易-回测收益计算

    目录 前言 一.回测的主方法 二.回测实现 1 - 获取回测数据ticks 2 - 运行回测 3 - 为回测数据添加生成方法 4 - sell中添加订单的pnl收益计算 5 - 策略执行中调整买卖ma ...

最新文章

  1. mask属性是css3的吗_CSS mask-image属性详细介绍(小结)
  2. 基于tensorflow框架的神经网络结构处理mnist数据集
  3. step2 . day5 C语言中的结构体和枚举
  4. 解决413 Request Entity Too Large
  5. Hibernate框架(1)
  6. 程序员自救指南:一不小心删库删表怎么办?
  7. c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法
  8. 代码主题darcula_Pycharm最舒服的主题风格
  9. 映射文件实现进程通信
  10. springboot优雅的加载海康sdk
  11. 树莓派安装开源智能家居系统 Domoticz
  12. 斐波那契数列(入门c语言)
  13. 各种音视频编解码标准
  14. MetaTrader 4 电脑版安装指南
  15. 流域水库水闸和泵站无人值守系统
  16. CC2530模块进行ZigBee实验小结
  17. CentOS下删除和安装JDK
  18. 国网云(华为组件)使用
  19. 2017年总结(补全)
  20. 黑名单挂断电话及删除电话记录

热门文章

  1. 6、EIGRP配置实验之负载均衡
  2. WorkerMan 入门学习之(二)基础教程-Connection类的使用
  3. Analytics API and Customer Data Platform | Segment
  4. iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例
  5. linux ssh-add,linux – 如何使ssh-add从文件读取密码?
  6. 拉取远程分支_git clone切换分支步骤,代理设置,作者信息设置
  7. python中装饰器修复技术_python3之装饰器修复技术@wraps
  8. [转载] Java对返回值的封装
  9. [转载] Java Formatter toString()方法与示例
  10. scala中循环守卫_Scala中的循环