基於深度神經網路的股票預測,正確率80%!

  • 2019 年 10 月 8 日
  • 筆記

股票市場具有高收益與高風險並存的特性,預測股票市場走勢一直被普通股民和投資機構所關注。股票市場是一個複雜的動態系統,受多方面因素的影響,例如國家金額正常的調整、公司內部結構的調整、以及媒體輿論的渲染等。

之前嘗試了例如決策樹、貝葉斯網路、KNN、BP神經網路等演算法,結合A股的市場特徵,對股票市場的綜合漲跌做預測分析,但是始終無法顯式挖掘數據的深度特徵,導致模型的正確率並不太高。

這裡就採用一維CNN代替傳統的BP人工神經網路進行建模,深度分析了數據的內在特徵,對股票市場的預測效果做了探索,以便更好的預測股市的走勢。

一、演算法說明:

本次案例採用一維CNN演算法做股票走勢的預測。一般而言,CNN多用於圖片或者語音數據處理,對於股票提供的數據資訊,需要將數據轉化成CNN的標準格式,這裡使用了加窗取樣的技術,每一個窗口代表一個樣本,統計窗口內的漲跌次數作為此樣本的標籤,窗內漲多跌少,標記為1,反之則標記為0,因此股票走勢問題轉化為分類問題。

對於卷積神經網路通道的設計,這裡採用相似指標作為不同通道,使用開盤價、最高價、最低價作為輸入數據,對股票趨勢建模分析,所以將open、high、low作為CNN的3個通道:

由於輸入數據是一維數據,這裡對卷積核以及池化操作的設計如下圖所示。將股票不同屬性作為不同通道來處理,並採用1*n的卷積核做卷積操作。另外在池化層,採用1*m的池化窗口,並保證每步處理後的結果仍然為一維數據。

二、數據說明和處理

爬取了2018年滬市A股的6500條數據作為本次分析的樣本,具體數據如下:

本次分析數據包括開盤價(open)、最高價(high)、最低價(low)、收盤價以及成交量等股票歷史數據,其中開盤價、最高價、最低價是股民最為關注的3大屬性,將數據集中的這3個屬性可視化,結果如下圖:

為了保證建模的品質,需要對數據做預處理。首先是數據的歸一化處理,這裡採用的是最大/最小值歸一是對原始數據的線性變換,使數據結果映射到[0,1]範圍之內,使用的是sklearn庫中的minmax_scale()函數。

接下來就是通過加窗處理,獲得CNN模型的分析數據,這裡採用了open、high、low這3個屬性作為3個通道,窗口大小為90,即每90條數據進行一次加窗,如下圖所示:

窗口大小設置為90,是因為通過幾組實驗比較得到較高正確率的區間大約在下圖所示的兩條豎線範圍內,其中橫坐標表示窗口大小,縱坐標表示樣本分類的正確率:

三、模型訓練

先建立一個3層的CNN進行訓練,首先定義迭代次數、輸入通道、隱藏層神經元數目等結構參數,其中隱藏層神經元數量為256,輸入通道數為3,迭代次數為10000次,批次大小為5。

使用TensorFlow構建神經網路模型,卷積操作與池化操作分別使用了tensorflow.layers包中的convld()函數與max_poolingld()函數,具體的參數在這裡就省略。

神經網路結構設計完成後,需要定義損失函數與優化器,這裡使用交叉熵損失作為模型的損失函數,優化器選擇Adam演算法,這種演算法可以更快收斂,並且把學習率設置為0.0001。

定義以上內容後,就可以開始模型訓練了。

四、演算法評估

這裡採用混淆矩陣ROC/PR AUC作為模型效果的評估指標,最終PR正確率接近80%,達到了比較好的效果。結果如下:

Tags: