zoukankan      html  css  js  c++  java
  • 量化框架zipline--分钟回测改写

    转自: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

  • 相关阅读:
    caffe_实战之两个简单的例子(物体分类和人脸检测)
    《Caffe下跑AlxNet之数据处理过程》
    git使用小结
    说好的博客
    C++入门学习
    第一篇 一步一步看透C++
    第一百六十三节,jQuery,基础核心
    第一百六十二节,jQuery入门介绍
    第一百六十一节,封装库--JavaScript,完整封装库文件
    第一百六十节,封装库--JavaScript,ajax注册表单到数据库
  • 原文地址:https://www.cnblogs.com/wuyongqiang/p/7902760.html
Copyright © 2011-2022 走看看