0
雷鋒網(wǎng)按:本文原作者BigQuant,本文原載于知乎專欄。雷鋒網(wǎng)已獲得授權(quán)轉(zhuǎn)載。
摘要:BigQuant平臺(tái)上的 StockRanker 算法在選股方面有不俗的表現(xiàn),模型在 15、16 年的回測(cè)收益率也很高 (使用默認(rèn)因子收益率就達(dá)到 170% 左右)。然而,StockRanker 在股災(zāi)時(shí)期回撤很大 (使用默認(rèn)因子回撤 55%),因此需要擇時(shí)模型,控制 StockRanker 在大盤走勢(shì)不好時(shí)的倉(cāng)位。 LSTM(長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)) 是一種善于處理和預(yù)測(cè)時(shí)間序列相關(guān)數(shù)據(jù)的 RNN。本文初步探究了 LSTM 在股票市場(chǎng)的應(yīng)用,進(jìn)而將 LSTM 對(duì)滬深 300 未來(lái)五日收益率的預(yù)測(cè)作為擇時(shí)器并與 StockRanker 結(jié)合使用,在對(duì)回測(cè)收益率有較好保證的前提下,較為顯著地降低了 StockRanker 的回撤。
LSTM Networks(長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò))簡(jiǎn)介
LSTM Networks 是遞歸神經(jīng)網(wǎng)絡(luò)(RNNs)的一種,該算法由 Sepp Hochreiter 和 Jurgen Schmidhuber 在 Neural Computation 上首次公布。后經(jīng)過(guò)人們的不斷改進(jìn),LSTM 的內(nèi)部結(jié)構(gòu)逐漸變得完善起來(lái)(圖 1)。在處理和預(yù)測(cè)時(shí)間序列相關(guān)的數(shù)據(jù)時(shí)會(huì)比一般的 RNNs 表現(xiàn)的更好。目前,LSTM Networks 已經(jīng)被廣泛應(yīng)用在機(jī)器人控制、文本識(shí)別及預(yù)測(cè)、語(yǔ)音識(shí)別、蛋白質(zhì)同源檢測(cè)等領(lǐng)域?;?LSTM Networks 在這些方面的優(yōu)異表現(xiàn),本文旨在探究 LSTM 是否可以應(yīng)用于股票時(shí)間序列的預(yù)測(cè)。
LSTM Networks 處理股票時(shí)間序列的流程
本文使用的 LSTM 處理股票序列的流程如圖 2。本文的整體流程均在 BigQuant 量化平臺(tái)上進(jìn)行,構(gòu)建 LSTM 模型使用庫(kù)主要為 Keras。
數(shù)據(jù)獲取與處理:對(duì)于時(shí)間序列,我們通常會(huì)以 [X(t-n),X(t-n+1),…,X(t-1),X(t)] 這 n 個(gè)時(shí)刻的數(shù)據(jù)作為輸入來(lái)預(yù)測(cè) (t+1) 時(shí)刻的輸出。對(duì)于股票來(lái)說(shuō),在 t 時(shí)刻會(huì)有若干個(gè) features,因此,為了豐富 features 以使模型更加精確,本文將 n(time series)×s(features per time series) 的二維向量作為輸入。LSTM 對(duì)于數(shù)據(jù)標(biāo)準(zhǔn)化的要求很高,因此本文所有 input 數(shù)據(jù)均經(jīng)過(guò) z-score 標(biāo)準(zhǔn)化處理。
LSTM 模型構(gòu)建:作為循環(huán)層的一種神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),只使用 LSTM 并不能構(gòu)建出一個(gè)完整的模型,LSTM 還需要與其他神經(jīng)網(wǎng)絡(luò)層(如 Dense 層、卷積層等)配合使用。此外,還可以構(gòu)建多層 LSTM 層來(lái)增加模型的復(fù)雜性。
回測(cè):本文進(jìn)行的回測(cè)分為兩種,一是直接將 LSTM 輸出結(jié)果作為做單信號(hào)在個(gè)股上進(jìn)行回測(cè),二是將 LSTM 的預(yù)測(cè)結(jié)果作為一種擇時(shí)信號(hào),再配合其他選股模型(如 BigQuant 平臺(tái)的 StockRanker)進(jìn)行回測(cè)。
LSTM 應(yīng)用股票市場(chǎng)初探
之前我們做過(guò) LSTM 應(yīng)用于股票市場(chǎng)的初步探究(鏈接地址),使用方法為利用滬深 300 前 100 天的收盤價(jià)預(yù)測(cè)下一天的收盤價(jià)。從結(jié)果來(lái)看,LSTM 對(duì)未來(lái) 20 天的預(yù)測(cè)基本上是對(duì)過(guò)去 100 天收盤價(jià)變化的趨勢(shì)的總括,因此最終的預(yù)測(cè)結(jié)果以及回測(cè)結(jié)果都不是很理想。 之后嘗試增加了 features(每日 Open,High,Low,Close,Amount,Volume),效果依然不是很好。
通過(guò)對(duì)結(jié)果進(jìn)行分析以及閱讀研究一些研報(bào),得到的初步結(jié)論為:一是 input 時(shí)間跨度太長(zhǎng)(100 天的價(jià)格走勢(shì)對(duì)未來(lái)一天的價(jià)格變化影響很?。A(yù)測(cè)數(shù)據(jù)時(shí)間跨度太短;二是收盤價(jià)(Close)是非平穩(wěn)數(shù)據(jù),LSTM 對(duì)于非平穩(wěn)數(shù)據(jù)的預(yù)測(cè)效果沒(méi)有平穩(wěn)數(shù)據(jù)好。
LSTM 對(duì)滬深 300 未來(lái)五日收益率預(yù)測(cè)
綜合以上兩點(diǎn),本文所使用的輸入和輸出為利用過(guò)去 30 天的數(shù)據(jù)預(yù)測(cè)將來(lái)五天的收益。
測(cè)試對(duì)象:滬深 300
數(shù)據(jù)選擇和處理:
input 的時(shí)間跨度為 30 天,每天的 features 為 ['close','open','high','low','amount','volume'] 共 6 個(gè),因此每個(gè) input 為 30×6 的二維向量。
output 為未來(lái) 5 日收益 future_return_5(future_return_5>0.2, 取 0.2;future_return_5<-0.2, 取 - 0.2),為使訓(xùn)練效果更加明顯,output=future_return_5×10; features 均經(jīng)過(guò)標(biāo)準(zhǔn)化處理 (在每個(gè)樣本內(nèi)每個(gè) feature 標(biāo)準(zhǔn)化處理一次)。
訓(xùn)練數(shù)據(jù):滬深 300 2005-01-01 至 2014-12-31 時(shí)間段的數(shù)據(jù);測(cè)試數(shù)據(jù):滬深 300 2015-01-01 至 2017-05-01 時(shí)間段數(shù)據(jù)。
模型構(gòu)建:鑒于數(shù)據(jù)較少(訓(xùn)練數(shù)據(jù)約 2500 個(gè),預(yù)測(cè)數(shù)據(jù)約 500 個(gè)),因此模型構(gòu)建的相對(duì)簡(jiǎn)單。模型共四層,為一層 LSTM 層 + 三層 Dense 層(圖 3)。
回測(cè):得到 LSTM 預(yù)測(cè)結(jié)果后,若 LSTM 預(yù)測(cè)值小于 0,則記為 - 1,若大于 0,記為 1。
每個(gè)模型做兩次回測(cè),第一次回測(cè)(后文簡(jiǎn)稱回測(cè) 1)為直接以 LSTM 預(yù)測(cè)值在滬深 300 上做單:若 LSTM 預(yù)測(cè)值為 1,買入并持有 5day(若之前已持倉(cāng),則更新持有天數(shù)),若 LSTM 預(yù)測(cè)值為 - 1,若為空倉(cāng)期,則繼續(xù)空倉(cāng),若已持有股票,則不更新持有天數(shù);
第二次回測(cè)(后文簡(jiǎn)稱回測(cè) 2)為以 LSTM 為擇時(shí)指標(biāo),與 StockRanker 結(jié)合在 3000 只股票做單:若 LSTM 預(yù)測(cè)值為 1,則允許 StockRanker 根據(jù)其排序分?jǐn)?shù)買入股票,若 LSTM 預(yù)測(cè)值為 - 1,若為空倉(cāng)期,則繼續(xù)空倉(cāng),若已持有股票,則禁止 StockRanker 買入股票,根據(jù)現(xiàn)有股票的買入時(shí)間,5 天內(nèi)清倉(cāng);
1)future_return_5 是否二極化處理比較
對(duì)于 future_return_5 的處理分為兩種情況,一種為直接將 future_return_5 作為 output 進(jìn)行模型訓(xùn)練,二是將 future_return_5 二極化(future_return_5>0, 取 1;future_return_5<=0, 取 - 1),然后將二極化后的數(shù)據(jù)作為 output 進(jìn)行模型訓(xùn)練。
兩種處理方法的回測(cè)情況如圖 4,圖 5。由于模型每次初始化權(quán)重不一樣,每次預(yù)測(cè)和回測(cè)結(jié)果會(huì)有一些差別,但經(jīng)過(guò)多次回測(cè)統(tǒng)計(jì),直接將 future_return_5 作為 output 進(jìn)行模型訓(xùn)練是一個(gè)更好的選擇。在本文接下來(lái)的討論中,將會(huì)直接將 future_return_5 作為 output 進(jìn)行模型訓(xùn)練。
2) 在權(quán)重上施加正則項(xiàng)探究
神經(jīng)網(wǎng)絡(luò)的過(guò)擬合:在訓(xùn)練神經(jīng)網(wǎng)絡(luò)過(guò)程中,“過(guò)擬合” 是一項(xiàng)盡量要避免的事。神經(jīng)網(wǎng)絡(luò) “死記” 訓(xùn)練數(shù)據(jù)。過(guò)擬合意味著模型在訓(xùn)練數(shù)據(jù)的表現(xiàn)會(huì)很好,但對(duì)于訓(xùn)練以外的預(yù)測(cè)則效果很差。原因通常為模型 “死記” 訓(xùn)練數(shù)據(jù)及其噪聲,從而導(dǎo)致模型過(guò)于復(fù)雜。本文使用的滬深 300 的數(shù)據(jù)量不是太多,因此防止模型過(guò)擬合就尤為重要。
訓(xùn)練 LSTM 模型時(shí),在參數(shù)層面上有兩個(gè)十分重要的參數(shù)可以控制模型的過(guò)擬合:Dropout 參數(shù)和在權(quán)重上施加正則項(xiàng)。Dropout 是指在每次輸入時(shí)隨機(jī)丟棄一些 features,從而提高模型的魯棒性。它的出發(fā)點(diǎn)是通過(guò)不停去改變網(wǎng)絡(luò)的結(jié)構(gòu),使神經(jīng)網(wǎng)絡(luò)記住的不是訓(xùn)練數(shù)據(jù)本身,而是能學(xué)出一些規(guī)律性的東西。正則項(xiàng)則是通過(guò)在計(jì)算損失函數(shù)時(shí)增加一項(xiàng) L2 范數(shù),使一些權(quán)重的值趨近于 0,避免模型對(duì)每個(gè) feature 強(qiáng)行適應(yīng)與擬合,從而提高魯棒性,也有因子選擇的效果;(若希望在數(shù)學(xué)層面了解正則項(xiàng)更多知識(shí),參考《機(jī)器學(xué)習(xí)中防止過(guò)擬合的處理方法》) 。在 1) 的模型訓(xùn)練中,我們加入了 Dropout 參數(shù)來(lái)避免過(guò)擬合。接下來(lái)我們嘗試額外在權(quán)重上施加正則項(xiàng)來(lái)測(cè)試模型的表現(xiàn)。
回測(cè)結(jié)果如圖 6,加入正則項(xiàng)之后回測(cè) 1 和回測(cè) 2 的最大回撤均有下降,說(shuō)明加入正則項(xiàng)后確實(shí)減輕了模型的過(guò)擬合。比較加入正則項(xiàng)前后回測(cè) 1 的持倉(cāng)情況,可以看到加入正則化后空倉(cāng)期更長(zhǎng), 做單次數(shù)減少 (19/17),可以理解為:加入正則項(xiàng)之后,模型會(huì)變得更加保守。
正則項(xiàng)的問(wèn)題:經(jīng)過(guò)試驗(yàn), 對(duì)于一個(gè) LSTM 模型來(lái)說(shuō),正則項(xiàng)的參數(shù)十分重要,調(diào)參也需要長(zhǎng)時(shí)間嘗試,不合適的參數(shù)選擇會(huì)造成模型的預(yù)測(cè)值偏正分布 (大部分預(yù)測(cè)值大于 0) 或偏負(fù)分布,從而導(dǎo)致預(yù)測(cè)結(jié)果不準(zhǔn)確,而較好的正則參數(shù)會(huì)使模型泛化性非常好 (圖 6 所用參數(shù)訓(xùn)練出來(lái)的模型的預(yù)測(cè)值屬于輕度偏正分布)。本文之后的討論仍會(huì)基于未加權(quán)重正則項(xiàng)的 LSTM 模型。
3) 雙輸入模型探究
除了傳統(tǒng)的 Sequential Model(一輸入,一輸出) 外,本文還嘗試構(gòu)建了 Functional Model(支持多輸入,多輸出)。前面提到的 features 處理方法丟失了一項(xiàng)重要的信息:價(jià)格的高低。相同的 input 處在 3000 點(diǎn)和 6000 點(diǎn)時(shí)的 future_return_5 可能有很大不同。因此,本文嘗試構(gòu)建了 "二輸入一輸出" 的 Functional Model: 標(biāo)準(zhǔn)化后的 features 作為 input 輸入 LSTM 層, LSTM 層的輸出結(jié)果和一個(gè)指標(biāo) - label(label=np.round(close/500)) 作為 input 輸入后面的 Dense 層,最終輸出仍為 future_return_5(圖 7)。
回測(cè)結(jié)果如圖 8。由回測(cè)結(jié)果可以看出,加入指示標(biāo)后的 LSTM 模型收益率相對(duì)下降,但是回撤更小。LSTM 預(yù)測(cè)值小于 0 的時(shí)間段覆蓋了滬深 300 上大多數(shù)大幅下跌的時(shí)間段, 雖然也錯(cuò)誤地將一些震蕩或上漲趨勢(shì)劃歸為下跌趨勢(shì)。或許這是不可避免的,俗話說(shuō)高風(fēng)險(xiǎn)高回報(bào),風(fēng)險(xiǎn)低那么回報(bào)也不會(huì)非常高,高回報(bào)和低風(fēng)險(xiǎn)往往不可兼得。
結(jié)論與展望
本文通過(guò)探究性地應(yīng)用 LSTM 對(duì)滬深 300 未來(lái)五日收益率進(jìn)行預(yù)測(cè),初步說(shuō)明了 LSTM Networks 是可以用在股票市場(chǎng)上的。
由于 LSTM 更適用于處理個(gè)股 / 指數(shù),因此,將 LSTM 作為擇時(shí)模型與其他選股模型配合使用效果較好。利用 LSTM 模型對(duì)滬深 300 數(shù)據(jù)進(jìn)行預(yù)測(cè)并將結(jié)果作為擇時(shí)信號(hào),可以顯著改善 stockranker 選股模型在回測(cè)階段的回撤。
展望:由于個(gè)股數(shù)據(jù)量較少,LSTM 模型的可擴(kuò)展程度和復(fù)雜度受到很大制約,features 的選擇也受到限制(若 input 的 features 太多,而 data 較少的話,會(huì)使一部分 features 不能發(fā)揮出應(yīng)有的作用,也極易造成過(guò)擬合)。將來(lái)我們希望能在個(gè)股 / 指數(shù)的小時(shí)或分鐘數(shù)據(jù)上測(cè)試 LSTM 的性能。另外,將探究 LSTM 模型能否將屬于一個(gè)行業(yè)的所有股票 data 一起處理也是一個(gè)可選的方向。
說(shuō)明:由于每次訓(xùn)練 LSTM 模型權(quán)重更新情況不同以及 Dropout 的隨機(jī)性,LSTM 模型的每次訓(xùn)練訓(xùn)練結(jié)果都會(huì)有差異。
附:
提示:由于 LSTM 涉及參數(shù)眾多,目前我們還不能保證 LSTM 模型的穩(wěn)定性, 本文所附回測(cè)結(jié)果均為多次訓(xùn)練模型后選取的較為理想的情況,目的是說(shuō)明 LSTM 是可以應(yīng)用于股票市場(chǎng)的以及將其作為擇時(shí)模型是可能的。本文所述以及提供的代碼僅供探究及討論,若要形成一個(gè)在股票市場(chǎng)比較實(shí)用的 LSTM 模型,還需要在 features 選擇、模型構(gòu)建、模型參數(shù)選擇以及調(diào)優(yōu)等方面花費(fèi)大量精力。
源代碼:
LSTM Networks 應(yīng)用于股票市場(chǎng)探究之 Sequential Model
LSTM Networks 應(yīng)用于股票市場(chǎng)探究之 Functional Model
【從零構(gòu)建一個(gè)區(qū)塊鏈應(yīng)用】課程開(kāi)課啦!
ThoughtWorks 頂級(jí)專家手把手教你實(shí)現(xiàn)區(qū)塊鏈應(yīng)用!
課程詳情:http://www.mooc.ai/course/78
加入AI慕課學(xué)院人工智能學(xué)習(xí)交流QQ群:624413030,與AI同行一起交流成長(zhǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。