天天看點

LSTM Networks 應用于股票市場探究

LSTM Networks 應用于股票市場探究

lstm networks(長短期記憶神經網絡)簡介

lstm networks 是遞歸神經網絡(rnns)的一種,該算法由 sepp hochreiter 和 jurgen schmidhuber 在 neural computation 上首次公布。後經過人們的不斷改進,lstm 的内部結構逐漸變得完善起來(圖 1)。在處理和預測時間序列相關的資料時會比一般的 rnns 表現的更好。目前,lstm networks 已經被廣泛應用在機器人控制、文本識别及預測、語音識别、蛋白質同源檢測等領域。基于 lstm networks 在這些方面的優異表現,本文旨在探究 lstm 是否可以應用于股票時間序列的預測。

LSTM Networks 應用于股票市場探究

lstm networks 處理股票時間序列的流程

資料擷取與處理:對于時間序列,我們通常會以 [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 Networks 應用于股票市場探究

lstm 應用股票市場初探

通過對結果進行分析以及閱讀研究一些研報,得到的初步結論為:一是 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<-0.2, 取 - 0.2),為使訓練效果更加明顯,output=future_return_5×10; features 均經過标準化處理 (在每個樣本内每個 feature 标準化處理一次)。

訓練資料:滬深 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 天内清倉;

LSTM Networks 應用于股票市場探究

1)future_return_5 是否二極化處理比較

對于 future_return_5 的處理分為兩種情況,一種為直接将 future_return_5 作為 output 進行模型訓練,二是将 future_return_5 二極化(future_return_5>0, 取 1;future_return_5<=0, 取 - 1),然後将二極化後的資料作為 output 進行模型訓練。

兩種處理方法的回測情況如圖 4,圖 5。由于模型每次初始化權重不一樣,每次預測和回測結果會有一些差别,但經過多次回測統計,直接将 future_return_5 作為 output 進行模型訓練是一個更好的選擇。在本文接下來的讨論中,将會直接将 future_return_5 作為 output 進行模型訓練。

LSTM Networks 應用于股票市場探究
LSTM Networks 應用于股票市場探究

2) 在權重上施加正則項探究

神經網絡的過拟合:在訓練神經網絡過程中,“過拟合” 是一項盡量要避免的事。神經網絡 “死記” 訓練資料。過拟合意味着模型在訓練資料的表現會很好,但對于訓練以外的預測則效果很差。原因通常為模型 “死記” 訓練資料及其噪聲,進而導緻模型過于複雜。本文使用的滬深 300 的資料量不是太多,是以防止模型過拟合就尤為重要。

回測結果如圖 6,加入正則項之後回測 1 和回測 2 的最大回撤均有下降,說明加入正則項後确實減輕了模型的過拟合。比較加入正則項前後回測 1 的持倉情況,可以看到加入正則化後空倉期更長, 做單次數減少 (19/17),可以了解為:加入正則項之後,模型會變得更加保守。

正則項的問題:經過試驗, 對于一個 lstm 模型來說,正則項的參數十分重要,調參也需要長時間嘗試,不合适的參數選擇會造成模型的預測值偏正分布 (大部分預測值大于 0) 或偏負分布,進而導緻預測結果不準确,而較好的正則參數會使模型泛化性非常好 (圖 6 所用參數訓練出來的模型的預測值屬于輕度偏正分布)。本文之後的讨論仍會基于未權重重正則項的 lstm 模型。

LSTM Networks 應用于股票市場探究

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)。

LSTM Networks 應用于股票市場探究

回測結果如圖 8。由回測結果可以看出,加入訓示标後的 lstm 模型收益率相對下降,但是回撤更小。lstm 預測值小于 0 的時間段覆寫了滬深 300 上大多數大幅下跌的時間段, 雖然也錯誤地将一些震蕩或上漲趨勢劃歸為下跌趨勢。或許這是不可避免的,俗話說高風險高回報,風險低那麼回報也不會非常高,高回報和低風險往往不可兼得。

LSTM Networks 應用于股票市場探究

結論與展望

本文通過探究性地應用 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 選擇、模型建構、模型參數選擇以及調優等方面花費大量精力。

源代碼:

<a href="http://link.zhihu.com/?target=https%3a//community.bigquant.com/t/lstm-networks%25e5%25ba%2594%25e7%2594%25a8%25e4%25ba%258e%25e8%2582%25a1%25e7%25a5%25a8%25e5%25b8%2582%25e5%259c%25ba%25e4%25b9%258bsequential-model/320%3ffrom%3dzhihu%26type%3dlstm" target="_blank">lstm networks 應用于股票市場探究之 sequential model</a>

<a href="http://link.zhihu.com/?target=https%3a//community.bigquant.com/t/lstm-networks%25e5%25ba%2594%25e7%2594%25a8%25e4%25ba%258e%25e8%2582%25a1%25e7%25a5%25a8%25e5%25b8%2582%25e5%259c%25ba%25e4%25b9%258bfunctional-model/321%3ffrom%3dzhihu%26type%3dlstm" target="_blank">lstm networks 應用于股票市場探究之 functional model</a>

“從零建構一個區塊鍊應用”開課啦!

thoughtworks 頂級專家手把手教你實作區塊鍊應用!

課程詳情:http://www.leiphone.com/special/custom/mooc06.html

====================================分割線================================

本文作者:ai研習社

繼續閱讀