转自:http://www.cnblogs.com/dxf813/p/7845398.html

基于zipline的分钟回测改写,其中数据源为自定义,使用bcolz的ctable,该数据格式与pandas的DataFrame很好兼容,并且bcolz文件压缩率很好。
以下主要记录此次改写回测整个过程中涉及类和方法,没有附带代码。

一,自定义分钟回测数据源BcolzBacktestMinData类
  def zk_get_min_data 取获得多只股票某个时间点前的N个指定字段的值
  def zk_get_value 获得股票的指定时间的某个字段的值
  def zk_get_traded_dt 获得离传入时间最近的交易时间点
  def zk_get_row_data 获得某只股票某个时间的k线数据
  def zk_get_all_data 回测初始时将所用数据全部缓存提供给以上函查询

以下为原有zipline代码改写部分:

一、TradingAlgorithm(回测主类)
  类中的函数改写:
  导入方法:from zipline.algorithm import TradingAlgorithm
  
  1、def order 下单函数
  2、def _create_clock 返回此次回测所有的时间点
  3、def _create_generator 产生每个时间点回测结果
  4、data_portal 属性实例化后重新赋值
  5、def _create_benchmark_source 获得基准收益
  6、def __convert_order_params_for_blotter 判断下单参数是否合理
  7、def _calculate_order_value_amount 计算下单的数量
  8、def _can_order_asset 判断该股票是否可交易

以下为上述5个加粗的函数或属性的重写内容(剩余3个变动较少):

一、order 此函数主要改写内容

  last_price 针对非限价单下单,使用当前价格成交通过zk_get_value获得
  更改下单数量:中国股市买入有基本单位1手=100股

二、_create_clock 函数返回一个MinuteSimulationClock对象

  导入路径:from zipline.gens.sim_engine import MinuteSimulationClock

  改写MinuteSimulationClock内容:
    def __init__ 去除分钟时间点的计算
    def __iter__ 返回已去除掉股市中午休息时间的各分钟时间点

 

三、_create_generator函数返回一个AlgorithmSimulator对象(self.trading_client)的transform()

  导入路径:from zipline.gens.tradesimulation import AlgorithmSimulator

  改写AlgorithmSimulator内容:
    def _create_bar_data:返回BarData对象 既回测代码中的data对象
      继续重写BarData类
      导入路径:from zipline.protocol import BarData
      内容:
        def __init__ 不变
        def current 截取zk_get_all_data的返回结果
        def history 调用data_portal的get_history_window函数
        def _get_current_minute 获得回测时当前的时间点
        def __getitem__ 调用zk_get_row_data执行返回的结果
        def __get__ 不变
        def current_dt 不变

四、data_portal属性为一个DataPortal对象

  导入路径:from zipline.data.data_portal import DataPortal

  改写DataPortal内容:
    def get_history_window data.history 调用的函数
    def get_backtest_date 自定义函数:将回测的结束日期传入,为了取出该回测所需要的所有数据并缓存
    equity_minute_reader 实例化时传入的BcolzMinuteBarReader对象

      导入路径:from zipline.data.minute_bars import BcolzMinuteBarReader

      继续重写BcolzMinuteBarReader类(该类主要功能为读取分钟k线数据)内容:
        def get_value 调用zk_get_value      
        def_get_metadata 此函数原方法为通过指定的bcloz文件路径来读取数据,我已用自定义的数据源取代,所以此处不再做处理
        def get_last_traded_dt 调用zk_get_traded_dt

五、_create_benchmark_source函数返回一个BenchmarkSource对象

  导入路径:from zipline.sources.benchmark_source import BenchmarkSource

  改写BenchmarkSource内容:
    def __init__ 改写分钟收益的数据序列
    由于我只拿到每天的收益率,而此处zipline默认会让每天收益的数据填充到每分钟上转为分钟的收益序列,这意味着每分钟都会有该天的盈利或亏损(根据后续zipline计算收益的算法)
    这就导致了复利。根据界面显示需要我们也只需要计算出每天的收益即可,没有计算每分钟的收益,因此我将每天的收益率只填充到开始的第一个时间点,后续的全部填充0

量化框架zipline--分钟回测改写的更多相关文章

  1. 量化投资策略:常见的几种Python回测框架(库)

    量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量 ...

  2. OnePy--构建属于自己的量化回测框架

    本文主要记录我构建量化回测系统的学习历程. 被遗弃的项目:Chandlercjy/OnePy_Old 新更新中的项目:Chandlercjy/OnePy 目录 1. 那究竟应该学习哪种编程语言比较好呢 ...

  3. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...

  4. 量化投资学习笔记01——初识Pyalgotrade量化交易回测框架

    年初学习量化投资,一开始想自己从头写,还是受了C/C++的影响.结果困在了计算回测数据那里,结果老也不对,就暂时放下了.最近试了一下python的各个量化投资框架,发现一个能用的——pyalgotra ...

  5. FMZ发明者量化平台回测机制说明

    原文连接:https://www.fmz.com/digest-topic/4009 大部分策略在实盘之前都需要回测进行验证,FMZ支持部分品种数字货币现货.期货和永续合约,以及商品期货所有品种.但发 ...

  6. 量化投资:第8节 A股市场的回测

    作者: 阿布 阿布量化版权所有 未经允许 禁止转载 abu量化系统github地址(欢迎+star) 本节ipython notebook 之前的小节回测示例都是使用美股,本节示例A股市场的回测. 买 ...

  7. 量化交易回测系统---RQalpha、qstrade学习笔记

    一.RQalpha github 地址  https://github.com/ricequant/rqalpha 1.运行test.py文件,显示 No module named 'logbook. ...

  8. 回测框架pybacktest简介(一)

    pybacktest 教程 本教程让你快速了解 pybacktest's 的功能.为此,我们回测精典交易策略移动平均线MA交叉. MA快线上穿慢线时,买进做多 MA快线下穿慢线时,卖出做空 进场规则, ...

  9. 回测框架pybacktest简介(二)

    pybacktest 的疑点 第(一)节“教程”原文,是用 ipython notebook 写成,程序代码是一些片段组成. 为了阅读方便,合并在一起. 本文转载于:http://blog.csdn. ...

随机推荐

  1. jquery ajax 返回的json对象 新增属性值(干货)

    $.ajax({ type:"GEt'; url:"你的地址", data:{"你的字段","字段值"} success:funt ...

  2. ssh 提示Connection closed by * 的解决方案

    使用ssh方式连接linux系统时,发现一直上报这个错误: Connection closed by 192.168.3.71 port 22 刚开始还以为是端口被防火墙禁止了呢,通过关闭和查看,并没 ...

  3. nodejs文件操作模块FS(File System)常用函数简明总结(转)

    件系统操作相关的函数挺多的.首先可以分为两大类. 一类是异步+回调的. 一类是同步的. 在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可 1. 首先是一类最常规的读写函数,函数名称 ...

  4. [Tarjan 学习笔记](无向图)

    今天考试因为不会敲 Dcc 的板子导致没有AK(还不是你太菜了),所以特地写一篇博客记录 Tarjan 的各种算法 无向图的割点与桥 (各种定义跳过) 割边判定法则 无向边 (x,y) 是桥,当且仅当 ...

  5. 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;

    package com.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.htt ...

  6. Java多线程:CopyOnWrite容器

    一.什么是CopyOnWrite容器 CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然 ...

  7. curl的使用基本流程,HTTP的get请求,post请求

    使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤: 1.初始化连接句柄: 2.设置CURL选项: 3.执行并获取结果: 4.释放VURL连接句柄. 下面的程序片段是使用CURL发送 ...

  8. Wannafly交流赛1(施工中)

    A.有理数 签到题:直接用floor函数就行了,详细看代码 #define debug #include<stdio.h> #include<math.h> #include& ...

  9. 关于Netty的入门使用

    Netty介绍: Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比 ...

  10. 系统右键添加cmd命令

    我们运行cmd.exe时,会发现刚刚打开时,一般提示在默认路径下: 有时候我们希望直接能够切换到某个路径下运行程序或者做某些工作,那么切换路径可能就会比较麻烦.下面我们介绍一种比较实用的方法,用鼠标右 ...