前面已經可以簡單的跑起來了,只不過是日線級的股票,我們最終目標是5分鍾級的期貨
由於平台不支持5分鍾數據,因此這些數據需要我們手動解決,分兩塊,一塊是歷史數據的獲取,一塊是實時數據的采集。先搞定歷史數據。
目前看通達信的數據還算是比較靠譜的。股指期貨主要有IF,IC,IH三個,以IF為例,由於通常我們要的數據比較多一點,通常是1年以上而非1個月,因此用主連IFL8
一、獲取數據:
點擊下載即可,
然后利用通達信的導出功能:
然后打開數據看一下:
考慮到后期各種處理,因此最好還是將這些數據存於數據庫中,存好后形如:
二、轉換數據
順便說一下,通達信上的數據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'])
line_map數據:
這樣就清楚了,IFL8存了808天數據,每天數據存了48條(1天交易時間4小時即240分鍾,我們存的為5分鍾數據,即240/5=48),一共存了808*48=38784條數據
下面是futures_5mb存儲表示:







