- 中國期貨市場量化交易(R與C++版)
- 李尉
- 2731字
- 2019-12-06 13:58:52
2.1 期貨分筆數據
國內商品期貨有40多種,金融期貨有5種,目前(2017年10月)由于股指期貨受到限制,現在最活躍的大都是商品期貨,特別是黑色系的商品期貨,比如螺紋鋼、鐵礦石等。為統一討論,本書一般以國內成交量最大的螺紋鋼期貨作為例子來研究。
螺紋鋼在上海期貨交易所交易,代碼為rb,2009年上市至今已經超過8年。螺紋鋼價格在1 500~5 000元波動,近期一般在3 000~4 000元,最小買賣價差是1,每手是10噸,因此合約價值大約是3萬~4萬元每手。
這里給出rb1710在交易日為2017年7月21日的數據,如圖2-1所示。

圖2-1 螺紋分筆數據
可以看出,雖然說交易日是7月21日,但它實際上是從7月20日晚上開始。一開始的18:30的價格可以看成是前一天的結算價,然后20:59:00的價格為集合競價的價格,然后21:00:00之后的價格才是真正開始交易的價格。主要的信息包括:
時間——即那筆行情發布的時間,雖精確到500毫秒,但不一定每個500毫秒都有,存在更新信息的時候才會有;
最新——即最新的成交價,如果在非交易時間的這個價格,但它是前一天的結算價;
持倉——當前該合約的市場總持倉量,商品是買賣雙倍計算;
增倉——當前時間新增加的持倉量,商品是買賣雙倍計算;
成交額——當前時間的成交金額,即成交量乘以合約乘數,商品是買賣雙倍計算;
成交量——當前時間的成交合約數量,商品是買賣雙倍計算;
買一價——最高的買價;
賣一價——最低點賣價;
買一量——在買一價上的掛單量;
賣一量——在賣一價上的掛單量;
第一行的很多數字是零,那是因為它發布的是結算價和前一天的成交量,買價賣價等信息不存在,所以都是零。
螺紋鋼有夜盤,因此集合競價發生在夜盤,白天開始的時候是不存在集合競價的,如圖2-2所示。

圖2-2 螺紋鋼白天價格
2.1.1 獲得數據的途徑
很多人想收集歷史行情信息,其實有很多途徑。比如有些人只需要5分鐘數據,或許就可以從第三方的程序化交易平臺上下載。但有幾點需要注意。
(1)信息完整性。第三方平臺的5分鐘數據往往只有高開低收等K線信息,沒有掛單量和買一、賣一等微觀結構的信息,而這些信息對精準回測而言比較重要。
(2)構造復雜因子。如果有微觀信息,可以利用5分鐘內的這些信息構造出更復雜的因子,雖然這些因子仍然是5分鐘頻率,但由于用到了更微觀的信息,所以構建出來的因子會比單純的5分鐘高開低收更有效一些。
(3)換月數據。公開平臺的連續合約在換月時沒有新合約的歷史數據,因此在計算因子的時候很不方便。比如最簡單的20均線,新合約只能在出現20根K線之后才能準確算出,前面的均線多少都要用到舊合約的信息。但如果是自己構造的K線,則不會有這個問題。或許很多人認為這只是一個小部分,但很多時候機器學習模型就是由一個個模塊疊加而成,如果每一個模塊都引入一些誤差,那么這些誤差是逐漸疊加的,而不是誤差越多越能互相抵消的,導致最終的結果跟設想的很不一樣。
因此,最好從最基本的分筆數據開始,自己合成每個合約的5分鐘K線,計算相應的因子,這樣就不會有跨合約計算同一個因子的問題,在源頭上減少誤差。
獲得分筆數據的幾個途徑有以下幾種。
(1)自己用CTP下載。這個當然是免費的,而且最及時,可以得到一手的數據,也可以對比不同行情服務器地址的數據之間的差異,以本人經驗來看,上海和大連的不同地方得到的數據基本一致,但鄭州的數據不大一致,有細微的差別。
(2)萬德資訊。這是國內最常用的金融信息軟件,里面有商品的高頻數據,而且支持R、Matlab、Python等接口,比較方便,但是需要收費,并且高頻數據有流量的限制。
(3)國泰安。這是國內比較龐大的一個數據提供商,費用也比較高,數據需要落地,因此需要本地的服務器接收,一般通過sql導出。
(4)淘寶。本人購買的是淘寶大富翁提供的數據,盤后是100元/月,歷史數據是60元/月,如果是5檔行情會貴一些,180元/月。
如果是小私募或者個人,建議在自己下載數據的同時也購買淘寶數據作為對照,且經濟實惠。
有了數據獲得的途徑,就可以寫一個程序,每天定時下載,自動處理,這樣可以節約人力資源。其實現在很多新的發明主要作用就是節約人力資源,據說著名的高盛公司原來主要依靠銀行家和銷售人員,做的都是看起來比較高端的工作,觥籌交錯間暢談世界經濟金融局勢,但現在招聘了越來越多的程序員,越來越像一家科技公司。摩根士丹利也一樣,原來交易大廳有600人,現在只有兩個人。后面會講到如何盤后自動獲取數據。
2.1.2 數據儲存
數據下載到計算機后,如何存儲數據也是一個問題。如果存儲成csv格式,每次讀取的速度是個大問題,我們可以來測試一下各種情況下數據讀取的速度。
首先是用最簡單的read.csv命令:

可見需要43.71秒,一共161個文件。但如果我們使用速度更快的fread命令,則有:

速度變成5.36秒,只有原來的12.26%,提高了許多,而且結果是一致的:

可以看出結果是一致的。
當然,csv文件還只是文本的格式,如果保存成R語言自己的二進制格式,理論上說讀取速度還可以更快。為此,我們首先把csv文件存成二進制的RData文件:

然后就可以直接調用這些二進制文件了:

可見調用二進制文件可以比fread還要更快一些。但如果保存成RData格式,其實多占用了一份空間,因為csv文件方便人工查看,因此直接使用fread可以節省保存數據的空間。當然,如果只是希望在R語言里面使用數據,只保留RData文件也是可以的,也不會因為不小心失誤修改了數據而導致意外發生。因此,實際工作中可以將RData和csv文件各保存一份,平時調用RData文件,需要增減數據也容易,如果不小心篡改了,再從csv文件中重新讀取即可。
2.1.3 盤后自動獲取
雖然說交易過程中也可以輸出收到的分筆數據,但難免發生意外,專業的事情可以交給專業的機構做,費用也并不高。比如可以使用淘寶大富翁上的數據服務,每天盤后商品一檔數據是100元/月。如果自己本身是有一定規模的私募,IT團隊比較厲害,也可以自己做。但是事實上,現在程序員工資也挺高,如果僅僅做這種期貨量化,確實不太需要專門的程序員。更何況很多程序員都是C++和Java厲害,對R語言也不大懂。
例如,每天下載數據的程序可以這么寫:

關鍵點如下。比如我們需要下載的是某個日期之后的數據,畢竟一般是每天更新,上一交易日的日期保存在commodity.latest.date中:

由于國內是三個交易所,每次下載其中一個交易所的數據即可,比如下載上期所的數據,上期所sc是第二個交易所,可以用:

另外,數據格式可能是壓縮的rar,需要運用unrar命令解壓,在R語言里面可以直接運行windows命令行的命令,比如把命令寫成字符串,然后用system()調用,這是以下部分:

這樣就可以每天自動把數據下載到計算機了。如果使用萬德等第三方平臺,他們會整合其他很多功能,整體收費會比較高,因此只需要行情數據的話沒必要使用太復雜的集成化信息系統。但如果需要其他基本面信息,或許那些平臺更好一些。
下載完數據,接下來就可以用來分析日內策略或高頻策略,如果想研究中低頻的策略,可以使用5分鐘K線,后面會有介紹。