美國華盛頓大學(xué)西雅圖校區(qū) 李 超
股票市場(chǎng)是國度經(jīng)濟(jì)的主要表現(xiàn),股價(jià)的走勢(shì)是股票投資者存眷的核心問題。由于股票價(jià)格固有的噪聲環(huán)境和相對(duì)市場(chǎng)趨勢(shì)的較大波動(dòng)性,股價(jià)的擬合和預(yù)測(cè)是一個(gè)具有挑戰(zhàn)性的問題。本文使用了隨機(jī)森林、GBDT算法、神經(jīng)網(wǎng)絡(luò)、SVM等模型對(duì)股票價(jià)格時(shí)間序列進(jìn)行了擬合。通過對(duì)上證A股貴州茅臺(tái)(600519)數(shù)據(jù)的預(yù)處理、擬合、驗(yàn)證、調(diào)參全流程的分析,獲得并展示了最終模型的效果。實(shí)驗(yàn)結(jié)果表明,使用梯度提升隨機(jī)樹(GBDT),股價(jià)擬合結(jié)果的預(yù)測(cè)誤差最小。相對(duì)于隨機(jī)森林和神經(jīng)網(wǎng)絡(luò)模型,GBDT算法在本文的股價(jià)預(yù)測(cè)任務(wù)中表現(xiàn)得更加穩(wěn)定可靠。
近幾年經(jīng)濟(jì)的飛速發(fā)展,追求上市的公司愈發(fā)增多,股票逐漸走進(jìn)越來越多人的視線。股票這個(gè)紐帶在股民、股東和交易所之間也愈發(fā)緊密。因?yàn)楣善笔袌?chǎng)的波動(dòng)十分巨大,隨時(shí)可能因?yàn)橐恍┬碌恼呋蛘咂渌?,進(jìn)行大幅度的波動(dòng),導(dǎo)致自然人股民很難對(duì)股票進(jìn)行投資盈利;并且,股票價(jià)格具有高噪聲、非線性,易受政策影響等特點(diǎn),因此投資者很難就近規(guī)避風(fēng)險(xiǎn)。通過眾多的網(wǎng)絡(luò)數(shù)據(jù)接口,研究者可以進(jìn)行數(shù)據(jù)分析,再利用機(jī)器的深度學(xué)習(xí)來對(duì)股票價(jià)格進(jìn)行預(yù)測(cè)。
在目前市場(chǎng)環(huán)境下,散戶投資過程中最大的問題是信息不對(duì)稱,要獲取真實(shí)信息則需要付出成本,使得散戶往往依賴于無成本的“小道消息”而非科學(xué)的技術(shù)分析。形態(tài)分析認(rèn)為一切能夠影響股價(jià)的因素——經(jīng)濟(jì)的、政策的、心理的等最終都反映到K線圖上。股票價(jià)格預(yù)測(cè)正是基于K線圖幫助散戶在缺乏透明度的市場(chǎng)中低成本地、科學(xué)地獲取有效信息。股票價(jià)格預(yù)測(cè)每天對(duì)每只股票的未來趨勢(shì)(超短線、中短期)做出預(yù)測(cè),預(yù)測(cè)的內(nèi)容包括股票未來的上漲概率、上漲幅度、下跌概率、下跌幅度、中短期走勢(shì),行業(yè)的上漲和下跌趨勢(shì),用戶可以通過每日提供的大量預(yù)測(cè)數(shù)據(jù)發(fā)現(xiàn)存在上漲可能的股票和行業(yè)。當(dāng)然,股票預(yù)測(cè)的結(jié)果的準(zhǔn)確性取決于對(duì)模型的選擇,本文便是對(duì)幾種常見的方法進(jìn)行一個(gè)對(duì)比,來供讀者參考。
傳統(tǒng)機(jī)器學(xué)習(xí)是基于樣本出發(fā),嘗試發(fā)掘那些不能利用原理解釋分析的規(guī)律,以此實(shí)現(xiàn)對(duì)未來數(shù)據(jù)趨勢(shì)的準(zhǔn)確預(yù)測(cè)。相關(guān)的算法有:邏輯回歸、支持向量機(jī)方法、決策樹方法等。傳統(tǒng)的機(jī)器學(xué)習(xí)方法為機(jī)器學(xué)習(xí)結(jié)果的有效性與學(xué)習(xí)模型的可解釋性找到了一個(gè)平衡點(diǎn),為解決有限樣本的學(xué)習(xí)問題提供了一種框架,主要用于有限樣本情況下的模式分類、回歸分析、概率密度估計(jì)等。傳統(tǒng)機(jī)器學(xué)習(xí)方法共同的重要理論基礎(chǔ)之一是統(tǒng)計(jì)學(xué),在自然語言處理、語音識(shí)別、圖像識(shí)別、信息檢索和生物信息等許多計(jì)算機(jī)領(lǐng)域獲得了廣泛應(yīng)用。
深度學(xué)習(xí)又稱為深度神經(jīng)網(wǎng)絡(luò)。深度學(xué)習(xí)源于多層神經(jīng)網(wǎng)絡(luò),其實(shí)質(zhì)是給出了一種將特征表示和學(xué)習(xí)合二為一的方式。深度學(xué)習(xí)的特點(diǎn)是放棄了可解釋性,單純追求學(xué)習(xí)的有效性。經(jīng)過多年的摸索嘗試和研究,已經(jīng)產(chǎn)生了諸多深度神經(jīng)網(wǎng)絡(luò)的模型,其中卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)是兩類典型的模型。深度學(xué)習(xí)框架是進(jìn)行深度學(xué)習(xí)的基礎(chǔ)底層框架,一般包含主流的神經(jīng)網(wǎng)絡(luò)算法模型,提供穩(wěn)定的深度學(xué)習(xí)API,支持訓(xùn)練模型在服務(wù)器和GPU、TPU 間的分布式學(xué)習(xí),部分框架還具備在包括移動(dòng)設(shè)備、云平臺(tái)在內(nèi)的多種平臺(tái)上運(yùn)行的移植能力,從而為深度學(xué)習(xí)算法帶來前所未有的運(yùn)行速度和實(shí)用性。
目前,針對(duì)股票價(jià)格預(yù)測(cè)常用的機(jī)器學(xué)習(xí)方法有以下幾種:隨機(jī)森林模型(Random Forest)、長短期記憶模型(Long-short term memory)、RNN模型、GBDT模型等。雖然有諸多的模型算法,但是實(shí)際上一只股票不僅僅是呈現(xiàn)在價(jià)格方面,還有很多的外圍信息,例如:換手率、收益率、市盈率、市凈率等。這些信息會(huì)在選股策略中經(jīng)常使用到,因?yàn)樗鼈儽旧砭蜁?huì)對(duì)股價(jià)的走勢(shì)產(chǎn)生一定的影響,是不可被忽視的。本文主要是先對(duì)數(shù)據(jù)進(jìn)行簡單分析和預(yù)處理,然后通過機(jī)器學(xué)習(xí)模型(尤其是預(yù)測(cè)相關(guān)的模型)構(gòu)建和參數(shù)的調(diào)整,最終將數(shù)據(jù)可視化,并且將本文使用到的模型進(jìn)行比較,最終進(jìn)行評(píng)價(jià)。本文從數(shù)據(jù)庫中隨即提取某個(gè)品牌的股價(jià)走勢(shì)數(shù)據(jù)進(jìn)行分析。在引用到具體算法之前,我們先開始一個(gè)簡單的數(shù)據(jù)分析,例如移動(dòng)平均值。通過不斷引入新的平均價(jià)格來降低價(jià)格表中的“噪音”,同時(shí)表示該平均價(jià)格的平均線可能充當(dāng)“阻力”,代表著股市的漲和跌,進(jìn)而從中預(yù)期未來趨勢(shì)。對(duì)于單只股票,我們可以先進(jìn)行一些簡單分析,例如移動(dòng)平均值滾動(dòng)平均/移動(dòng)平均(MA)通過不斷更新平均價(jià)格來平滑價(jià)格數(shù)據(jù),有助于降低價(jià)格表中的“噪音”。此外,該移動(dòng)平均線可能充當(dāng)“阻力”,代表股票的下跌和上升趨勢(shì),你可以從中預(yù)期它的未來趨勢(shì),不太可能偏離阻力點(diǎn)。首先通過Matplotlib來對(duì)茅臺(tái)這只股票進(jìn)行簡單分析。計(jì)算收盤價(jià)100天以內(nèi)的移動(dòng)平均值,并取每個(gè)滑窗的移動(dòng)平均值。如圖1所示。
圖1 茅臺(tái)股份(600519)在2020年5月20日-2021年2月22日期間的價(jià)格走勢(shì)圖
圖2 茅臺(tái)股份(600519)在2020年5月20日-2021年2月22日期間的收益率走勢(shì)圖
圖3(a) 茅臺(tái)股份(600519)與五糧液(000858)股價(jià)關(guān)系走勢(shì)圖
此外,除了參考平均值,收益率也是考慮一只股票的重要影響因素,如圖2所示。
從邏輯上講,我們理想的股票收益應(yīng)該是盡可能的高且穩(wěn)定,但是通過上圖反映的情況來說,如果作為一個(gè)風(fēng)險(xiǎn)規(guī)避者,那就應(yīng)該避開這類股票。因?yàn)樵谶@只股票的收益率在某一時(shí)間段下跌了將近10個(gè)百分點(diǎn)。同時(shí),我們也可以調(diào)用多只類似股票來研究酒水行業(yè)的股價(jià)之間的關(guān)系。如圖3(a)所示。
我們可以看到,五糧液和茅臺(tái)的收益之間存在著微弱正相關(guān)關(guān)系。似乎在大多情況下,五糧液的回報(bào)率越高,茅臺(tái)的回報(bào)率也就越高。然后我們可以通過繪制散點(diǎn)矩陣進(jìn)一步改進(jìn)我們的分析,以可視化競(jìng)爭股票之間可能的相關(guān)性。在對(duì)角點(diǎn),我們將運(yùn)行核密度估計(jì)(Kernel Density Estimate,KDE)。KDE是一個(gè)基本的數(shù)據(jù)平滑問題,它基于有限的數(shù)據(jù)樣本對(duì)總體進(jìn)行推斷,它有助于生成對(duì)總體分布的估計(jì)。如圖3(b)所示。
從這里可以看出五糧液和茅臺(tái)之間的分布成正相關(guān)。為了更進(jìn)一步證明正相關(guān)系,我們可以使用熱圖來可視化競(jìng)爭股票直接的相關(guān)程度。顏色越深代表兩只股票的相關(guān)性越強(qiáng)。如圖4所示。
通過以上簡單的一系列分析,我們對(duì)這只股票以及和其行業(yè)內(nèi)的股票有了大致的了解。 接下來開始通過不同的學(xué)習(xí)模型來對(duì)這支股票進(jìn)行預(yù)測(cè)。
通過改變各神經(jīng)元間的權(quán)值使得樣本點(diǎn)的實(shí)際輸出值和期望輸出值間誤差漸漸減少。神經(jīng)網(wǎng)絡(luò)是一種非線性學(xué)習(xí)算法,它的性能優(yōu)于幾乎其他的機(jī)器學(xué)習(xí)算法。但是其本身還是逃不過那個(gè)廣為人知的缺點(diǎn):黑箱性質(zhì),這就意味著實(shí)驗(yàn)者并不知道神經(jīng)網(wǎng)絡(luò)是如何以及為何會(huì)得到一定的輸出。具體建模步驟:首先引入激活函數(shù),優(yōu)化函數(shù)。其中,因?yàn)樯窠?jīng)網(wǎng)絡(luò)的線性模型表達(dá)能力不夠,所以激活函數(shù)的引用是為了避免神經(jīng)網(wǎng)絡(luò)的權(quán)重、偏置全是線性的仿射變換(affine transformation)。首先我們?cè)O(shè)立一個(gè)單隱層神經(jīng)網(wǎng)絡(luò),同時(shí)通過格子點(diǎn)搜索對(duì)隱含層神經(jīng)元的個(gè)數(shù)進(jìn)行選擇。但經(jīng)過訓(xùn)練后得到的MAPE值并不太穩(wěn)定,總體趨勢(shì)變化較大,如圖5。所以神經(jīng)網(wǎng)絡(luò)模型并不太適合股價(jià)預(yù)測(cè)。對(duì)于未知數(shù)據(jù),我們得到了較大的誤差,這意味著該模型未能預(yù)測(cè)收盤價(jià)。值得注意的是,網(wǎng)絡(luò)本身并不能預(yù)測(cè)股價(jià)。相反,它嘗試使用給定的值猜測(cè)一個(gè)序列的下一個(gè)值是什么,這是因?yàn)閮r(jià)格沒有編碼下一次它會(huì)如何變化。如果價(jià)格上漲一段時(shí)間,就不能保證下一分鐘不會(huì)下跌。價(jià)格受外部事件的影響很大,這是網(wǎng)絡(luò)所不知的?;蛟S,我們將能夠使用神經(jīng)網(wǎng)絡(luò)進(jìn)行短期預(yù)測(cè),來確定未來幾分鐘內(nèi)的價(jià)格變化,這可能是因?yàn)槲覀冾A(yù)測(cè)的時(shí)間段越短,外部事件發(fā)生的變化就越小。然而,在這種情況下,最好使用線性回歸模型來預(yù)測(cè)價(jià)格變化的方向。如果我們仔細(xì)觀察股價(jià)曲線,我們會(huì)發(fā)現(xiàn)它的變化是隨機(jī)的。如果我們只有價(jià)格而不知道外部事件,這就是事實(shí)。因此,股價(jià)看起來就像一個(gè)鞅,這是一個(gè)我們無法預(yù)測(cè)的過程。
圖3(b) 茅臺(tái)股份(600519)與五糧液(000858)股價(jià)關(guān)系走勢(shì)圖
圖4 茅臺(tái)股份(600519)與五糧液(000858)股價(jià)關(guān)系熱圖走勢(shì)圖
首先便是通過隨機(jī)森林對(duì)股價(jià)做一個(gè)預(yù)測(cè)。隨機(jī)森林是一種集成算法(Ensemble Learning),它是屬于Bagging類型。由于采用了集成算法,機(jī)器訓(xùn)練后得到的結(jié)果會(huì)比那些只通過單個(gè)算法得到的結(jié)果更加準(zhǔn)確,它可以用來解決分類和回歸問題。其抗過擬合能力強(qiáng),因?yàn)橥ㄟ^平均決策樹,降低了過擬合的風(fēng)險(xiǎn),但是一旦在回歸問題的訓(xùn)練數(shù)據(jù)中存在噪音,那么隨即森林的數(shù)據(jù)集會(huì)出現(xiàn)過擬合的現(xiàn)象;并且,隨機(jī)森林的時(shí)間成本相較于其他算法所需求的時(shí)間成本而言會(huì)更高。RF的隨機(jī)性的特點(diǎn)對(duì)降低模型的方差可以起到很好作用,故隨機(jī)森林一般不需要額外做剪枝,即可以取得較好的泛化和抗過擬合能力(Low Variance)。在這一個(gè)部分,我們要進(jìn)行RF調(diào)參,其中包括兩個(gè)部分,第一部分是bagging框架的參數(shù)調(diào)整,第二部分則是CART決策樹的參數(shù)調(diào)整。首先還是建模,擬合數(shù)據(jù)和預(yù)測(cè)得到mse_test結(jié)果為0.14372028073490678。然后進(jìn)行針對(duì)RF框架參數(shù)調(diào)參:(1)通常建議取一個(gè)適中的值以避免欠擬合或過擬合;(2)obb_score:采用袋外樣本來評(píng)估模型的好壞。(3)criterion,即CART樹做劃分時(shí)對(duì)特征的評(píng)價(jià)標(biāo)準(zhǔn),默認(rèn)是基尼系數(shù)gini。然后CART默認(rèn)回歸樹是均方差mse。然后,決策樹參數(shù)方面我們要考慮:(1)特征選擇criterion,使用默認(rèn)的gini系數(shù)。(2)最大特征max_features。(3)max_depth,如果樣本多,特征也多的情況下,最好限制最大深度。(4)min_samples_split,在樣本量大的情況下,增大這個(gè)值;反之,則不需要管這個(gè)值。(5)最后還要考慮葉子節(jié)點(diǎn)最小樣本權(quán)重、最大葉子節(jié)點(diǎn)數(shù)、類別權(quán)重和min_impurity_split。
具體實(shí)驗(yàn)步驟:我們首先對(duì)n_estimators進(jìn)行網(wǎng)格搜素(通過sklearn.grid_search),得到最佳的弱學(xué)習(xí)器迭代次數(shù)為10,接著最決策樹最大深度max_depth和內(nèi)部節(jié)點(diǎn)再劃分所需要的最小樣本數(shù)min_sample_split進(jìn)行網(wǎng)格搜素(max_depth:5;min_sample_split:50)。因?yàn)檫@個(gè)決策樹和其他參數(shù)還存在關(guān)聯(lián),所以我們對(duì)內(nèi)部節(jié)點(diǎn)再劃分所需的最小樣本數(shù)和葉子節(jié)點(diǎn)最小樣本數(shù)進(jìn)行調(diào)參(min_sample_leaf:10,min_sample_split:80)。最后,再對(duì)max_features進(jìn)行調(diào)參(max_features:2)。 通過搜索到的最佳參數(shù),我們進(jìn)行最終的模擬擬合??梢暬瘓D如圖6所示。
圖7是最終結(jié)果圖,可以看出隨機(jī)森林得到的結(jié)果:預(yù)測(cè)值和測(cè)試值相差不大,還算穩(wěn)定,所以通過隨機(jī)森林來預(yù)測(cè)股價(jià)還是可行的。至于隨機(jī)森林的缺點(diǎn),當(dāng)隨機(jī)森林中的決策樹個(gè)數(shù)很多時(shí),訓(xùn)練時(shí)需要的空間和時(shí)間會(huì)比較大。隨機(jī)森林中還有許多不好解釋的地方,有點(diǎn)算是黑盒模型,在某些噪音比較大的樣本集上,RF的模型容易陷入過擬合。當(dāng)進(jìn)行回歸時(shí),隨機(jī)森林不能夠做出超越訓(xùn)練集數(shù)據(jù)范圍的預(yù)測(cè),這可能導(dǎo)致在某些特定噪聲的數(shù)據(jù)進(jìn)行建模時(shí)出現(xiàn)過度擬合。對(duì)于小數(shù)據(jù)或者低維數(shù)據(jù)(特征較少的數(shù)據(jù)),可能不能產(chǎn)生很好的分類。處理高維數(shù)據(jù)、處理特征遺失數(shù)據(jù)、處理失衡數(shù)據(jù)是隨機(jī)森林的長處。執(zhí)行數(shù)據(jù)雖然比boosting等快(隨機(jī)森林屬于bagging),但比單只決策樹慢多了。
圖5 茅臺(tái)股份(600519)在2020年5月20日-2021年2月22日間通過神經(jīng)網(wǎng)絡(luò)擬合誤差圖
圖6 茅臺(tái)股份(600519)在2020年5月20日-2021年2月22日期間通過RF擬合誤差圖
使用的決策樹是CART回歸樹,對(duì)于回歸樹來說最重要的點(diǎn)就是尋找最佳的劃分點(diǎn),判別標(biāo)準(zhǔn)是基尼指數(shù)(0和1,越接近0,越表明接近最佳劃分點(diǎn))。但在這兒,使用平方誤差(誤差平方和)可以更好地評(píng)判擬合程度。其具體過程:通過步長和迭代次數(shù)入手,尋找最好的迭代次數(shù)(重復(fù)計(jì)算工作表直到滿足特定數(shù)值條件為止)發(fā)現(xiàn)是5,開始調(diào)參,對(duì)max_depth和min_samples_split進(jìn)行網(wǎng)格搜索,找到最大深度是9,所需最小樣本數(shù)80。但深度5是一個(gè)比較合理的值,于是再把min_sample_split和min_sample_leaf進(jìn)行調(diào)參。然后,最終擬合模型。需要注意的是,其中我們還要考慮損失函數(shù),因?yàn)榉诸惡瘮?shù)和回歸函數(shù)的損失模型是不一樣的。對(duì)于分類函數(shù)而言,有對(duì)數(shù)似然損失函數(shù)“deviance”和指數(shù)損失函數(shù)“exponential”兩者輸入選擇,默認(rèn)是對(duì)數(shù)似然損失函數(shù)“deviance”。一般來說,推薦使用默認(rèn)的“deviance”,它對(duì)二元分離和多元分類各自有比較好的優(yōu)化。具體過程:首先引入GradientBoostingRegressor和GridSearchCV,得到mse_test值為0.022381161587606203. 然后通過調(diào)參來提高模型的泛化能力,首先從步長(learning rate)和迭代次數(shù)(n_estimators)入手。我們先將步長初始值設(shè)置為0.1,然后對(duì)迭代次數(shù)進(jìn)行網(wǎng)格搜索。找到一個(gè)最優(yōu)的迭代次數(shù)后,對(duì)決策樹進(jìn)行調(diào)參。首先對(duì)最大深度max_depth和內(nèi)部節(jié)點(diǎn)再劃分所需最小樣本min_samples_split進(jìn)行網(wǎng)格搜索得到最好的最大深度和所需最小樣本。由于決策樹深度5是一個(gè)比較合理的值,我們先暫定5。下面再對(duì)內(nèi)部節(jié)點(diǎn)所需最小樣本和葉子節(jié)點(diǎn)最小樣本一起調(diào)參;并對(duì)最大特征數(shù)進(jìn)行網(wǎng)格搜索。用搜索到的最佳參數(shù)得到以下最終的模型擬合。
圖7 茅臺(tái)股份(600519)通過RF擬合最終誤差圖
圖8 茅臺(tái)股份(600519)通過GBDT擬合誤差圖
如圖8所示,可以看出GBDT在股價(jià)預(yù)測(cè)中的應(yīng)用也很穩(wěn)定可靠。與其他基于樹的模型類似,這一算法不需要對(duì)數(shù)據(jù)進(jìn)行縮放就可以表現(xiàn)得很好,而且也適用于二元特征與連續(xù)特征同時(shí)存在的數(shù)據(jù)集。梯度提升樹模型的主要參數(shù)包括:樹的數(shù)量n_estimators、學(xué)習(xí)率 learning_rate,用于控制每棵樹對(duì)前一棵樹的錯(cuò)誤的糾正強(qiáng)度。這兩個(gè)參數(shù)高度相關(guān),因?yàn)?learning_rate越低,就需要更多的樹來構(gòu)建具有相似復(fù)雜度的模型。隨機(jī)森林的n_estimators值總是越大越好,但梯度提升不同,增大n_estimators會(huì)導(dǎo)致模型更加復(fù)雜,進(jìn)而可能導(dǎo)致過擬合。通常的做法是根據(jù)時(shí)間和內(nèi)存的預(yù)算選擇合適的n_estimators,然后對(duì)不同的learning_rate進(jìn)行遍歷。另一個(gè)重要參數(shù)是max_depth(或max_leaf_nodes),用于降低每棵樹的復(fù)雜度。梯度提升模型的max_depth通常都設(shè)置得很小,一般不超過5。當(dāng)然它也有兩個(gè)主要缺點(diǎn):需要仔細(xì)調(diào)參、訓(xùn)練時(shí)間可能會(huì)比較長。與其他基于樹的模型相同,它也通常不適用于高維稀疏數(shù)據(jù)。
這里要對(duì)以上的那幾個(gè)模型進(jìn)行比較,做出數(shù)據(jù)圖形,做到數(shù)據(jù)可視化。
股價(jià)預(yù)測(cè)問題一直是金融領(lǐng)域的核心問題。隨著機(jī)器學(xué)習(xí)的技術(shù)的進(jìn)一步提升,研究人員開始嘗試將機(jī)器學(xué)習(xí)模型運(yùn)用到現(xiàn)實(shí)生活中。借鑒之前的研究,我們將數(shù)據(jù)預(yù)處理、擬合、驗(yàn)證、調(diào)參運(yùn)用到上文提到的幾個(gè)算法中。通過實(shí)驗(yàn)分析表明,GBDT相較于隨機(jī)森林和神經(jīng)網(wǎng)絡(luò)模型,在本文的股價(jià)預(yù)測(cè)任務(wù)中表現(xiàn)得更加穩(wěn)定可靠。