張康林,葉春明,李釗慧,王錦文
(1.上海理工大學 管理學院,上海 200093;2.南昌大學 公共管理學院,江西 南昌 330000)
股票市場發(fā)展至今已有400多年歷史,股票投資者隨著金融市場發(fā)展的越來越成熟也變得越來越多,而股價的預(yù)測一直都是股票投資者關(guān)注的問題。文獻[1]說明了由于股票價格具有高噪聲、動態(tài)、非線性和非參數(shù)等特性,想要準確預(yù)測股價仍具有很大的挑戰(zhàn)。但隨著大數(shù)據(jù)時代的到來和人工智能技術(shù)的發(fā)展,準確預(yù)測股票價格已經(jīng)慢慢變?yōu)榱丝赡堋?/p>
目前,越來越多的學者采用人工智能技術(shù)來實現(xiàn)股價的預(yù)測,從傳統(tǒng)的人工神經(jīng)網(wǎng)絡(luò)模型到深度學習模型,再到現(xiàn)在的多種模型相互結(jié)合進行預(yù)測,這些技術(shù)一直都在被改進并且被廣泛使用。許興軍[2]使用反向傳播神經(jīng)網(wǎng)絡(luò)(backward-propagation network,BPN)模型對浦發(fā)銀行近一年交易日的股票數(shù)據(jù)進行了預(yù)測;韓山杰等人[3]采用多層感知機(multi-layer perceptron,MLP)模型預(yù)測了蘋果公司每日的股票收盤價;Ticknor等人[4]將日市場價格和財務(wù)指標作為輸入,利用前饋神經(jīng)網(wǎng)絡(luò)模型對微軟公司和高盛集團未來一天的收盤價進行了預(yù)測。但是由于人工神經(jīng)網(wǎng)絡(luò)在對股價進行預(yù)測時,存在很多問題,比如:模型優(yōu)化過程中,存在梯度消失和梯度爆炸問題,導致模型無法優(yōu)化;容易出現(xiàn)局部極值問題;過擬合現(xiàn)象的發(fā)生導致模型在對測試集進行預(yù)測時,其預(yù)測精度變小。為了解決上述問題,針對深度學習的研究也是越來越多。Graves等人[5]說明了LSTM模型可以解決梯度消失和梯度爆炸問題,Polson等人[6]探討了深度學習技術(shù)在金融市場研究中不僅可以解決過擬合問題,還能提高樣本的擬合程度。同時,國內(nèi)外學者也利用深度學習技術(shù)對股價預(yù)測進行研究。Hoseinzade等人[7]提出了一個基于CNN的框架,并對標普500指數(shù)、納斯達克指數(shù)、道瓊斯指數(shù)、紐約證交所指數(shù)和羅素指數(shù)次日的走勢進行了預(yù)測,結(jié)果表明,預(yù)測性能比基線算法更高;Zahra等人[8]通過遞歸神經(jīng)網(wǎng)絡(luò)(RNN)對卡薩布蘭卡證券交易所29天的maroc股票價格進行預(yù)測;宋剛等人[9]使用基于自適應(yīng)粒子群優(yōu)化的LSTM模型分別對滬市、深市、港股股票數(shù)據(jù)進行了股價預(yù)測,具有更高適用性。
通過上述分析,少有研究將聚類算法和深度學習技術(shù)進行結(jié)合來應(yīng)用于金融預(yù)測,相關(guān)研究如文獻[10],并且大多數(shù)研究使用的是Tensorflow深度學習框架進行建模分析。因此,該文使用SOM算法對187只不同業(yè)績的股票進行聚類和基于Pytorch的LSTM模型對三類中的共9只股票進行股價預(yù)測,主要貢獻有:(1)使用Pytorch深度學習框架進行深度學習模型的構(gòu)建,相對于被廣泛使用的Tensorflow,Pytorch更加簡潔直觀;(2)使用了同一LSTM神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)對9只股票進行股價預(yù)測,證明了LSTM神經(jīng)網(wǎng)絡(luò)在股價預(yù)測上有著很好的泛化能力;(3)針對不同業(yè)績的股票進行分類預(yù)測,證明了LSTM模型對業(yè)績優(yōu)良的股票預(yù)測精度更高。
1981年,自組織映射(self-organizing map,SOM)神經(jīng)網(wǎng)絡(luò)由芬蘭學者Kohonen[11]提出,該聚類算法由于可以實現(xiàn)自學習,網(wǎng)絡(luò)具有自穩(wěn)定性,無須外界給出評價函數(shù),能夠識別向量空間中最有意義的特征,抗噪音能力強等優(yōu)點。文獻[12-14]證明了SOM算法在各個領(lǐng)域應(yīng)用廣泛。
(1)初始化輸入數(shù)據(jù)Xi,j,i=1,2,…,n,j=1,2,…,m。
(2)初始化參數(shù)。模型需要初始化學習率η(0<η<1),最小學習率ηmin,輸入神經(jīng)元數(shù)m,輸出神經(jīng)元數(shù)P=Pr*Pc,鄰域值R,鄰域值的縮小率a(a<1),學習率的縮小率λ(λ<1),最初迭代次數(shù)Iteration=0,最大迭代次數(shù)Max_iteration,時間k=0。
(3)初始化權(quán)重Wp,q,j(中心點Cp,q),隨機生成[0,1)之間的數(shù),p=1,2,…,Pr,q=1,2,…,Pc,j=1,2,…,m。
(4)最初迭代次數(shù)加1,并且設(shè)置目前的數(shù)據(jù)位置a=0。
(5)將數(shù)據(jù)下標o加1,數(shù)據(jù)位置a加1:
o=o+1
(1)
a=a+1
(2)
(6)設(shè)置當前來自于Xi,j數(shù)據(jù)Xo,Xo=[xa,1,xa,2,…,xa,m]。
(7)計算當前數(shù)據(jù)Xo與每個中心點的距離:
(3)
(8)通過步驟(7)的最小距離來確定獲勝中心點(WC);
(9)依次修改所有權(quán)重坐標(即中心點坐標):
(a)在拓撲圖(見圖1)中計算當前中心點與獲勝中心點的距離:
disCC,WC=dic(Cp,q,WC)=
(4)
(b)修改權(quán)重坐標:
(5)
(c)重復(fù)步驟(a)與(b),直到所有中心點坐標被修改。
圖1 拓撲圖
(10)判斷中心是否被所有數(shù)據(jù)修改:
(a)如果a=n,則跳到第(11)步;
(b)如果a≠n,則返回第(5)步。
(11)修改鄰域值和學習率:
R=R*a
(6)
η=η*λ
(7)
(12)判斷學習率:若η<ηmin,則令η=ηmin。
(13)停止標準:
(a)如果Iteration=Max_iteration,則跳到第(14)步;
(b)如果Iteration≠Max_iteration,則返回第(4)步。
(14)將數(shù)據(jù)分配到距離最小的中心點,再計算每個中心點的數(shù)據(jù)數(shù)。
(15)根據(jù)拓撲圖矩陣確定每一類中包含數(shù)據(jù)的數(shù)量。
為了進一步探討不同類別的股票在對其收盤價格進行預(yù)測時,其預(yù)測精度是否也會有所不同,在計算出分布矩陣和最佳中心點的坐標后,再一一計算每一個點和中心點的歐氏距離,見式(8)。通過分布矩陣,找出距離中心點最近的n個點,即可找到每一類中所含的股票代碼。
(8)
該文所做的SOM分析所需要的數(shù)據(jù)均來自于證券寶平臺,該平臺可以通過python API獲取股票年報數(shù)據(jù)。分析中選取了滬市股票(600000-600100)、深市股票(000001-000100)與創(chuàng)業(yè)板股票(300001-300100)總共187家上市公司2018年的銷售凈利潤率、凈資產(chǎn)收益率、銷售毛利率、凈利潤和每股收益5項能充分反映上市公司綜合盈利能力的指標作為主要研究對象。
為了避免指標單位對結(jié)果的影響,需先將原始數(shù)據(jù)進行歸一化處理,歸一化公式如下:
(9)
該文在系統(tǒng)WIN10、1TB+128G(SSD)的硬盤、INTEL酷睿I7-6700Q的CPU和內(nèi)存4 GB的PC機上使用python3.7實現(xiàn)SOM算法,輸入神經(jīng)元數(shù)為5。由于該文將187只股票分為了虧損股、盈利股和小幅虧損或小幅盈利股三類,所以輸出神經(jīng)元數(shù)P=Pr*Pc=1*3,鄰域值為4,學習率為0.1,最小學習率為0.001,鄰域值的縮小率為0.99,學習率的縮小率為0.99。迭代次數(shù)經(jīng)過多次調(diào)整發(fā)現(xiàn),當Max_itreation大于等于200時,最終的聚類結(jié)果不變,所以將Max_itreation設(shè)為200,減少程序運行時間。
經(jīng)過多次對程序的運行,可以求出其中有71只股票以點[0.916 956 54 0.955 327 9 0.623 186 590.077 145 72 0.540 198 69]為中心聚為第一類,有96只股票以點[0.906 286 24 0.948 758 48 0.390 331 97 0.047 142 88 0.520 635 68]為中心聚為第二類,有20只股票以點[0.499 768 73 0.800 670 52 0.380 143 94 0.023 035 95 0.243 620 15]為中心聚為第三類,通過SOM算法的改進原理,進一步優(yōu)化python實現(xiàn)的SOM代碼,將每一個類別中所含的股票一一求出。
為了比較每一類的股票盈利能力大小,表1將三類中部分股票的盈利能力指標列出。
表1 每一類部分股票的盈利能力
其中,code代表股票代碼,roeavg代表凈資產(chǎn)收益率(平均)(%),npMargin代表銷售凈利率(%),gpMargin代表銷售毛利率(%),netProfit代表凈利潤(元),epsTTM代表每股收益。
該文選取的五項指標是衡量公司獲利能力和成長性最好的指標,即能通過這五項指標說明該類上市公司在技術(shù)水平、經(jīng)營規(guī)模、經(jīng)營實力等方面具有很大優(yōu)勢,經(jīng)營業(yè)績優(yōu)良,競爭能力比較強,綜合財務(wù)狀況較佳,頗具發(fā)展?jié)摿烷L期投資價值,即通過這五項指標的大小可以判斷該公司的綜合盈利能力大小。所以結(jié)合表1可以看出,綜合盈利能力的大小排序:第一類>第二類>第三類。計算出不同類別所包含的股票后,將進一步對不同類別的股票使用LSTM模型進行預(yù)測。
Pytorch是Facebook在2017年開源的一款深度學習框架,它是源于torch更新后的一種新產(chǎn)品,同時也是一個原生的python包,它與python是無縫集成的,而且還特意使用了命令式編碼風格。Pytorch由于具有動態(tài)計算圖表、精簡的后端與高度可擴展等優(yōu)勢,目前得到了廣泛的應(yīng)用。Pytorch在已經(jīng)在聊天機器人、機器翻譯、文本搜索、文本到語音轉(zhuǎn)換和圖像與視頻分類等項目中取得了巨大成功。
該文是在系統(tǒng)WIN10、1TB+128G(SSD)的硬盤、INTEL酷睿I7-6700Q的CPU和內(nèi)存4 GB的PC機上通過python3.7版本和anaconda5.3.1版本來使用Pytorch構(gòu)造LSTM深度學習模型。Anaconda是一個開源的python包管理器,包含了python、conda等180多個科學包及其依賴項。它支持Windows、Linux和Mac三種系統(tǒng),由于它提供了包管理與環(huán)境管理的功能,所以能很方便地解決多版本python切換、并存以及下載安裝各種第三方包等問題。然后打開其中的jupyter notebooks應(yīng)用程序,直接在谷歌網(wǎng)頁頁面中編寫、運行和調(diào)試代碼。
長短期記憶神經(jīng)網(wǎng)絡(luò)(long-short term memory,LSTM)在1997年由Hochreiter等人[15]提出。它是循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neural network,RNN)的一種變體,能夠更好地解決傳統(tǒng)RNN在處理大型時間序列時存在的梯度消失和梯度爆炸等問題。由于深度學習框架發(fā)展得越來越成熟,再加上LSTM能夠更好地處理序列化數(shù)據(jù),所以LSTM神經(jīng)網(wǎng)絡(luò)目前得到了廣泛的應(yīng)用,相關(guān)研究如文獻[16-17]說明了LSTM算法在時間序列預(yù)測、視覺識別、分類等都取得了重大成功。
LSTM的網(wǎng)絡(luò)結(jié)構(gòu)由三個門控和一個記憶細胞組成。記憶細胞能將歷史記憶信息進行保留。下面是三個門控的計算原理。
第一步,遺忘門能決定從單元信息狀態(tài)中去丟棄哪些信息,采用sigmoid作為激活函數(shù),它能為單元狀態(tài)中的每個元素輸出0到1之間的數(shù)值,公式表示如下:
ft=σ(Wf*[ht-1,Xt]+bf)
(10)
第二步,確定要添加到單元狀態(tài)的信息。這里包括兩個部分:一個是采用sigmoid作為激活函數(shù)的輸入門,它決定要更新的值;另一個是tanh層,它創(chuàng)建要添加到單元狀態(tài)的新值。公式表示如下:
it=σ(Wi*[ht-1,Xi]+bi)
(11)
Ct=tanh(WC′*[ht-1,Xt]+bC′)
(12)
(13)
第四步,決定輸出門的值,公式表示如下:
Ot=σ(Wo*[ht-1,Xt]+bo)
(14)
(15)
式(10)~式(15)中,σ表示sigmoid激活函數(shù),Wf表示遺忘門的權(quán)重矩陣,Wi表示輸入門的權(quán)重矩陣,Wc表示更新門的權(quán)重矩陣,Wo表示輸出門的權(quán)重矩陣,bf表示遺忘門的偏置,bi表示輸入門的偏置,bc表示更新門的偏置,bo表示輸出門的偏置,ht表示t時刻的輸出,Ct表示t時刻更新的細胞狀態(tài)。
預(yù)測流程包括:下載數(shù)據(jù)、數(shù)據(jù)處理、數(shù)據(jù)歸一化、LSTM模型的訓練、微調(diào)參數(shù)和收盤價格預(yù)測。
下載數(shù)據(jù):每一類中隨機挑選3只股票,下載每一只實驗股票2018年的收盤價格,通過證券寶平臺的python API接口,編寫python程序進行下載和儲存。
數(shù)據(jù)處理:將存儲的原始數(shù)據(jù)打開,刪除股票代碼一列,并且刪除缺失值的每一行,進一步構(gòu)建完整有效的數(shù)據(jù)集,便于數(shù)據(jù)分析。
數(shù)據(jù)歸一化:為了使模型更加容易正確的收斂,將收盤價格進行了歸一化處理。
LSTM模型的訓練:上文已將187只股票分成了3類,并且也已知每一類別中所含的股票代碼,所以接下來將使用LSTM模型對每一個類別中的股票隨機進行預(yù)測,觀察每一類別的預(yù)測精度。該文想通過前面2天的股價來預(yù)測當天的收盤價,所以將前兩天的股價當作輸入,當天的股價當作輸出,最后再基于Looney[18]的研究,將每只實驗股票收集到的65%數(shù)據(jù)作為訓練數(shù)據(jù)集,35%數(shù)據(jù)作為測試數(shù)據(jù)集。
微調(diào)參數(shù):在模型的訓練過程中,需要不斷調(diào)整學習率、LSTM層數(shù)和隱藏層神經(jīng)元數(shù),直到模型的預(yù)測效果最佳。
價格預(yù)測:將測試數(shù)據(jù)集導入訓練好的模型進行價格預(yù)測。
實驗流程如圖2所示。
圖2 股價預(yù)測實驗流程
選取均方誤差(MSE)和決定系數(shù)(R2)作為評價指標對模型預(yù)測結(jié)果進行定量評價。其中MSE數(shù)值越小,模型預(yù)測結(jié)果與真實值偏差越小,結(jié)果也就越準確;決定系數(shù)R2越接近數(shù)值1,說明擬合優(yōu)度越大,模型預(yù)測效果也就越好。具體公式如下:
(16)
(17)
其中,N代表數(shù)據(jù)集中數(shù)據(jù)的個數(shù),yp代表模型預(yù)測值,yn代表實際值,yave代表實際值的平均值。
LSTM模型結(jié)構(gòu)由輸入層、輸出層、兩層LSTM層組成,其中輸入層單元數(shù)為2,在權(quán)衡了模型的預(yù)測準確度后,將1-3類的隱藏層單元數(shù)都設(shè)置為4,輸出層單元數(shù)為1,迭代次數(shù)為1 000,學習率為0.01,損失函數(shù)采用均方誤差MSE,模型訓練過程采用的優(yōu)化算法為Adam算法,模型的搭建在Pytorch深度學習框架下實現(xiàn)。
每一類中隨機抽取3只股票的預(yù)測結(jié)果,如圖3~圖5所示,每一張圖的縱坐標代表股價做歸一化處理后的值,橫坐標代表時間第x天。兩條曲線分別代表LSTM模型預(yù)測值和股價真實值,可以看出LSTM模型的預(yù)測曲線都很接近于股價的真實曲線。
圖3 第一類中的sz.300059、sz.300003、sh.600033股票預(yù)測結(jié)果
圖4 第二類中的sz.300044、sh.600082、sz.300014股票預(yù)測結(jié)果
圖5 第三類中的sz.300083、sz.300063、sz.300069股票預(yù)測結(jié)果
為進一步驗證模型預(yù)測不同盈利能力的股票的預(yù)測性能,表2給出了三類中各3只股票的評價標準計算結(jié)果。第一類的平均均方誤差為0.003 40,第二類的平均均方誤差為0.006 21,第三類的平均均方誤差為0.008 71,所以第一類預(yù)測誤差小于第二類,第二類的預(yù)測誤差小于第三類,說明相同的LSTM模型預(yù)測第一類股票的股價結(jié)果最準確。同時,在決定系數(shù)R2評價標準中,第一類的R2平均值為0.931 18,第二類的R2平均值為0.899 17,第三類R2平均值為0.860 01,所以同樣的LSTM模型在預(yù)測不同類的股票價格時,第一類的決定系數(shù)更接近1,其次是第二類,說明LSTM模型在對第一類進行預(yù)測時,模型擬合優(yōu)度最大,預(yù)測效果最好,其次是第二類。綜合以上分析,可以得出:使用相同的LSTM模型預(yù)測不同盈利能力的股票價格時,盈利能力越強的股票,模型對其股票價格預(yù)測結(jié)果越準確。
表2 評價標準結(jié)果
股票價格的預(yù)測是一個非常復(fù)雜的過程,因為股票市場的預(yù)測過程基本上是動態(tài)的、非線性的、復(fù)雜的。因此,通過證券寶平臺下載187只股票數(shù)據(jù),提出一種基于自組織特征映射(SOM)神經(jīng)網(wǎng)絡(luò)和長短期記憶網(wǎng)絡(luò)(LSTM)相結(jié)合的股價預(yù)測方法。首先使用python實現(xiàn)Kohonen提出的SOM算法,然后通過加入計算每一只股票與最終中心點的距離的改進,將187只股票聚成3類,并且得出三類中每一類所含股票,再基于Pytorch深度學習框架構(gòu)建LSTM模型,分別對三類中隨機選取的3只股票進行股價預(yù)測。實驗結(jié)果表明:在使用相同網(wǎng)絡(luò)結(jié)構(gòu)的LSTM模型對不同盈利能力的股票價格進行預(yù)測時,模型對盈利能力較大的股票價格預(yù)測有更高的預(yù)測精度。
該文對股價的預(yù)測方法,能通過聚類幫助股票投資者篩選出擁有更大盈利能力的股票,從而進一步提高預(yù)測精度。此方法在未來金融時間序列研究中擁有廣泛的應(yīng)用前景,不僅能為投資者提供一定的參考信息,也能為后續(xù)的研究者提供相應(yīng)的參考。