基於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