官术网_书友最值得收藏!

2.2 合成5分鐘數據

有些人問為什么需要合成5分鐘數據?其實這更多是從研究效率來考慮。5分鐘K線有以下幾個好處。

(1)過濾了分筆數據的很多噪音。分筆數據的量非常大,但行情起起伏伏,很多是噪聲交易者所為,并不能預示未來的趨勢。因此,如果能把這些信息整合起來,可以起到減少噪聲的作用,而且太微觀的變化對持倉長線的策略并沒有太大意義,性價比不高;

(2)提高計算速度。500毫秒的分筆數據5分鐘可以有5×60×2=600個數據,如果使用5分鐘K線,數據量只有原來的1/600,可以大大減少計算量;

(3)頻率也不會太低。如果用頻率更低的15分鐘線,則可能會因為頻率太低而失去很多交易的機會。國內商品市場上午10:15—10:30有個空檔,而且上午是到11:30,下午1:30開始,因此劃分K線最好是15的約數,10分鐘其實也不大好,比如15分鐘的空檔很難處理;如果是半小時、一小時,則會出現跨越很多空檔時間段,因此5分鐘是比較好的選擇。其實15分鐘的因子都可以用5分鐘合成。但1分鐘或許太過密集,很多商品不活躍,1分鐘也不會有太多成交。

合成5分鐘K線數據主要包括開始價、最高價、最低價、結束價、成交量、成交額、持倉量等信息,這些都是500毫秒數據包含的,只需簡單處理一下。但需要注意的地方包括:

(1)并不一定在整5分鐘結束的時候有行情。比如這段rb1709的行情:

在加粗部分,直接從21:04:58.500跳到了21:05:00.500,而應該存在的21:05:00.000卻不存在。因此,在進行K線分割時,并不能機械地查找整5分鐘的時間點,而應該順著行情一個一個檢查。

(2)每個合約開始結束時間并不一樣。比如黃金、白銀是凌晨2:30結束,而很多品種沒有夜盤,有的品種夜盤的時間在歷史上修改過,因此,程序要能靈活識別這些情況。比如把數據分段,如果該段不存在行情,則應該知道該品種在那個時段是沒有交易的。在這里,把夜盤分成5段,因為白天都是一樣的,所以只有一段,因此,程序可以這么寫:

注意到,比如是23:00:00.500這個時間,它會屬于night.2,某些品種夜盤會在這個時刻結束,因此,如果用“<23:00:01”的條件可以把它包含進來。每天結束時有時會有15:00:00.500的時刻,因此用“<15:00:01”可以把它包含進來。

(3)程序運行速度。無論R語言、Matlab,還是Python,其實都是解釋性語言,運行速度較慢,如果處理一些難以向量化的運算則會力不從心,此時可以考慮用C++來寫。

2.2.1 R語言的版本

比如上一小節說的找出每個5分鐘的切割點,如果用R語言來寫,可以寫成如下函數:

可以重復1000次考察其運行時間:

由此可以看出,效率并不是十分高。主要原因在于R語言本質上是解釋性語言,對于循環語句來說運行速度很慢,而這類切割K線存在路徑依賴的問題,很難并行化處理。因此,要想提高速度,只能使用其他速度更快、更低級的編程語言來實現。

2.2.2 結合Rcpp提速

目前最常見的低級語言是C和C++,它們速度差不多,但C++更容易上手,而且有著面向對象的功能,在R語言里面也可以直接調用,無縫連接。

R語言有一個專門跟C++程序結合的包叫做Rcpp,使用這個包可以直接在R語言里面編譯C++的程序,甚至可以自己專門建立一個library,每次方便調用。因此,如果讀者熟悉C++的話,不妨嘗試一下。

如果這部分用C++來寫,結合Rcpp,可以新建一個程序文件getTimeSplit.cpp:

如果要調用里面的命令,需要先用sourceCpp()命令來編譯:

然后可以看看用Rcpp的效果:

我們可以對比一下R和Rcpp運行的結果:

可見,兩種語言運行的結果是一樣的,但Rcpp的速度相比R語言要提高數十倍。

因此,提高計算速度對提高研究速度是非常有幫助的。比如80年代的神經網絡,雖然模型擬合能力非常厲害,但由于當時的數據集并不是很大,很容易過度擬合。而且復雜的模型需要的參數比較多,即使有大量的數據集,運算一遍非常耗時,以至于研究者缺乏足夠的耐心進行參數優化。90年代的支持向量機等算法雖然在擬合能力上不如神經網絡,但是卻采用了大量的數值計算、數值優化技巧,使運算速度大為提高,反而能夠在那個年代脫穎而出。

然而,2010年以后,隨著GNU等并行計算的大規模普及,以及互聯網等大規模數據的產生,很多計算量大的模型反而重新獲得了生命力。由于傳統神經網絡模型的名聲不是那么好,神經網絡的研究者采用了一個新的名字“深度學習”來繼續他們的研究。

事實上,深度學習是在神經網絡上發展起來的,比如著名的深度學習模型卷積神經網絡(Convolutional Neural Network,CNN)則更是跟神經網絡高度相關,所不同的地方在于普通的神經網絡要自己找出因子,然后放入模型中學習,而卷積神經網絡可以自己主動去尋找因子。這主要應用于圖像分類中,比如要識別出一只動物是貓還是狗,一開始的分層更多是一些邊界輪廓,比如識別出頭部,然后逐步深入,可以識別出眼睛、嘴巴等,卷積類似于信號處理的濾波,可以把圖像不同頻率的特征識別出來,一開始是一些比較低頻的特征,然后是更為高頻的特征,最后再把這些特征放入神經網絡模型中去擬合。

那么,這類模型能否用來分析金融數據呢?這個問題后面的章節會提到,這里只提一些思路。比如金融時間序列也是有低頻和高頻之分的,低頻的更能顯示出趨勢,高頻的則更類似于數據中的“毛刺”。比如一個5分鐘K線,開盤價和收盤價構成主體,類似于主要趨勢部分;上尾和下尾則類似于毛刺部分。或許一些厲害的高手可能把整個金融時間序列進行分解,比如是把價格變化分解成高頻交易員產生的部分、低頻交易員產生的部分、基本面產生的、技術面產生的等幾個部分,類似于貓的頭部、身體、尾部等然后再加總起來。

各個部分的交易員一般不會頻繁改變自己的交易思路,并且市場中各部分成員的比例在短時間內也不會改變,即使緩慢改變,我們也可以通過漸進式(adaptive)的模型去擬合,這種方式或許比目前簡單的線性回歸模型更好一些。當然,這類模型需要的數據量也會更多,或許可以把數十個品種的數據加起來進行擬合。其實,每個分筆數據類似于圖像處理的每個像素點,或許可以把圖像處理的模型移植到金融中。這些內容已經超出了本書的范圍,不再深入研究,它的計算量會比目前的模型大得多。我們接下來講解運用多核并行計算來提高計算速度。

2.2.3 多核并行再次提速

如果是處理單個品種的數據,用Rcpp進行提速似乎已經很不錯了。但商品期貨有數十個品種,而且品種數目一直在增加,我們應尋求其他提高速度的辦法。

現在的計算機普遍采用了多核CPU,每核一般有兩個線程。比如本人現在使用的筆記本計算機是2核4線程,使用的臺式機是10核20線程,當然服務器可以有幾百個線程,國外厲害的公司估計幾千個線程都沒問題。使用這些來進行編程,自然可以更好地提高速度。

比如,在R語言里面可以使用parallel包來實現并行計算:

如果使用更多的核來并行,可以進一步提高速度。這里makeCluster()是使用核的命令,n.core是核的數目,這里是4。另外,parLapply()是并行的命令,par開頭的此類處理命令在parallel包里面。

下面看看parallel.process.5m.data()的程序:

之所以對鄭州單獨處理是因為大連和上海的合約月份都是4位,而鄭州是3位。這里面還調用了一個函數parse.dire.fast(),它是對一個文件夾里面的所有合約進行處理,代碼如下:

這里面調用了函數get.data.5m.fast(),它就是利用了Rcpp的函數來把分筆數據整理成5分鐘數據,速度比較快,代碼如下:

這里計算了5分鐘K線的高開低收以及成交量、持倉量等,至此,整個把分筆數據合成5分鐘K線的程序就完成了。如果該品種某段交易時間段不交易,則會自動跳過該段時間段,進入到下一個時間段。哪怕該段時間只有一次交易,也會生成該段所有的5分鐘K線。

當然,這個程序也有一定的缺陷,比如交易所改變交易時間段,增加某些時間段或拆分已有的時間段等都需要修改程序。

另外,部分量化交易策略需要估算掛單成交的,除了高開低收的成交價以外,還需要掛單價,這里由于我們分析的是趨勢策略,加滑點搶單成交,并沒有分析被動掛單策略,因此不需要最高價和最低價的掛單價,有興趣的讀者可以自己整理一下。

主站蜘蛛池模板: 万荣县| 新乐市| 大方县| 驻马店市| 宁德市| 兴国县| 徐汇区| 定州市| 赤水市| 镶黄旗| 尉犁县| 东源县| 贵南县| 缙云县| 策勒县| 利辛县| 泾阳县| 彭阳县| 乌兰浩特市| 双流县| 宜兰县| 万年县| 增城市| 修文县| 永新县| 绥宁县| 博爱县| 当涂县| 高淳县| 右玉县| 红桥区| 尚义县| 库伦旗| 绍兴市| 旌德县| 集安市| 贵定县| 宜城市| 芜湖市| 九龙坡区| 庆云县|