學習使用機器學習預測金融時間序列的第一步
我試圖掌握如何使用機器學習來預測未來的金融時間序列 1 步或更多步。
我有一個包含一些描述性數據的金融時間序列,我想建立一個模型,然後使用該模型來預測 n 步。
到目前為止我一直在做的是:
getSymbols("GOOG") GOOG$sma <- SMA(Cl(GOOG)) GOOG$range <- GOOG$GOOG.High-GOOG$GOOG.Low tail(GOOG) GOOG.Open GOOG.High GOOG.Low GOOG.Close GOOG.Volume GOOG.Adjusted sma range 2013-05-07 863.01 863.87 850.67 857.23 1959000 857.23 828.214 13.20 2013-05-08 857.00 873.88 852.91 873.63 2468300 873.63 834.232 20.97 2013-05-09 870.84 879.66 868.23 871.48 2200600 871.48 840.470 11.43 2013-05-10 875.31 880.54 872.16 880.23 1897700 880.23 848.351 8.38 2013-05-13 878.89 882.47 873.38 877.53 1448500 877.53 854.198 9.09 2013-05-14 877.50 888.69 877.14 887.10 1579300 887.10 860.451 11.55
然後我為這些數據擬合了一個 randomForest 模型。
fit <- randomForest(GOOG$GOOG.Close ~ GOOG$sma + GOOG$range, GOOG)
這似乎非常適合:
> fit Call: randomForest(formula = GOOG$GOOG.Close ~ GOOG$sma + GOOG$range, data = GOOG) Type of random forest: regression Number of trees: 500 No. of variables tried at each split: 1 Mean of squared residuals: 353.9844 % Var explained: 97.28
並試圖用它來預測:
predict(fit, GOOG, n.ahead=2)
但是這個對c的預測並沒有奏效。
我嘗試預測收盤價,在擬合模型之前,我是否應該將其他變量滯後於我想要的預測步數?
可能還有很多其他的東西我也應該考慮在內,但這些確實是我嘗試機器學習的第一步。
我的第一個觀察結果是,您沒有滯後於收盤價的輸入,這就是您觀察到如此合適的原因。SMA(簡單移動平均線)在其計算中使用收盤價,而高低範圍包含收盤價,因此使用它們來預測收盤價會產生前瞻性偏差。我的觀點是,如果您試圖提前兩天預測收盤價,您應該使用比收盤價至少滯後兩天的輸入來構建模型。一些輸入可能會滯後兩天以上,但我會從簡單開始,嘗試只使用少數輸入。
至於您預測收盤價的目標,我認為收盤價太嘈雜而不能用作目標變量,使用它們會導致過度擬合或優化錯誤的目標。相反,我會先用移動平均線平滑收盤價,然後預測未來兩天的價格變化方向。例如,我可以用收盤的 5 天 SMA 代替收盤,然後將 SMA 的價格變化編碼為 1,如果它在接下來的兩天內為正,否則編碼為 0。因為輸出變量現在被編碼為 1 或 0,這是一個很好的問題,可以嘗試使用您使用的隨機森林函數來解決。您還可以嘗試其他一些分類算法,例如邏輯回歸、神經網絡和 SVM,並可能將一些分類算法組合成一個集合以提高您的性能。在不過度擬合的情況下,這仍然是一個難以解決的問題,但這是朝著正確方向邁出的一步。另一個要注意的是,您的最終模型在將接下來的兩天分類為正面或負面時可能具有驚人的準確性,但仍然會賠錢,因為它錯誤地分類了一些大動作。
我還建議在不止一種證券上構建您的模型,這樣機器學習算法就不會針對一隻股票的特質進行磨練。我會從至少 5 只彼此不高度相關的股票開始。
Guido Deboeck 的 Trading on the Edge 是探索機器學習在金融時間序列預測中的應用的一個很好的起點。這是一本較舊的書,因此它遠遠落後於我們今天可用的技術,但它是一個好的開始。我還推薦考夫曼的新交易系統和方法和約翰沃爾伯格的專家交易系統。