裴大衛(wèi), 朱 明
(中國科學技術大學 信息科學技術學院 自動化系,合肥 230027)
隨著社會經(jīng)濟的高速發(fā)展,上市公司的數(shù)量越來越多,股票因而成為如今金融領域的熱點話題之一. 一方面,股票價格的走勢在一定程度上決定了諸多經(jīng)濟行為的走向,因此股票價格的預測也受到越來越多研究者的關注. 另一方面,互聯(lián)網(wǎng)的不斷發(fā)展為我們提供了海量的金融數(shù)據(jù),也就為機器學習算法的實現(xiàn)提供了可能,因此有越來越多的研究者開始嘗試使用機器學習對股票價格進行預測.
目前,針對股票價格預測常用的機器學習方法有:改進的梯度提升決策樹(Gradient Boosting Decision Tree,GBDT) XGBoost[1]、貝葉斯學習(Bayesian Learning,BL)[2]、卷積神經(jīng)網(wǎng)絡(Convolutional Neural Networks,CNN)[3],結合自編碼器(auto encoder)的長短期記憶網(wǎng)絡(Long Short Term Memory,LSTM)[4]等.然而文獻[1,2]中的策略使用的是傳統(tǒng)的機器學習方法,在大數(shù)據(jù)集下的性能相較深度學習較差; 文獻[3]的策略雖然使用了深度學習方法,但是一般的深度神經(jīng)網(wǎng)絡或者卷積神經(jīng)網(wǎng)絡實際上并不適合股票這類序列型數(shù)據(jù); 文獻[4]的策略使用了更適合序列數(shù)據(jù)的長短期記憶網(wǎng)絡,然而這類方法都只是將股票價格看做是一個簡單時間序列來進行預測,預測的準確度相對較低,同時在長期預測下模型的魯棒性較差. 因而越來越多的研究者希望能為股票價格這個簡單的時間序列添加更多的額外特征來提升預測水平.
實際上,一只股票本身并不只包含價格信息,還包含大量經(jīng)濟學的外圍信息,例如:資產(chǎn)收益率、換手率、流通股數(shù)、市盈率、市凈率等,這些信息在量化選股[5]策略中經(jīng)常會使用到,它們對股票本身的價格走勢有一定影響作用,因而這些諸多的外圍信息可以為股票價格預測模型提供一定的幫助.
本文從量化選股策略的角度出發(fā),將其中的多因子模型(multiple-factor model)作為股票的額外特征引入到股票價格預測中,建立了一個基于多變量的長短期記憶網(wǎng)絡(multi-variable LSTM)股票價格預測模型,用以提升只基于單一價格序列,也即單變量長短期記憶網(wǎng)絡(univariate LSTM)的股票價格預測模型的準確性以及魯棒性.
量化選股就是利用數(shù)量化的方法選擇股票組合,使得期望的股票組合能過獲得超越基準收益率的投資行為. 多因子模型是量化選股策略中一個十分常見而且十分有效的模型[5].
因子可認為是影響股票價格波動與價格走勢因素的數(shù)學表達,這種因素主要來源于金融經(jīng)濟規(guī)律以及市場經(jīng)驗[5].
經(jīng)濟學上最早提出的因子模型是資本資產(chǎn)定價模型(Capital Asset Pricing Model,CAPM)[6],CAPM認為對股票價格的影響因素主要是市場風險[7],現(xiàn)在金融領域常用Beta系數(shù)[8]來衡量,因此可以認為CAPM是一種單因子模型.
實際上影響股票價格僅僅依賴單一的市場風險是不夠的,CAPM模型暴露了諸多缺點,在此基礎上又產(chǎn)生了法馬-福萊奇三因子模型(Fama-French 3-factor Model,F(xiàn)F3)[9],F(xiàn)F3認為除了市場風險外,還存在市值風險[10]和賬面市值比風險[10],因此FF3可以看做是依賴市場風險、市值風險以及賬面市值比風險的三因子模型.
隨著經(jīng)濟學的不斷發(fā)展與市場經(jīng)濟的愈發(fā)復雜,F(xiàn)F3也不再能很好的解釋當前股票市場環(huán)境下的諸多現(xiàn)象[11]. 同時歸功于計算機技術的發(fā)展,計算能力的提升,可以嘗試用更多的因子來描述股票預測問題,因而產(chǎn)生了多因子模型.
多因子模型理論認為,影響股票價格的因素來自于以下三個層面:公司層面,市場表現(xiàn)層面,外部環(huán)境層面[5].
公司因子來自于公司的微觀結構,與公司的生產(chǎn)經(jīng)營息息相關,一般表現(xiàn)為公司的財務指標,反映了公司的盈利、運營、債務和成長狀況,也是量化選股中最重要的一類因子[5],它們刻畫了一個公司在市場的表現(xiàn),例如:資產(chǎn)負債比、流通市值、賬面市值比、凈利率等.
市場表現(xiàn)因子來自于股票在交易過程中的價格和交易量,他們刻畫了風險、動量、資金流向等各種金融技術類指標,例如:風險系數(shù)、動態(tài)市盈率、換手率等.
外部環(huán)境層面因子來自于政治法律、宏觀經(jīng)濟、社會習俗和技術發(fā)展等外部環(huán)境,它們刻畫了一個行業(yè)的當前以及未來發(fā)展的趨勢,在長期預測中十分重要,例如:宏觀經(jīng)濟變量,市場預期變化方向等.
由于考慮了諸多股票外圍因素,使得多因子模型相對比較穩(wěn)定,因為在不同市場下,總會有一些因子發(fā)揮作用[11]. 簡單起見可以將多因子模型描述為一個線性回歸問題:
其中,Pstock為股票價格,N為因子的數(shù)量,F(xiàn)i為第i個因子,wi為第i個因子的權值,ε為偏置,可以認為股票價格是受多個因子影響的,是多個因子的線性組合.
基于多因子模型的啟發(fā),本文認為多因子可以在一定程度上刻畫股票的特征,因此本文對多只股票計算了多因子模型中若干典型因子,將其作為后續(xù)長短期記憶網(wǎng)絡的輸入特征來進行股票價格的預測.
長短期記憶網(wǎng)絡是循環(huán)神經(jīng)網(wǎng)絡(Recurrent Neural Network,RNN)[13]的一種變體形式. 傳統(tǒng)的RNN隨著輸入序列的長度變長,會導致網(wǎng)絡的層數(shù)大大增加,進而帶來梯度消失(vanishing gradient)問題[14].
LSTM的提出解決了傳統(tǒng)循環(huán)神經(jīng)網(wǎng)絡在學習過程中由于輸入序列過長帶來的梯度消失問題. 圖1為LSTM的展開形式,LSTM在RNN的基礎上設計了新的神經(jīng)單元結構. LSTM記憶的歷史信息保留在細胞狀態(tài)(cell state)中,其受輸入門(input gate)、遺忘門(forget gate)、輸出門(forget gate)的控制,三個門的激活函數(shù)均為Sigmoid.
圖1 LSTM展開形式
輸入門用來控制當前時刻神經(jīng)單元的輸入信息,遺忘門用來控制上一時刻神經(jīng)單元中存儲的歷史信息,輸出門用來控制當前時刻神經(jīng)單元的輸出信息. 設圖2為t時刻LSTM神經(jīng)單元的狀態(tài),其中Xt為當前時刻的輸入,Ht-1為上一個時刻的輸入,Ct-1為上一個時刻的細胞狀態(tài),則LSTM單元的更新計算方法為:
其中,Wf、Wi、WC、Wo分別為遺忘門、輸入門、更新門和輸出門的權值矩陣,bf、bi、bC、bo分別為遺忘門、輸入門、更新門和輸出門的偏置(bias),最終計算得到當前時刻的輸出Ht與當前時刻更新的細胞狀態(tài)Ct.
對于一般的長短期記憶網(wǎng)絡而言,輸入往往是一個單獨的股票價格序列,記為:
其中,T為序列的長度,將序列數(shù)據(jù)輸入網(wǎng)絡的時候并非一次只輸入一個時刻,而是會輸入前序多個時刻的數(shù)據(jù). 例如要預測t時刻的股票價格,則當前時刻的輸入為:
即t時刻之前的W個時刻的數(shù)據(jù),可以稱W為序列觀測窗口的長度,觀測窗口的大小也決定了輸入層的神經(jīng)元數(shù)量; 隱藏層的神經(jīng)元數(shù)量是一個超參數(shù)(hyperparameter),需要在實驗中根據(jù)效果決定; 輸出層的神經(jīng)元數(shù)量為1表示每次預測下一個新時刻的股票價格.
圖2展示了一般單變量LSTM的輸入層、隱藏層和輸出層隨時序的變化形式.
圖2 單變量LSTM輸入層、隱藏層、輸出層時序
在本文中場景下,網(wǎng)絡的輸入不再是一條單一的時間序列,設我們使用的因子數(shù)量為N,加之原始股票價格序列,則會有N+1條序列輸入網(wǎng)絡.
為了適應這樣的問題,本文對傳統(tǒng)的單變量LSTM的輸入層與隱藏層進行了改變,單變量LSTM的輸入形式為式(9)所示的向量. 而對于多條輸入序列,本文使用矩陣形式進行輸入,即多變量LSTM的輸入形式. 設輸入的多條時間序列為:
其中,j表示因子序號,這里不妨令0號代表股票價格序列,后續(xù)1到N為多因子序列. 則對于t時刻的輸入可以表示為式(11)的矩陣形式:
該輸入矩陣的大小取決于使用的因子數(shù)N以及觀測窗口W的大小. 圖3展示了多變量LSTM的輸入層、隱藏層和輸出層的形式.
圖3 多變量LSTM輸入層、隱藏層、輸出層
在多變量LSTM中,某個因子序列不僅僅與自身的隱藏層存在映射關系,還與其余多個因子的隱藏層存在映射關系,使得整個網(wǎng)絡的映射更加豐富,因而能在一定程度上提升了模型的性能,但是相比單變量LSTM而言,網(wǎng)絡的結構更加復雜,要學習的參數(shù)激增,使得網(wǎng)絡訓練的時間有所延長.
在實際應用中通常需要預測未來的股票價格,在本文中即[T+1,L]區(qū)間的股票價格,現(xiàn)實中無法直接獲得未來的多因子信息,例如:預測 t=T+3時刻的股票價格,必然沒有t=T+1與t=T+2時刻的多因子信息.
為解決這樣的問題,本文進一步增加了輸出層的神經(jīng)元數(shù)量,使得模型不僅僅預測下一時刻的股票價格,還同時預測下一個時刻的多因子,也即輸出層神經(jīng)元數(shù)量由1變?yōu)镹+1,圖4展示了完整的融合模型形式.
圖4 改進后的多變量LSTM輸入層、隱藏層、輸出層
由于原始數(shù)據(jù)為多條股票價格及因子序列,需要將其轉換成類似式(11)的模型輸入形式. 根據(jù)式(10),對于股票數(shù)據(jù)集中第i只股票樣本有訓練數(shù)據(jù)S(i):
由于觀察窗口W的存在,每次輸入的數(shù)據(jù)長度不能少于W個,因此輸入數(shù)據(jù)的實際長度L=T-W,則在t時刻樣本i的輸入矩陣與該樣本對應的標簽有如下形式:
當預測時刻t∈[T+1,L]的股票價格時,如前述原因無法獲得[T+1,t-1]區(qū)間的多因子信息,因而將這一時間區(qū)間的模型輸出作為t時刻的因子輸入,即:
這樣就可以保證在預測過程中,窗口可以正確的向后滑動.
由于外部環(huán)境因子不容易量化與建模,本文中使用的因子主要來源于公司與市場表現(xiàn)兩個層面,包括:收益波動率(volatility rate)、風險流通市值加權(Beta1)、風險總市值加權(Beta2)、市盈率(price earning ratio)、市凈率(price/book value ratio)、市銷率(price-to-sales ratio)、換手率(turnover rate)、流通市值(circulated market value)、當日成交額(amount)、流動性指標(liquidity)這10個在量化選股策略中常用的因子[5].
本文選取了2014年滬深交易所所有上市A股中共830只有效股票作為數(shù)據(jù)集. 并對所有股票計算了對應因子作為模型的輸入數(shù)據(jù). 這里選取股票編號為600000的股票展示股票價格與幾個典型因子的走勢.圖5為600000股票在當年的價格走勢,圖6為其市盈率、流通市值、換手率以及流動性指標四個因子的當年走勢.
圖5 股票編號600000價格序列
5.2.1 股票數(shù)據(jù)預處理
由圖5的股票價格曲線可以觀察到,價格的微小波動十分頻繁,從量化選股的角度而言,股票價格短期小范圍的微小波動并不能作為判斷股票長期價格走勢高低的依據(jù)[15],因此為了讓訓練數(shù)據(jù)集有更好的泛化能力,本文對訓練集中所有輸入的價格序列進行了一階指數(shù)平滑(first order exponential smoothing)[16]處理.通過序列平滑可以在一定程度減少短期小范圍價格波動對數(shù)據(jù)集造成的影響.
圖7為股票編號為600000的股票價格平滑后的序列. 通過對比圖5可以觀察到,平滑后的股票價格序列減少了許多小范圍的價格波動,但也很好的保留了原始序列的價格趨勢,這樣有助于提升訓練數(shù)據(jù)集的泛化能力.
5.2.2 預測模型的搭建
本次實驗中的多變量長短期記憶網(wǎng)絡模型在Keras下進行搭建. Keras是一個基于Tensorflow以及Theano封裝的高級神經(jīng)網(wǎng)絡應用編程接口(deep learning application program interface),編程語言為Python.使用Keras的LSTM相關API就可以的搭建一個單變量的LSTM模型,本文在此基礎上,修改了模型輸入層接受訓練數(shù)據(jù)的結構進而實現(xiàn)了一個可以輸入多個序列的多變量LSTM模型.
5.2.3 實驗環(huán)境與參數(shù)設置
本文的實驗環(huán)境如表1所示. 本次實驗的模型損失函數(shù)為均方誤差(Mean Square Error,MSE),梯度下降的優(yōu)化器為Adam[17],模型迭代次數(shù)為200,隱藏層神經(jīng)元數(shù)量為16. 實驗中的觀測窗口W大小為3,也即每次預測只觀測前3天的股票數(shù)據(jù).
圖6 股票編號600000的四個典型因子走勢
圖7 股票編號600000價格平滑后走勢
5.2.4 模型評價標準
本次實驗使用的模型評價標準為回歸問題中典型的均方根誤差(Root Mean Square Error,RMSE)[18]. 這里可以對每一只股票分別計算其均方根誤差,則第i只股票樣本的預測均方根誤差為:
表1 實驗環(huán)境
其中,M為數(shù)據(jù)集的樣本總數(shù). 模型的RMSE越小說明模型的預測準確性越高.
5.3.1 模型的預測準確率
圖8展示了股票600000加入了多因子后的多變量LSTM模型的股票價格預測結果. 可以觀察到,對于驗證集中的新數(shù)據(jù),模型可以較好的預測出股票價格的變化. 該序列預測的訓練集與測試集的均方根誤差分別為:
圖9展示了股票600000在沒有多因子的一般單變量LSTM模型下的股票價格預測結果,該序列預測的訓練集與測試集的均方根誤差分別為:
可以看到加入多因子的多變量LSTM相較于一般單變量LSTM在驗證集上有11.39%的性能提升.
為了更好的對比二者預測結果的差別,圖10僅顯示圖8和圖9在驗證集上的預測結果.
通過圖10中的預測曲線對比可以發(fā)現(xiàn),在多因子的條件下,預測曲線不僅擬合了整體價格曲線的變化趨勢,同時也很好的擬合了曲線的一些短期波動,這就是多因子所帶來的價值; 而在一般單變量的條件下,預測曲線雖然也很好的擬合了價格曲線的變化趨勢,但是在很多細節(jié)之處卻沒有很好的擬合曲線的價格波動.
圖9 股票編號600000的單變量LSTM價格預測結果
圖10 股票編號600000驗證集預測結果對比
圖11在此額外展示了數(shù)據(jù)集中其他多只股票的驗證集預測結果.
最終使用單變量LSTM與多變量LSTM分別對全部830只股票進行預測,并分別計算在整個數(shù)據(jù)集上的平均RMSE:
在整個數(shù)據(jù)集上加入多因子的多變量LSTM相較于一般單變量LSTM有10.12%的性能提升.
5.3.2 模型的魯棒性
前文提到,本次實驗的觀測窗口W的大小為3,也即每次預測只觀測前3天的股票數(shù)據(jù). 實際上觀察窗口的大小是一個對模型預測性能影響較大的模型超參數(shù).
一般而言,觀測窗口越小預測曲線擬合的越緊湊,也即反映曲線的短期特性,更能體現(xiàn)曲線的波動; 觀測窗口越大預測曲線擬合的越松散,也即反映曲線的長期特性,更能體現(xiàn)曲線的趨勢. 因而根據(jù)RMSE的計算方式,則觀測窗口越小,RMSE就越小; 觀測窗口越大,RMSE就越大. 這也就意味著如果觀測窗口的變化對RMSE的值有很大影響,那么就會進而對模型的評估造成干擾.
圖11 額外幾只股票驗證集預測結果
圖12展示了RMSE隨觀測窗口W的變化曲線.隨著觀測窗口變大,無論是多變量LSTM還是單變量LSTM均受其影響導致RMSE增加. 但是在多因子的條件下,可以明顯會發(fā)現(xiàn)RMSE受觀測窗口的影響更加微弱,因而無論觀測窗口如何變化,多變量LSTM預測模型更加穩(wěn)定,這也是得益于多因子的引入,更多豐富的股票外圍特征為模型帶來了更好的魯棒性.
本文將量化選股策略中的多因子模型概念引入到股票價格預測中,為一般基于單序列的單變量LSTM價格預測模型加入了更多經(jīng)濟學外圍特征,不再僅僅將股票價格看做為一個簡單的數(shù)學概念上的時間序列.在此之上構造了一個基于多因子的多變量LSTM股票價格預測模型,在一定程度上提升了股票價格預測的準確性與模型的魯棒性.
圖12 驗證集RMSE隨觀測窗口W的變化趨勢
在本文中用于參與訓練的股票因子是較為常用的典型的量化選股因素,但是典型并不意味著適用于所有場景,實際上因子的數(shù)量是非常龐大的,在初期可以嘗試通過某些方法對大量的因子進行篩選,遴選出更為適合當前場景的因子,可以進一步提升模型的預測性能. 此外多變量的LSTM網(wǎng)絡的訓練時間相對較長,在后續(xù)可以嘗試對模型的計算復雜度進行優(yōu)化.