1. 程式人生 > >量化框架zipline--分鐘回測改寫

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

blog -- sim 第一個 數據 test elf 返回結果 line

轉自: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--分鐘回測改寫