美國華盛頓大學西雅圖校區 李 超
股票市場是國度經濟的主要表現,股價的走勢是股票投資者存眷的核心問題。由于股票價格固有的噪聲環境和相對市場趨勢的較大波動性,股價的擬合和預測是一個具有挑戰性的問題。本文使用了隨機森林、GBDT算法、神經網絡、SVM等模型對股票價格時間序列進行了擬合。通過對上證A股貴州茅臺(600519)數據的預處理、擬合、驗證、調參全流程的分析,獲得并展示了最終模型的效果。實驗結果表明,使用梯度提升隨機樹(GBDT),股價擬合結果的預測誤差最小。相對于隨機森林和神經網絡模型,GBDT算法在本文的股價預測任務中表現得更加穩定可靠。
近幾年經濟的飛速發展,追求上市的公司愈發增多,股票逐漸走進越來越多人的視線。股票這個紐帶在股民、股東和交易所之間也愈發緊密。因為股票市場的波動十分巨大,隨時可能因為一些新的政策或者其他原因,進行大幅度的波動,導致自然人股民很難對股票進行投資盈利;并且,股票價格具有高噪聲、非線性,易受政策影響等特點,因此投資者很難就近規避風險。通過眾多的網絡數據接口,研究者可以進行數據分析,再利用機器的深度學習來對股票價格進行預測。
在目前市場環境下,散戶投資過程中最大的問題是信息不對稱,要獲取真實信息則需要付出成本,使得散戶往往依賴于無成本的“小道消息”而非科學的技術分析。形態分析認為一切能夠影響股價的因素——經濟的、政策的、心理的等最終都反映到K線圖上。股票價格預測正是基于K線圖幫助散戶在缺乏透明度的市場中低成本地、科學地獲取有效信息。股票價格預測每天對每只股票的未來趨勢(超短線、中短期)做出預測,預測的內容包括股票未來的上漲概率、上漲幅度、下跌概率、下跌幅度、中短期走勢,行業的上漲和下跌趨勢,用戶可以通過每日提供的大量預測數據發現存在上漲可能的股票和行業。當然,股票預測的結果的準確性取決于對模型的選擇,本文便是對幾種常見的方法進行一個對比,來供讀者參考。
傳統機器學習是基于樣本出發,嘗試發掘那些不能利用原理解釋分析的規律,以此實現對未來數據趨勢的準確預測。相關的算法有:邏輯回歸、支持向量機方法、決策樹方法等。傳統的機器學習方法為機器學習結果的有效性與學習模型的可解釋性找到了一個平衡點,為解決有限樣本的學習問題提供了一種框架,主要用于有限樣本情況下的模式分類、回歸分析、概率密度估計等。傳統機器學習方法共同的重要理論基礎之一是統計學,在自然語言處理、語音識別、圖像識別、信息檢索和生物信息等許多計算機領域獲得了廣泛應用。
深度學習又稱為深度神經網絡。深度學習源于多層神經網絡,其實質是給出了一種將特征表示和學習合二為一的方式。深度學習的特點是放棄了可解釋性,單純追求學習的有效性。經過多年的摸索嘗試和研究,已經產生了諸多深度神經網絡的模型,其中卷積神經網絡、循環神經網絡是兩類典型的模型。深度學習框架是進行深度學習的基礎底層框架,一般包含主流的神經網絡算法模型,提供穩定的深度學習API,支持訓練模型在服務器和GPU、TPU 間的分布式學習,部分框架還具備在包括移動設備、云平臺在內的多種平臺上運行的移植能力,從而為深度學習算法帶來前所未有的運行速度和實用性。
目前,針對股票價格預測常用的機器學習方法有以下幾種:隨機森林模型(Random Forest)、長短期記憶模型(Long-short term memory)、RNN模型、GBDT模型等。雖然有諸多的模型算法,但是實際上一只股票不僅僅是呈現在價格方面,還有很多的外圍信息,例如:換手率、收益率、市盈率、市凈率等。這些信息會在選股策略中經常使用到,因為它們本身就會對股價的走勢產生一定的影響,是不可被忽視的。本文主要是先對數據進行簡單分析和預處理,然后通過機器學習模型(尤其是預測相關的模型)構建和參數的調整,最終將數據可視化,并且將本文使用到的模型進行比較,最終進行評價。本文從數據庫中隨即提取某個品牌的股價走勢數據進行分析。在引用到具體算法之前,我們先開始一個簡單的數據分析,例如移動平均值。通過不斷引入新的平均價格來降低價格表中的“噪音”,同時表示該平均價格的平均線可能充當“阻力”,代表著股市的漲和跌,進而從中預期未來趨勢。對于單只股票,我們可以先進行一些簡單分析,例如移動平均值滾動平均/移動平均(MA)通過不斷更新平均價格來平滑價格數據,有助于降低價格表中的“噪音”。此外,該移動平均線可能充當“阻力”,代表股票的下跌和上升趨勢,你可以從中預期它的未來趨勢,不太可能偏離阻力點。首先通過Matplotlib來對茅臺這只股票進行簡單分析。計算收盤價100天以內的移動平均值,并取每個滑窗的移動平均值。如圖1所示。

圖1 茅臺股份(600519)在2020年5月20日-2021年2月22日期間的價格走勢圖

圖2 茅臺股份(600519)在2020年5月20日-2021年2月22日期間的收益率走勢圖

圖3(a) 茅臺股份(600519)與五糧液(000858)股價關系走勢圖
此外,除了參考平均值,收益率也是考慮一只股票的重要影響因素,如圖2所示。
從邏輯上講,我們理想的股票收益應該是盡可能的高且穩定,但是通過上圖反映的情況來說,如果作為一個風險規避者,那就應該避開這類股票。因為在這只股票的收益率在某一時間段下跌了將近10個百分點。同時,我們也可以調用多只類似股票來研究酒水行業的股價之間的關系。如圖3(a)所示。
我們可以看到,五糧液和茅臺的收益之間存在著微弱正相關關系。似乎在大多情況下,五糧液的回報率越高,茅臺的回報率也就越高。然后我們可以通過繪制散點矩陣進一步改進我們的分析,以可視化競爭股票之間可能的相關性。在對角點,我們將運行核密度估計(Kernel Density Estimate,KDE)。KDE是一個基本的數據平滑問題,它基于有限的數據樣本對總體進行推斷,它有助于生成對總體分布的估計。如圖3(b)所示。
從這里可以看出五糧液和茅臺之間的分布成正相關。為了更進一步證明正相關系,我們可以使用熱圖來可視化競爭股票直接的相關程度。顏色越深代表兩只股票的相關性越強。如圖4所示。
通過以上簡單的一系列分析,我們對這只股票以及和其行業內的股票有了大致的了解。 接下來開始通過不同的學習模型來對這支股票進行預測。
通過改變各神經元間的權值使得樣本點的實際輸出值和期望輸出值間誤差漸漸減少。神經網絡是一種非線性學習算法,它的性能優于幾乎其他的機器學習算法。但是其本身還是逃不過那個廣為人知的缺點:黑箱性質,這就意味著實驗者并不知道神經網絡是如何以及為何會得到一定的輸出。具體建模步驟:首先引入激活函數,優化函數。其中,因為神經網絡的線性模型表達能力不夠,所以激活函數的引用是為了避免神經網絡的權重、偏置全是線性的仿射變換(affine transformation)。首先我們設立一個單隱層神經網絡,同時通過格子點搜索對隱含層神經元的個數進行選擇。但經過訓練后得到的MAPE值并不太穩定,總體趨勢變化較大,如圖5。所以神經網絡模型并不太適合股價預測。對于未知數據,我們得到了較大的誤差,這意味著該模型未能預測收盤價。值得注意的是,網絡本身并不能預測股價。相反,它嘗試使用給定的值猜測一個序列的下一個值是什么,這是因為價格沒有編碼下一次它會如何變化。如果價格上漲一段時間,就不能保證下一分鐘不會下跌。價格受外部事件的影響很大,這是網絡所不知的。或許,我們將能夠使用神經網絡進行短期預測,來確定未來幾分鐘內的價格變化,這可能是因為我們預測的時間段越短,外部事件發生的變化就越小。然而,在這種情況下,最好使用線性回歸模型來預測價格變化的方向。如果我們仔細觀察股價曲線,我們會發現它的變化是隨機的。如果我們只有價格而不知道外部事件,這就是事實。因此,股價看起來就像一個鞅,這是一個我們無法預測的過程。

圖3(b) 茅臺股份(600519)與五糧液(000858)股價關系走勢圖

圖4 茅臺股份(600519)與五糧液(000858)股價關系熱圖走勢圖
首先便是通過隨機森林對股價做一個預測。隨機森林是一種集成算法(Ensemble Learning),它是屬于Bagging類型。由于采用了集成算法,機器訓練后得到的結果會比那些只通過單個算法得到的結果更加準確,它可以用來解決分類和回歸問題。其抗過擬合能力強,因為通過平均決策樹,降低了過擬合的風險,但是一旦在回歸問題的訓練數據中存在噪音,那么隨即森林的數據集會出現過擬合的現象;并且,隨機森林的時間成本相較于其他算法所需求的時間成本而言會更高。RF的隨機性的特點對降低模型的方差可以起到很好作用,故隨機森林一般不需要額外做剪枝,即可以取得較好的泛化和抗過擬合能力(Low Variance)。在這一個部分,我們要進行RF調參,其中包括兩個部分,第一部分是bagging框架的參數調整,第二部分則是CART決策樹的參數調整。首先還是建模,擬合數據和預測得到mse_test結果為0.14372028073490678。然后進行針對RF框架參數調參:(1)通常建議取一個適中的值以避免欠擬合或過擬合;(2)obb_score:采用袋外樣本來評估模型的好壞。(3)criterion,即CART樹做劃分時對特征的評價標準,默認是基尼系數gini。然后CART默認回歸樹是均方差mse。然后,決策樹參數方面我們要考慮:(1)特征選擇criterion,使用默認的gini系數。(2)最大特征max_features。(3)max_depth,如果樣本多,特征也多的情況下,最好限制最大深度。(4)min_samples_split,在樣本量大的情況下,增大這個值;反之,則不需要管這個值。(5)最后還要考慮葉子節點最小樣本權重、最大葉子節點數、類別權重和min_impurity_split。
具體實驗步驟:我們首先對n_estimators進行網格搜素(通過sklearn.grid_search),得到最佳的弱學習器迭代次數為10,接著最決策樹最大深度max_depth和內部節點再劃分所需要的最小樣本數min_sample_split進行網格搜素(max_depth:5;min_sample_split:50)。因為這個決策樹和其他參數還存在關聯,所以我們對內部節點再劃分所需的最小樣本數和葉子節點最小樣本數進行調參(min_sample_leaf:10,min_sample_split:80)。最后,再對max_features進行調參(max_features:2)。 通過搜索到的最佳參數,我們進行最終的模擬擬合。可視化圖如圖6所示。
圖7是最終結果圖,可以看出隨機森林得到的結果:預測值和測試值相差不大,還算穩定,所以通過隨機森林來預測股價還是可行的。至于隨機森林的缺點,當隨機森林中的決策樹個數很多時,訓練時需要的空間和時間會比較大。隨機森林中還有許多不好解釋的地方,有點算是黑盒模型,在某些噪音比較大的樣本集上,RF的模型容易陷入過擬合。當進行回歸時,隨機森林不能夠做出超越訓練集數據范圍的預測,這可能導致在某些特定噪聲的數據進行建模時出現過度擬合。對于小數據或者低維數據(特征較少的數據),可能不能產生很好的分類。處理高維數據、處理特征遺失數據、處理失衡數據是隨機森林的長處。執行數據雖然比boosting等快(隨機森林屬于bagging),但比單只決策樹慢多了。

圖5 茅臺股份(600519)在2020年5月20日-2021年2月22日間通過神經網絡擬合誤差圖

圖6 茅臺股份(600519)在2020年5月20日-2021年2月22日期間通過RF擬合誤差圖
使用的決策樹是CART回歸樹,對于回歸樹來說最重要的點就是尋找最佳的劃分點,判別標準是基尼指數(0和1,越接近0,越表明接近最佳劃分點)。但在這兒,使用平方誤差(誤差平方和)可以更好地評判擬合程度。其具體過程:通過步長和迭代次數入手,尋找最好的迭代次數(重復計算工作表直到滿足特定數值條件為止)發現是5,開始調參,對max_depth和min_samples_split進行網格搜索,找到最大深度是9,所需最小樣本數80。但深度5是一個比較合理的值,于是再把min_sample_split和min_sample_leaf進行調參。然后,最終擬合模型。需要注意的是,其中我們還要考慮損失函數,因為分類函數和回歸函數的損失模型是不一樣的。對于分類函數而言,有對數似然損失函數“deviance”和指數損失函數“exponential”兩者輸入選擇,默認是對數似然損失函數“deviance”。一般來說,推薦使用默認的“deviance”,它對二元分離和多元分類各自有比較好的優化。具體過程:首先引入GradientBoostingRegressor和GridSearchCV,得到mse_test值為0.022381161587606203. 然后通過調參來提高模型的泛化能力,首先從步長(learning rate)和迭代次數(n_estimators)入手。我們先將步長初始值設置為0.1,然后對迭代次數進行網格搜索。找到一個最優的迭代次數后,對決策樹進行調參。首先對最大深度max_depth和內部節點再劃分所需最小樣本min_samples_split進行網格搜索得到最好的最大深度和所需最小樣本。由于決策樹深度5是一個比較合理的值,我們先暫定5。下面再對內部節點所需最小樣本和葉子節點最小樣本一起調參;并對最大特征數進行網格搜索。用搜索到的最佳參數得到以下最終的模型擬合。

圖7 茅臺股份(600519)通過RF擬合最終誤差圖

圖8 茅臺股份(600519)通過GBDT擬合誤差圖
如圖8所示,可以看出GBDT在股價預測中的應用也很穩定可靠。與其他基于樹的模型類似,這一算法不需要對數據進行縮放就可以表現得很好,而且也適用于二元特征與連續特征同時存在的數據集。梯度提升樹模型的主要參數包括:樹的數量n_estimators、學習率 learning_rate,用于控制每棵樹對前一棵樹的錯誤的糾正強度。這兩個參數高度相關,因為 learning_rate越低,就需要更多的樹來構建具有相似復雜度的模型。隨機森林的n_estimators值總是越大越好,但梯度提升不同,增大n_estimators會導致模型更加復雜,進而可能導致過擬合。通常的做法是根據時間和內存的預算選擇合適的n_estimators,然后對不同的learning_rate進行遍歷。另一個重要參數是max_depth(或max_leaf_nodes),用于降低每棵樹的復雜度。梯度提升模型的max_depth通常都設置得很小,一般不超過5。當然它也有兩個主要缺點:需要仔細調參、訓練時間可能會比較長。與其他基于樹的模型相同,它也通常不適用于高維稀疏數據。
這里要對以上的那幾個模型進行比較,做出數據圖形,做到數據可視化。
股價預測問題一直是金融領域的核心問題。隨著機器學習的技術的進一步提升,研究人員開始嘗試將機器學習模型運用到現實生活中。借鑒之前的研究,我們將數據預處理、擬合、驗證、調參運用到上文提到的幾個算法中。通過實驗分析表明,GBDT相較于隨機森林和神經網絡模型,在本文的股價預測任務中表現得更加穩定可靠。