iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
0
Google Developers Machine Learning

AI可以分析股票嗎?系列 第 8

股票預測三試 :: 使用小的Dataset和LSTM做多個測試

零、引言

首先,讓我們接續上篇......

不了,不接續了,我先不去踩TFRecord的坑...

今天先用小的資料集來看一看股票的特性。
首先會先介紹在keras中的LSTM layers用法,需要什麼樣的input和output。
我找了網路上的範例下來改一改,再來針對同一個模型進行以下幾點測試:

    1. Flatten輸出與否
    1. training data天數
    1. batch_size

今天也會使用更小的dataset :: Google_Stock_Price dataset

$kaggle datasets download akram24/google-stock-price-test
$unzip google-stock-price-test.zip
$rm google-stock-price-test.zip
$kaggle datasets download akram24/google-stock-price-train
$unzip google-stock-price-train.zip
$rm google-stock-price-train.zip

一、keras LSTM input/output shape理解

LSTM是一個RNN的延伸模型,架構我不會提,在這主要探討如何使用keras中的LSTM

1. LSTM的輸入參數

keras.layers.LSTM的輸入參數最主要有三個必須注意

  • input_shape
    • 輸入的資料維度,可以是多維的(如:(3, 2))
  • units
    • 輸出的個數,為正整數(如:50)
  • return_sequences
    • 輸出最後的output還是整個序列,為布林代數(True/False)

2. 輸入給LSTM的資料維度

在使用的過程中,輸入必為3維資料,分別代表batchtime steps以及input data
而input data幾維那是它的事情,反正給LSTM就要長這樣 : [batck, time, input]。
其中:

  • batch
    • 代表在訓練過程中,一次要輸入的資料筆數
  • time step
    • 代表資料的時間維度,在股票如果要藉由前30天的資料預測,則time step為30。
  • input data
    • 代表是單獨一個時間的資料
      示意圖:

3. LSTM輸出

LSTM輸出會根據return_sequences參數而定。當為True,則為many-to-many。False則many-to-one

其中,many-to-one的輸出是2維的,也就是說,如果想要搭架多層的LSTM模型,則中間都必須是many-to-many,或是要自己經過特殊處理

4. 今天所使用的模型

非常滴簡單,只差在下方網路LSTM後是否有Flatten layers而已

Layer (type)                 Output Shape              Param #   
=================================================================
lstm_4 (LSTM)                (None, 50)                10400     
_________________________________________________________________
dense_1 (Dense)              (None, 128)               6528      
_________________________________________________________________
dense_2 (Dense)              (None, 40)                5160      
_________________________________________________________________
dense_3 (Dense)              (None, 3)                 123       
=================================================================
Total params: 22,211
Trainable params: 22,211
Non-trainable params: 0

二、Dataset

今天使用的dataset表小,也沒有adj_price的資料,所以我改使用Open資料。
當然,也可以使用Close資料,你可以去用看看XD 會遇到BUG,是可以修復的BUG但...
我不想修

好滴~讓我們來看看這個dataset長什麼樣子吧!

  • 直接看Open的資料:
    • 其中,testing的資料在最後的20天

所以目標明確吧! 我們希望前面的1258天去預測最後的20天

正規化Training Data

在這邊使用正規化的方式是參照範例,直接使用minMaxScaler方式,直接對所有的training data正規到0-1

三、開測!

測試編號 Flatten loss 輸入天數 batch_size result
01 60 100
02 45 100
03 75 100
04 60 100
05 45 100
06 75 100
07 60 50
  • 上方使用的是前面講的正規化資料方式,但其實只要稍微改一下...
    • 參數
      • 使用Flatten
      • 輸入天數為60天
      • batch_size 為 50
      • 修改一下正規化方式
    • LOSS
    • 預測

四、總結

其實我是知道的...我知道的...只用Open資料怎麼可能可以Fit得好?
我絕對沒有認為它能一次就好,真的沒有,我說真的喔!真的! (好了可以不要強調了

不會啊,至少線有在逼近~應該很不錯吧?

: 這種問題才不會有人問哩
我 : 剛看到結果的時候我就是TM這麼認為的

這結果仔細一想,就只是個馬後炮啊!
歷史都已經上漲了,你的預測還晚幾天才漲?
這已經不是預測了吧! 這是慢半拍吧!
冷靜,先冷靜...

讓我們先回歸正題,先不談論結果,先從資料討論

1. 預測的資料沒有意義

我們所感興趣的應該是「明天的股票會不會上漲」或是「會上漲多少幅度」之類的問題。
當然說如果能預測出明天股價,不就可以知道是否上漲了嗎? ...是啦~
但是考慮模型的學習力,如果我們把股票價格當作我們的目標,那麼在不同間公司的訓練該怎麼辦?
每間公司有他們的漲跌幅才對吧?

那就每間公司的資料分開正規化呢?

乍看非常合理,但以台灣舉例,剛上市的公司與老牌公司(如台積電)比,股市浮動可能大些,這些因素都可能導致模型無法收斂,各個公司應該要有他們自己的漲跌幅,所以如果要這麼做,只能去為某間公司量身打造一個模型比較合理。

2. 正規化有隱患

從整體的Dataset可以看出,Testing Data位於最後的那個位置是整個股票曲線的高點。
如果根據正常程序正規化,則那個位置的股票很可能造成預測結果接近1(0.8 - 0.9附近)
此時如果我們往後看更多的歷史資料(如全看而非前60天),這個預測肯定會有問題。

3. 資訊量不足

一條日K線是由四個資料組成(開盤、收盤、高峰、低峰),而我目前只有使用開盤價而已

難道我都使用下去就可以了嗎?

答案可想,非常困難 。因為外在因素非常得多,包含交易量、大環境、國家元首一句話、資源問題、天災等等都可以是影響因素。

照你這麼說,那根本無從預測啊!

我也這麼想呵呵,那我鐵人就到這...

沒有啦~我還是有想要測試的東西

  • 首先,可以先把能加入得元素都加入,看看結果如何
  • 第二,有沒有辦法透過CNN來預處理資料
  • 第三,當然是用上GCP啊! 當然要結果有成效的前提

能做的事情還滿多的~
我還有一個最後的測試並沒有打在上面(因為不知道30天內碰不碰得到

拭目以待~

參考

Understanding Input and Output shapes in LSTM | Keras
The Unreasonable Effectiveness of Recurrent Neural Networks
最後的程式碼


上一篇
股票預測二訪 :: 簡單測試及修正小問題
下一篇
TFRecord踩坑踩好踩滿
系列文
AI可以分析股票嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言