利用rqalpha完成一個股指期貨的回測(二) 分鍾數據獲取和轉換


前面已經可以簡單的跑起來了,只不過是日線級的股票,我們最終目標是5分鍾級的期貨

由於平台不支持5分鍾數據,因此這些數據需要我們手動解決,分兩塊,一塊是歷史數據的獲取,一塊是實時數據的采集。先搞定歷史數據。

目前看通達信的數據還算是比較靠譜的。股指期貨主要有IF,IC,IH三個,以IF為例,由於通常我們要的數據比較多一點,通常是1年以上而非1個月,因此用主連IFL8

一、獲取數據:

image

 
點擊下載即可,
然后利用通達信的導出功能:
image
 
 然后打開數據看一下:
image

 

考慮到后期各種處理,因此最好還是將這些數據存於數據庫中,存好后形如:

image

 

二、轉換數據

順便說一下,通達信上的數據IFL8是完全按照各主力合約拼接而成,通過下載期貨合約的實時行情數據進行合並成5分鍾數據,然后與主力合約K線的開高低收量及持倉進行對比,基本上沒有什么誤差。

當然,之前的歷史數據從通達信上獲取,后面的數據以及動態生成的歷史有能力的還是從實時行情生成為好。畢竟股指期貨一個點就是200或300塊,隨便搞一手就是幾萬的盈虧,數據還是用自己的安心點。

由於rqalpha沒有提供分鍾級數據,因此我們要將獲取的數據轉成rqalpha識別的數據ndarray

先看ndarray的數據類型:

dtype = np.dtype([('date', '<u4'), ('time', '<u4'), ('open', '<u4'),
                          ('close', '<u4'), ('high', '<u4'), ('low', '<u4'),
                          ('limit_up', '<u4'), ('limit_down', '<u4'), ('basis_spread', '<i4'),
                          ('open_interest', '<u4'), ('volume', '<u4'), ('total_turnover', '<u8'),
                          ('trade_date', '<u4')])

 

這里需要注意的是,open,high,low,close這四個值在rqalpha都是擴大了10000倍的,因此,這兒轉換時需要先乘上10000

然后將之存於一個list中

values.append((ft.date, ft.time, ft.open, ft.close, ft.high, ft.low,
                                   0, 0, 0, 0, ft.volume, 0, ft.date))

最后將之轉成ndarray類型數據:

result = np.array(values, dtype=dtype)

 

rqalpha的數據存成bcolz格式,我們依照着存,由於是5分鍾,我們取名為:

futures_5mb.bcolz和futures_5mb_index.bcolz

其中5mb.bcolz存儲的為真正的數據,index.bcolz為按天存儲的數據索引。

存儲時按每支票存成一個result,然后通過代碼 arr = DataFrame(result, columns=fields) 將之轉換成DataFrame存成bcolz格式數據。

接着存儲索引futures_5mb_index.bcolz, 這個數據中存兩個量,line_map表示每支票存了多少天的數據, mb_index_list表示存的各支票每一天的數據是從哪兒存到哪兒。

這兒有一個函數比較重要:calc_mb_indexs,計算每一天的數據具體存在表的哪些區域:

def calc_mb_indexs(cls, date_dict, mb_index_list, base_index):
        s, e = base_index, base_index
        for date in date_dict.keys():
            e += date_dict[date]
            mb_index_list.append([date, s, e])
            s = e
        return e

如果存的是第0個品種數據,base_index為0,否則把前面的base_index計算出來作為當前品種的初始值,比如后面列舉的IF88的初始值為:808*48=38784,IF2005的初始值為1616*48=77568

舉例如下:

mb_index_list轉成DateFrame圖:

index_df = pd.DataFrame(data=mb_index_list, columns=['date', 'start_at', 'end_at'])

image

line_map數據:

image

這樣就清楚了,IFL8存了808天數據,每天數據存了48條(1天交易時間4小時即240分鍾,我們存的為5分鍾數據,即240/5=48),一共存了808*48=38784條數據

下面是futures_5mb存儲表示:

image

image


免責聲明!

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



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