- 中國期貨市場量化交易(R與C++版)
- 李尉
- 1798字
- 2019-12-06 13:58:53
2.3 異常處理
做機器學習或數據挖掘的人都知道,數據集往往有很多缺失、錯誤的地方,需要先人工進行處理。比如期貨數據會有很多非交易時間段的數據需要專門處理,例如:

第一行的數據買一價、賣一價、買一量、賣一量都是零,而且交易時間是19:12:02.500,這是非交易時段,這個數據理應去掉。事實上,我們之前的數據處理程序已經考慮了這點:

從第一個bid價和賣價至少一個不為零的數據開始,有時候行情出現漲跌停板,比如漲停板時ask是零,因此,只有當兩個都是零的時候才是異常的。
2.3.1 夜盤數據
現在不少期貨品種開通了夜盤,一般是從晚上9點開始,但結束時間各不一樣。如果機械記錄每個品種的夜盤結束時間,其實也不大好,因為這個時間不是一成不變的,而是會隨著一些新的規定一直改變。比如螺紋鋼一開始夜盤交易到凌晨1點,現在交易到晚上11點。因此,我們需要一個更靈活的方式來處理夜盤數據。為此,我把夜盤分成以下幾段:

最早結束夜盤的品種是23:00:00,但很多時候會有23:00:00.500這筆行情,因此,用data$time<“23:00:01”可以把這筆行情包含進來,其他時間也類似處理。
2.3.2 漲跌停處理
在漲停板,賣價是空值,一般行情軟件用零代替,而在跌停板,買價是空值,也是用零代替。今后處理一些因子和因變量的時候要特別注意,因為這個時候的交易實際上并沒有產生價格變化,而此時計算的預測指標,由于買量很大,一般都會預示有很強的上漲動能,因此會出現預測值與技術指標值的相關性極不正常的情況,這些就是異常值,在訓練模型擬合系數的時候需要剔除。這里原始數據并沒有做特別處理,這點留到以后再詳細說明。當然,如果某些品種漲跌停板的比例很低,不會對模型參數擬合產生太大影響,也可以不用考慮。
事實上,漲跌停板數據占總數據量并不多,以螺紋鋼為例:

由此可見,正常的無漲跌行情占99.6%,因此漲跌停行情對數據影響不會很大。可能很多人會擔心漲跌停板時期價格基本處于停滯狀態,但技術指標的取值往往卻比較極端,這時候如果價格變化與技術指標取值很不一致,會影響擬合的效果。但因為這部分行情占比很小,所以對實際參數估計的影響并不大。
2.3.3 為什么保留買賣盤口
之前章節也提到過,雖然用最新價也可以較準確的回測策略,但這里我們還是保留了買賣盤口,哪怕是用5分鐘K線做中低頻的策略,原因有以下幾點。
(1)很多品種買賣價差相對于價格來說很大,比如螺紋鋼,價格一般在1800~3600元,買賣價差是1,即買賣價差是盤口的0.28%~0.56%,其實掛單量也蘊含了很多信息,此時的最新價一般在二者之一,不能較準確反映當前的行情,如果用掛單量加權平均價或許更有意義。
(2)對于一些基于掛單價成交的策略,可以設置當前買一價買入,或者低于當前買一價若干價位買入,然后看5分鐘內能否成交。事實上,回測時可以更嚴格一些,比如我們掛買一價,如果最低價低于買一價才算是成交,即使相等也不算,這樣可以更為嚴格的估算掛單成交。
比如回測一個策略,可以出信號后立刻對手價+滑點成交,也可以假設掛單,如果下一根K線的最低價低于掛單價,則掛單價成交;如果下一根K線的最低價大于等于掛單價,則用下一根K線收盤價+滑點成交,這樣可以跟原來的成交情況進行對比,或許有所改進。
由于涉及掛單的策略會更復雜一些,這里不作專門討論,本書討論的趨勢策略默認都是加滑點即時成交。
2.3.4 跟其他行情軟件對比
每個行情軟件都有自己切割K線的方法,關于500毫秒應該放上一根還是下一根的問題每個軟件處理方法都不一樣。其實這些方法整體上都是大同小異的,沒必要刻意強求,但是要保證自己實盤程序跟研究程序用到的K線是一致的。因為這類機器學習模型,對數值計算高度敏感,隨著計算次數的增加,誤差是一直累積的并不會抵消,由此可能造成實盤和回測優化很不一致,比如開平倉時間點不一樣甚至缺少一些交易等。因此,最重要的是保持自己K線的一致性,而不是跟某個行情軟件的一致性。
另外,現在有很多免費或付費的基于第三方平臺的策略程序,也可以用自己的K線去測試一下。一般規則型的策略對數值不會很敏感,事實上如果對數值過于敏感也可能由過度擬合所導致。總之,如果是5分鐘K線的話應該差別不會很大,因此不必過于糾結。
對于夜盤結束等停止交易的時段要特別小心,交易所可能會把最后一條行情反復推送,或者自己的程序在夜盤結束后關閉,而白天重新啟動時會再次接收到夜盤的數據,很可能把成交量等再次累積計算,這些都要被過濾掉。本人曾經因為類似的原因導致白天開盤K線總是跟回測對不上,而且總是容易觸發交易而虧錢。