量化框架zipline--分鍾回測改寫


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








    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM