為了預測股票,我用TensorFlow深度學習了股市數據

為了預測股票,我用TensorFlow深度學習了股市數據

完整源碼可在微信公眾號:「01二進制」後臺回覆:「股市分析」獲取

閱讀此文前建議先閱讀

前言

相信大家這幾天或多或少的都開始關注到股市了,雖然我還不是很懂裡面的一些套路,但是從最近各個公眾號的推送裡面,我也看到最近的股市確實是形勢大好。對很多人來說,股票就和房價一樣,他的升與降牽動著眾多人的心。這幾天很多qq群、微信群都開始討論起股票了,各位坊間大神也紛紛開始預測各種股票走勢了。

股票價格是典型的時間序列數據(簡稱時序數據),會受到經濟環境、政府政策、人為操作多種複雜因素的影響,所以說股票價格預測是一件非常唬人的事情。但是基於歷史數據,以股票價格為例,介紹如何對時序數據進行預測,仍然值得一做。

不過今天我們不聊股市,因為我也不是很懂,今天我們來聊聊我們知道的東西。如今深度學習在金融市場的應用越來越廣泛,我們能否利用已有的歷史數據通過深度學習的方式來進行預測呢?

準備工作

答案自然是可以的,雖然我們無法非常準確的進行預測,但是作為一個深度學習入手的項目是完完全全可以的。

實驗環境

老樣子,以免出現因環境導致的問題,先將實驗環境列出:

  • MacOS 10.14.3
  • Python 3.6.8(Anaconda)
  • Jupyter Notebook
  • 使用的包有:
  • TensorFlow
  • Keras
  • numpy
  • matplotlib
  • pandas

數據

此次實驗,我們採用STATWORX的 S&P500股價數據,該數據集爬取自Google Finance API,已經進行過缺失值處理。他們的官方網站是:https://www.statworx.com/。

數據集可在微信公眾號:「01二進制」後臺回覆:「股市數據集」獲取

數據預覽

在這裡我們還是使用pandas,主要用於數據清洗和整理

為了預測股票,我用TensorFlow深度學習了股市數據

執行 data.info()可以查看特徵的概要:

為了預測股票,我用TensorFlow深度學習了股市數據

從上述結果可知:該數據集數據共502列,41266行,502列分別為:

  • DATE:該行數據的時間戳
  • SP500:可以理解為大盤指數
  • 其他:可以理解為500支個股的股價

查看數據的前五行

data.head()
為了預測股票,我用TensorFlow深度學習了股市數據

繪製大盤趨勢折線圖

plt.plot(data['SP500'])

結果如下:

為了預測股票,我用TensorFlow深度學習了股市數據

Tips:此次實驗的調試環境為Jupyter Notebook,我們最好在開頭導入 matplotlib包的時候在加一行 %matplotlibinline,這樣就可以在Jupyter Notebook中內嵌繪圖,並且省略掉plt.show()這一步。

數據整理

在這裡,我們需要將數據集分為訓練和測試數據。分配比為8:2,即訓練數據包含總數據集的80%。當然在這之前我們需要先將 DATE這個無關變量捨去。

為了預測股票,我用TensorFlow深度學習了股市數據

我們來查看一下訓練集和測試集的 shape:

為了預測股票,我用TensorFlow深度學習了股市數據

數據歸一化

將屬性縮放到一個指定的最大和最小值(通常是(-1,1))之間,這可以通過 sklearn.preprocessing.MinMaxScaler類實現。

使用這種方法的目的包括:

  1. 對於方差非常小的屬性可以增強其穩定性。
  2. 維持稀疏矩陣中為0的條目。
為了預測股票,我用TensorFlow深度學習了股市數據

預測

在此次預測過程中,我採用TensorFlow這個深度學習框架,它是目前領先的深度學習和神經網絡計算框架。這一部分推薦有基礎的人閱讀,在這推薦我還在整理的 ,有興趣的可以瞭解下。

這裡我們需要解決的問題是:

使用當前時刻的500支個股股價,預測當前時刻的大盤指數。即一個迴歸問題,輸入共500維特徵,輸出一維,即 [None,500]=>[None,1]

設置X與Y

為了預測股票,我用TensorFlow深度學習了股市數據

這裡的x和y是已經分類好的數據集,只是用X和Y兩個變量表示,可以理解為函數里面的X和Y。

設置超參數

為了預測股票,我用TensorFlow深度學習了股市數據

這裡我們設置了幾個超參數, input_dim表示輸入數據的維度,即500。 output_dim表示輸出數據的維度,即1。在該模型中設置了4層隱藏層,第一層包含1024個神經元,略大於輸入大小的兩倍。 後續的隱藏層總是前一層的一半大小,即分別為512,256和128個神經元。 每個後續層的神經元數量的減少壓縮了網絡在先前層中識別的信息。 當然,其他網絡架構和神經元配置也是可能的,只是由於本文只是一個入門的項目所以並未深究。

在機器學習中,超參數是在開始學習過程之前設置值的參數,而不是通過訓練得到的參數數據。通常情況下,需要對超參數進行優化,給學習機選擇一組最優超參數,以提高學習的性能和效果。

設置佔位符(placeholder)

為了預測股票,我用TensorFlow深度學習了股市數據

為了適應我們的模型,我們需要兩個佔位符:X(神經網絡的輸入)和Y(神經網絡的輸出)。

設置神經網絡

根據之前設置好的超參數進行神經網絡的配置,其中w為權重,b為偏置值

為了預測股票,我用TensorFlow深度學習了股市數據

瞭解輸入層,隱藏層和輸出層之間所需的變量尺寸非常重要。作為多層感知器(MLP,這裡使用的網絡類型)的一個經驗法則,前一層的第二維是當前層中權重矩陣的第一維。這可能聽起來很複雜,但實質上只是每個圖層都將其輸出作為輸入傳遞到下一圖層。偏差維度等於當前圖層的權重矩陣的第二維度,其對應於該層中的神經元的數量。

設置網絡體系結構

在定義所需的權重和偏置變量後,需要指定網絡拓撲結構和網絡結構。因此,佔位符(數據)和變量(權重和偏置)需要組合成一個連續矩陣乘法系統。

為了預測股票,我用TensorFlow深度學習了股市數據

此外,網絡的隱藏層需要被激活函數激活。激活函數是網絡體系結構的重要組成部分,因為它們將非線性引入到系統中。這裡採用最常見的ReLU激活函數。

下圖說明了網絡架構。 該模型由三個主要構建塊組成。 輸入層,隱藏層和輸出層。 該體系結構稱為前饋網絡。 前饋表示該批數據僅從左向右流動。 其他網絡架構,例如遞歸神經網絡,也允許數據在網絡中“向後”流動。

為了預測股票,我用TensorFlow深度學習了股市數據

設置損失函數(loss function)和優化器(Optimizer)

為了預測股票,我用TensorFlow深度學習了股市數據

這一部分沒啥好說的,記住這麼寫就可以了,想了解的話可以去https://juejin.im/post/5c751da2f265da2dba022fd9中瞭解下。

執行訓練過程

在定義好神經網絡的佔位符,結構,損失函數函數和優化器之後,我們就可以開始對模型進行訓練了。訓練數據集分為n / batch_size批次,這些批次按順序送入網絡。 此時佔位符X和Y開始起作用。 它們存儲輸入和目標數據,並將它們作為輸入和目標呈現給網絡。

數據X分批次流經網絡,直到到達輸出層。 在那裡,TensorFlow將模型預測與當前批次中實際觀察到的目標Y進行比較。 之後,TensorFlow進行優化步驟並更新與所選學習方案相對應的網絡參數。 更新了權重和偏差後,對下一批進行採樣,並重復該過程。 該過程將繼續,直到所有批次都已呈現給網絡。對所有數據進行一次全面掃描被稱為一個epoch(輪)

一旦達到了最大數量的epochs或用戶定義的另一個停止標準,網絡的訓練就會停止。

為了預測股票,我用TensorFlow深度學習了股市數據

運行結果為:

MSE Train: 9.56518e-05 
MSE Test: 0.0025863606
MSE Train: 6.0618047e-05
MSE Test: 0.0025002975
MSE Train: 0.00014856807
MSE Test: 0.0017371146
MSE Train: 0.00016200903
MSE Test: 0.0025396077
MSE Train: 0.00010259051
MSE Test: 0.0030134947
MSE Train: 7.979905e-05
MSE Test: 0.0023832247
MSE Train: 5.92488e-05
MSE Test: 0.0032762515
MSE Train: 8.747634e-05
MSE Test: 0.004848172
MSE Train: 8.5051965e-05
MSE Test: 0.0032768336

最後測試集的loss在0.003左右,可以說是比較精確了。

可視化訓練結果:

為了預測股票,我用TensorFlow深度學習了股市數據

有很多方法可以進一步改善這一結果:增加隱藏層和改進神經元的設計,選擇不同的初始化和激活方案,提前停止等等。 此外,不同類型的深度學習模型,例如循環神經網絡,可以在此任務上實現更好的性能。 但是,這不是這篇介紹性文章的範圍。有興趣的小夥伴可以自行查找資料。

結論

正如開頭所說,股票的價格會受到經濟環境、政府政策、人為操作多種複雜因素的影響,真正想要預測股市走向單靠這篇文章裡面所敘述的遠遠不夠,本文旨在結合時下熱點進行一次有關TensorFlow的技術推薦。

TensorFlow的發佈是深度學習研究中的一個里程碑事件。作為一個學生,筆者也在積極的學習中,有興趣學習的小夥伴可以在公眾號後臺回覆「TensorFlow視頻」獲取一份質量較高的TensorFlow視頻,也可以添加我的微信一起交流進步。

完整源碼可在微信公眾號:「01二進制」後臺回覆:「股市分析」獲取


分享到:


相關文章: