雷鋒網按:本文原作者
BigQuant
,本文原載於
知乎專欄
。雷鋒網已獲得授權轉載。
摘要:
BigQuant
平臺上的 StockRanker 演算法在選股方面有不俗的表現,模型在 15、16 年的回測收益率也很高 (使用默認因數收益率就達到 170% 左右)。然而,StockRanker 在股災時期回撤很大 (使用默認因數回撤 55%),因此需要擇時模型,控制 StockRanker 在大盤走勢不好時的倉位。 LSTM(長短期記憶神經網路) 是一種善於處理和預測時間序列相關資料的 RNN。本文初步探究了 LSTM 在股票市場的應用,進而將 LSTM 對滬深 300 未來五日收益率的預測作為擇時器並與 StockRanker 結合使用,在對回測收益率有較好保證的前提下,較為顯著地降低了 StockRanker 的回撤。
LSTM Networks(長短期記憶神經網路)簡介
LSTM Networks 是遞迴神經網路(RNNs)的一種,該演算法由 Sepp Hochreiter 和 Jurgen Schmidhuber 在 Neural Computation 上首次公佈。後經過人們的不斷改進,LSTM 的內部結構逐漸變得完善起來(圖 1)。在處理和預測時間序列相關的資料時會比一般的 RNNs 表現的更好。目前,LSTM Networks 已經被廣泛應用在機器人控制、文本識別及預測、語音辨識、蛋白質同源檢測等領域。基於 LSTM Networks 在這些方面的優異表現,本文旨在探究 LSTM 是否可以應用於股票時間序列的預測。
LSTM Networks 處理股票時間序列的流程
本文使用的 LSTM 處理股票序列的流程如圖 2。本文的整體流程均在
BigQuant
量化平臺上進行,構建 LSTM 模型使用庫主要為 Keras。
資料獲取與處理:對於時間序列,我們通常會以 [X(t-n),X(t-n+1),…,X(t-1),X(t)] 這 n 個時刻的資料作為輸入來預測 (t+1) 時刻的輸出。對於股票來說,在 t 時刻會有若干個 features,因此,為了豐富 features 以使模型更加精確,本文將 n(time series)×s(features per time series) 的二維向量作為輸入。LSTM 對於資料標準化的要求很高,因此本文所有 input 資料均經過 z-score 標準化處理。
LSTM 模型構建:作為迴圈層的一種神經網路結構,只使用 LSTM 並不能構建出一個完整的模型,LSTM 還需要與其他神經網路層(如 Dense 層、卷積層等)配合使用。此外,還可以構建多層 LSTM 層來增加模型的複雜性。
回測:本文進行的回測分為兩種,一是直接將 LSTM 輸出結果作為做單信號在個股上進行回測,二是將 LSTM 的預測結果作為一種擇時信號,再配合其他選股模型(如 BigQuant 平臺的 StockRanker)進行回測。
LSTM 應用股票市場初探
之前我們做過 LSTM 應用於股票市場的初步探究(
連結位址
),使用方法為利用滬深 300 前 100 天的收盤價預測下一天的收盤價。從結果來看,LSTM 對未來 20 天的預測基本上是對過去 100 天收盤價變化的趨勢的總括,因此最終的預測結果以及回測結果都不是很理想。 之後嘗試增加了 features(每日 Open,High,Low,Close,Amount,Volume),效果依然不是很好。
通過對結果進行分析以及閱讀研究一些研報,得到的初步結論為:一是 input 時間跨度太長(100 天的價格走勢對未來一天的價格變化影響很小),而待預測資料時間跨度太短;二是收盤價(Close)是非平穩資料,LSTM 對於非平穩資料的預測效果沒有平穩資料好。
LSTM 對滬深 300 未來五日收益率預測
綜合以上兩點,本文所使用的輸入和輸出為利用過去 30 天的資料預測將來五天的收益。
測試對象:滬深 300
資料選擇和處理:
input 的時間跨度為 30 天,每天的 features 為 ['close','open','high','low','amount','volume'] 共 6 個,因此每個 input 為 30×6 的二維向量。
output 為未來 5 日收益 future_return_5(future_return_5>0.2, 取 0.2;future_return_5
訓練數據:滬深 300 2005-01-01 至 2014-12-31 時間段的資料;測試資料:滬深 300 2015-01-01 至 2017-05-01 時間段資料。
模型構建:鑒於資料較少(訓練資料約 2500 個,預測資料約 500 個),因此模型構建的相對簡單。模型共四層,為一層 LSTM 層 + 三層 Dense 層(圖 3)。
回測:得到 LSTM 預測結果後,若 LSTM 預測值小於 0,則記為 - 1,若大於 0,記為 1。
每個模型做兩次回測,第一次回測(後文簡稱回測 1)為直接以 LSTM 預測值在滬深 300 上做單:若 LSTM 預測值為 1,買入並持有 5day(若之前已持倉,則更新持有天數),若 LSTM 預測值為 - 1,若為空倉期,則繼續空倉,若已持有股票,則不更新持有天數;
第二次回測(後文簡稱回測 2)為以 LSTM 為擇時指標,與 StockRanker 結合在 3000 檔股票做單:若 LSTM 預測值為 1,則允許 StockRanker 根據其排序分數買入股票,若 LSTM 預測值為 - 1,若為空倉期,則繼續空倉,若已持有股票,則禁止 StockRanker 買入股票,根據現有股票的買入時間,5 天內清倉;
1)future_return_5 是否二極化處理比較
對於 future_return_5 的處理分為兩種情況,一種為直接將 future_return_5 作為 output 進行模型訓練,二是將 future_return_5 二極化(future_return_5>0, 取 1;future_return_5
兩種處理方法的回測情況如圖 4,圖 5。由於模型每次初始化權重不一樣,每次預測和回測結果會有一些差別,但經過多次回測統計,直接將 future_return_5 作為 output 進行模型訓練是一個更好的選擇。在本文接下來的討論中,將會直接將 future_return_5 作為 output 進行模型訓練。
2) 在權重上施加正則項探究
神經網路的過擬合:在訓練神經網路過程中,“過擬合” 是一項儘量要避免的事。神經網路 “死記” 訓練資料。過擬合意味著模型在訓練資料的表現會很好,但對於訓練以外的預測則效果很差。原因通常為模型 “死記” 訓練資料及其雜訊,從而導致模型過於複雜。本文使用的滬深 300 的資料量不是太多,因此防止模型過擬合就尤為重要。
訓練 LSTM 模型時,在參數層面上有兩個十分重要的參數可以控制模型的過擬合:Dropout 參數和在權重上施加正則項。Dropout 是指在每次輸入時隨機丟棄一些 features,從而提高模型的魯棒性。它的出發點是通過不停去改變網路的結構,使神經網路記住的不是訓練資料本身,而是能學出一些規律性的東西。正則項則是通過在計算損失函數時增加一項 L2 範數,使一些權重的值趨近於 0,避免模型對每個 feature 強行適應與擬合,從而提高魯棒性,也有因數選擇的效果;(若希望在數學層面瞭解正則項更多知識,參考《
機器學習中防止過擬合的處理方法
》) 。在 1) 的模型訓練中,我們加入了 Dropout 參數來避免過擬合。接下來我們嘗試額外在權重上施加正則項來測試模型的表現。
回測結果如圖 6,加入正則項之後回測 1 和回測 2 的最大回撤均有下降,說明加入正則項後確實減輕了模型的過擬合。比較加入正則項前後回測 1 的持倉情況,可以看到加入正則化後空倉期更長, 做單次數減少 (19/17),可以理解為:加入正則項之後,模型會變得更加保守。
正則項的問題:經過試驗, 對於一個 LSTM 模型來說,正則項的參數十分重要,調參也需要長時間嘗試,不合適的參數選擇會造成模型的預測值偏正分佈 (大部分預測值大於 0) 或偏負分佈,從而導致預測結果不準確,而較好的正則參數會使模型泛化性非常好 (圖 6 所用參數訓練出來的模型的預測值屬於輕度偏正分佈)。本文之後的討論仍會基於未加權重正則項的 LSTM 模型。
3) 雙輸入模型探究
除了傳統的 Sequential Model(一輸入,一輸出) 外,本文還嘗試構建了 Functional Model(支援多輸入,多輸出)。前面提到的 features 處理方法丟失了一項重要的資訊:價格的高低。相同的 input 處在 3000 點和 6000 點時的 future_return_5 可能有很大不同。因此,本文嘗試構建了 "二輸入一輸出" 的 Functional Model: 標準化後的 features 作為 input 輸入 LSTM 層, LSTM 層的輸出結果和一個指標 - label(label=np.round(close/500)) 作為 input 輸入後面的 Dense 層,最終輸出仍為 future_return_5(圖 7)。
回測結果如圖 8。由回測結果可以看出,加入指示標後的 LSTM 模型收益率相對下降,但是回撤更小。LSTM 預測值小於 0 的時間段覆蓋了滬深 300 上大多數大幅下跌的時間段, 雖然也錯誤地將一些震盪或上漲趨勢劃歸為下跌趨勢。或許這是不可避免的,俗話說高風險高回報,風險低那麼回報也不會非常高,高回報和低風險往往不可兼得。
結論與展望
本文通過探究性地應用 LSTM 對滬深 300 未來五日收益率進行預測,初步說明了 LSTM Networks 是可以用在股票市場上的。
由於 LSTM 更適用於處理個股 / 指數,因此,將 LSTM 作為擇時模型與其他選股模型配合使用效果較好。利用 LSTM 模型對滬深 300 資料進行預測並將結果作為擇時信號,可以顯著改善 stockranker 選股模型在回測階段的回撤。
展望:由於個股資料量較少,LSTM 模型的可擴展程度和複雜度受到很大制約,features 的選擇也受到限制(若 input 的 features 太多,而 data 較少的話,會使一部分 features 不能發揮出應有的作用,也極易造成過擬合)。將來我們希望能在個股 / 指數的小時或分鐘資料上測試 LSTM 的性能。另外,將探究 LSTM 模型能否將屬於一個行業的所有股票 data 一起處理也是一個可選的方向。
說明:由於每次訓練 LSTM 模型權重更新情況不同以及 Dropout 的隨機性,LSTM 模型的每次訓練訓練結果都會有差異。
附:
提示:由於 LSTM 涉及參數眾多,目前我們還不能保證 LSTM 模型的穩定性, 本文所附回測結果均為多次訓練模型後選取的較為理想的情況,目的是說明 LSTM 是可以應用於股票市場的以及將其作為擇時模型是可能的。本文所述以及提供的代碼僅供探究及討論,若要形成一個在股票市場比較實用的 LSTM 模型,還需要在 features 選擇、模型構建、模型參數選擇以及調優等方面花費大量精力。
原始程式碼:
LSTM Networks 應用於股票市場探究之 Sequential Model
LSTM Networks 應用於股票市場探究之 Functional Model