基于機器學習方法的股票預測系列文章目錄
一、基于強化學習DQN的股票預測【股票交易】
二、基于CNN的股票預測方法【卷積神經網絡】
文章目錄
- 基于機器學習方法的股票預測系列文章目錄
- 一、CNN建模原理
- 二、模型搭建
- 三、模型參數的選擇
- (1)探究`window_size`的影響
- (2)探究`kernel_size`的影響
- (3)探究探究模型結構的影響
- (4) 模型擬合效果
- 四、數據處理
- (1)數據變換
- (2)Kalman濾波
- 五、參考資料
本文探討了利用卷積神經網絡(CNN)進行股票預測的建模方法,并詳細介紹了模型的搭建、參數選擇以及數據處理方法。盡管序列建模通常與遞歸神經網絡(如LSTM和GRU)相關,但本文展示了如何使用CNN進行時間序列數據的預測,完整代碼放在GitHub上——Stock-Prediction-Using-Machine-Learing.
一、CNN建模原理
深度學習背景下的序列建模主題主要與遞歸神經網絡架構(如LSTM和GRU)有關,但事實上CNN也可以用于對序列數據的建模。與處理圖像所用的二維卷積不同,處理時間序列可以使用一維卷積,用多個以前的數據序列預測下一時刻。如下圖所示,Input_length是指定用幾個以前的數據來預測下一天的股票價格,用一個一個卷積核來滑動提取特征,最后通過一個線性層得到輸出的預測值,具體網絡搭建見下一小節。
其中兩個關鍵的參數是:
Input_length
: 用幾個以前的數據作為輸入,來預測下一時刻。(在后文稱為Window_size)Kernel_size
: 卷積核大小。
事實上也可以用二維的卷積和來建模,比如輸入可以是多只股票,用二維卷積核對多只股票同時建模預測,或者將一只股票的多個特征同時建模預測,本文僅探究用股票的收盤價來預測未來的股票收盤價格,沒有利用股票數據的其他技術指標。
二、模型搭建
基于Pytorch深度學習框架,搭建的CNN網絡如下所示:
kernel_size=2 #一維卷積核大小class CNNmodel(nn.Module):def __init__(self):super(CNNmodel, self).__init__()self.conv1 = nn.Conv1d(1, 64, kernel_size=kernel_size) #1xkersize的卷積核 #self.conv2 = nn.Conv1d(64,128,1)self.relu = nn.ReLU(inplace=True)self.Linear1 = nn.Linear(64*(window_size-kernel_size+1), 10)self.Linear2 = nn.Linear(10, 1)def forward(self, x):x = self.conv1(x)x = self.relu(x)x = x.view(-1)x = self.Linear1(x)x = self.relu(x)x = self.Linear2(x)return xmodel = CNNmodel()
print(model)
選用relu函數作為激勵函數,因為股票都是正數,而relu函數的性質,可以很好的避免模型輸出值為負值。
三、模型參數的選擇
(1)探究window_size
的影響
調節CNN模型中window_size
參數,并比較不同window_size
下訓練集與測試集的相對誤差率,結果如下表所示:
window_size | 訓練集相對誤差率 | 測試集相對誤差率 |
---|---|---|
5 | 2.22% | 2.18% |
6 | 1.69% | 1.48% |
7 | 2.30% | 2.27% |
8 | 2.36% | 2.12% |
15 | 1.65% | 1.58% |
20 | 2.01% | 2.03% |
50 | 2.37% | 2.55% |
150 (kernel_size=40) | 3.21% | 2.72% |
分析上表知:
- 不同
window_size
對結果有一定影響 window_size
比較大時,誤差很大- 在10左右,效果比較好,最終我們選擇
window_size
=6
(2)探究kernel_size
的影響
調節CNN模型中kernel_size
參數,并比較不同kernel_size
下訓練集與測試集的相對誤差率,結果如下表所示(window_size=6):
Kernel_size | 訓練集相對誤差率 | 測試集相對誤差率 |
---|---|---|
2 | 1.69% | 1.48% |
3 | 1.76% | 1.58% |
4 | 1.82% | 1.94% |
5 | 1.90% | 1.73% |
分析上表數據知較小的kernel_size
能使相對誤差率更小,最終我們選擇kernel_size
=2。
(3)探究探究模型結構的影響
調節CNN模型中模型結構,并比較不同模型結構下的平均誤差和平均相對誤差率,結果如下表所示:
模型結構 | 平均誤差 | 平均相對誤差率 |
---|---|---|
兩個卷積層 | 0.52 | 2.46% |
1個卷積層,線性層100 | 0.46 | 2.29% |
1個卷積層,線性層10 | 0.28 | 1.38% |
由上表知,模型對學習率十分敏感;模型結構過于復雜,不容易學習,且容易過擬合。
(4) 模型擬合效果
通過以上探究得到的模型結構以及參數,以AAPL股票為例,采用原始數據進行訓練,其預測結果如下圖所示:

由上圖知,以原始數據進行訓練有不錯的擬合效果,但滯后比較明顯,神經網絡會“偷懶”,這是因為數據序列中產生了變化趨勢,而基于滑動時間窗口策略的對發生變化趨勢的數據感知是滯后的。
對測試集進行預測:
四、數據處理
(1)數據變換
為了解決預測過程中出現的“滯后”問題,常常對原始數據進行一定的處理。常見的數據處理方法有:
- 數據歸一化
- 不直接給出希望模型預測的未經處理的真實值,對輸入樣本進行非線性化的處理如,如:平方、開根號、ln等
- 差分,預測時間t和t-1處值的差異,而不是直接預測t時刻的值
如以AAPL股票數據為例,對其收盤價取其平方的對數進行訓練,最終的預測效果如下圖所示:
與上一小節的圖對比知,“滯后”現象得到顯著的減弱,模型的可信度更好。
(2)Kalman濾波
卡爾曼濾波(Kalman filtering)是一種利用線性系統狀態方程,通過系統輸入輸出觀測數據,對系統狀態進行最優估計的算法。由于觀測數據中包括系統中的噪聲和干擾的影響,所以最優估計也可看作是濾波過程。
Kalman濾波原理及數理處理過程如下:
- 給定初始估計值、系統輸入、初始協方差矩陣和誤差的方差 Q Q Q, 首先要計算預測值、預測值和真實值之間誤差協方差矩陣:
X ^ k ′ = A X ^ k ? 1 + B u k ? 1 P k ′ = A P k ? 1 A T + Q \begin{aligned} &\hat{X}_{k}^{\prime}=A \hat{X}_{k-1}+B u_{k-1} \\ &P_{k}^{\prime}=A P_{k-1} A^{T}+Q \end{aligned} ?X^k′?=AX^k?1?+Buk?1?Pk′?=APk?1?AT+Q?
- 然后根據 P k ′ P_{k}^{\prime} Pk′? 計算卡爾曼增益 K k K_{k} Kk? :
K k = P k ′ H T ( H P k ′ H T + R ) ? 1 K_{k}=P_{k}^{\prime} H^{T}\left(H P_{k}^{\prime} H^{T}+R\right)^{-1} Kk?=Pk′?HT(HPk′?HT+R)?1
- 然后根據卡爾曼增益 K k K_{k} Kk? 和 X ^ k ′ \hat{X}_{k}{ }^{\prime} X^k?′ 以及測量值 Z k Z_{k} Zk?, 調和平均得到估計值:
X ^ k = X ^ k ′ + K k ( Z k ? H X ^ k ′ ) \hat{X}_{k}=\hat{X}_{k}^{\prime}+K_{k}\left(Z_{k}-H \hat{X}_{k}^{\prime}\right) X^k?=X^k′?+Kk?(Zk??HX^k′?)
- 最后還要計算估計值和真實值之間的誤差協方差矩陣, 為下次遞推做準備:
P k = ( I ? K k H ) P k ′ P_{k}=\left(I-K_{k} H\right) P_{k}^{\prime} Pk?=(I?Kk?H)Pk′?
以AAPL股票數據為例,對其收盤價進行kalman濾波后,以CNN模型進行訓練,結果如下圖所示:

與圖3對比可知,圖3中平均誤差為0.11,相對誤差率為2.30%,采用kalman濾波后,平均誤差為0.08,相對誤差率為1.71%,效果變好。
通過前面2種不同數據處理方法對不同模型效果的影響,我們可以看到,不同數據處理方法對不同模型的影響不一樣,但總的來說對數據進行相應的處理后,能夠提升模型的性能。而通過實驗我們發現Kalman濾波進行數據處理后,模型效果有顯著的提升。
五、參考資料
- 王宇軒.基于卷積神經網絡的股票預測[D].天津工業大學,2019.