iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0
Google Developers Machine Learning

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

實戰前的測試路(一) :: 正規化資料

  • 分享至 

  • xImage
  •  

零、引言

上篇股票預測三試 :: 使用小的Dataset和LSTM做多個測試的最後我放出了一張圖片

留下了「改變了一點點正規化方法」後就瀟灑結束~

挖,我真是帥炸了 (其實我有附上程式碼的連結在參考裡面

只是將原本的「一次對所有data正規」換成「對各個training 片段分別正規」而已XD 但也可以發現,不論原本還是後來的正規化,感覺都挺合理的呀? 這本身就沒有絕對的對錯,應該說每個dataset的特性不一樣。
所以在training之前一定要先了解被使用dataset特性 !!

那麼今天,我同樣使用Google_Stock_Price dataset小dataset, 但是網路模型換成較複雜的雙層LSTM進行測試。 對於資料集,會進行以下測試:

  • 股票資料不同的正規化
  • 長短時間輸入測試

讓我們開始吧!

一、正規化資料

根據上次的結果,我會選擇使用分開正規化的方式。之所以會想到分開來正規化,最主要原因如上篇所講,我認為預測股票的股價是沒有意義的,最主要是因為機器不一定可以學起來。我們能夠預測的應該是「幅度」而非實際股價。

  • 原本的正規化方式
  • 後來的正規化方式

其實不難看出差別,前者對於測試資料(最後的20天)非常不利,因為整個dataset幾乎沒有到過這個高的股價。後者除了可以較容易預測出更高的價格,最主要其所預測的更是「漲跌幅」的資訊。

挖,那就這麼辦吧! 分開來正規化!

好的,就將前60天的資料連同test一起正規到0-1吧! ... 嗎?

不適合

這其實是我踩的一個雷啦...搞不好只有我會犯Orz...
原因在於如果連同test data一起正規化,我們根本不能夠預測到「歷史最高」和「歷史最低」,因為我們的output全部都被轉到0-1之間了,將數字投射回去,它的數值一定是過往某一刻的資料。

  • 如下圖例子,我們預測的數值肯定在0-1之間

所以我們應該要用全部的資料才對呀?

那就回到原點啦!

沒關係,還有其他方法可以用,讓我們繼續下去吧! 今天有兩個測試方法想要試一試~

方法1 :: 擴大正規範圍

我是這麼做的,我特意將最大漲跌幅考慮進去模型裡面,大概變成這樣子

  • 我統計歷史資料的最大漲跌幅(1.5倍)然後對training data的x進行正規化縮小,y則透過正規化參數直接調整,所以y是可以大於0.66或小於0.33的 !

如此便能確保漲跌幅都在合理範圍。為什麼一定要正規到0-1呢? 其實也可以(-1, 1),原因在於我們的激勵函數是tanh,如果label有大於1,很可能會被tanh抹消掉。

下方是另外一個測試的內容...

方法2 :: 完全使用漲跌幅

我希望輸入的資料是「今天的價格是昨天的幾倍」的方式

  • 方法1
    • 輸入資料是直接正規化的資料
  • 方法2
    • 輸入的資料會先計算今天與昨天的倍數再正規到0-1

我個人認為它比較好是因為直接使用了漲跌幅,但從資料的角度,它比較著重於「連續出現的上漲下跌排列」這樣的解釋。從這樣的角度,或許訓練出來的模型會偷吃步也說不定~

...上面那段話是我測試之前打的,然後真的驗證了偷吃步這部分 Orz

二、長短時間測試(10天至60天)

之所以使用這個測試單純只是想要了解輸入的天數對於這個較短期的預測是否能夠準確。 在做之前我的猜測是短時間(如10日)的訓練方式可以比較有效果,而長時間則不容易學出來,根據上次的經驗,大於60天的資訊幾乎可以不用考慮。

* 接下來的測試只會分別測103060看看結果

三、我們來看看結果吧!

  • 使用模型
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm (LSTM)                  (None, 60, 50)            10400     
_________________________________________________________________
lstm_1 (LSTM)                (None, 60, 50)            20200     
_________________________________________________________________
flatten (Flatten)            (None, 3000)              0         
_________________________________________________________________
dense (Dense)                (None, 128)               384128    
_________________________________________________________________
dense_1 (Dense)              (None, 40)                5160      
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 41        
=================================================================
Total params: 419,929
Trainable params: 419,929
Non-trainable params: 0
_________________________________________________________________
  • 使用參數

    • epoch = 100
    • batch size = 100
    • optimizer = adam
    • loss = mean_squared_error
  • 結果

正規化方法 輸入天數 Loss 輸出結果
局部正規 60
局部正規 30
局部正規 10
漲跌幅 60
漲跌幅 30
漲跌幅 10

結果分析

從天數來看,或許是資料集的關係,小天數的效果好像更好些。其中比較令我意外的是我使用漲跌幅和輸入60天的資料的結果,這是第一次成功預測出比紅線更高的結果,畢竟test data是歷史最高嘛~ 難得!

不過真正特別的不是天數,是正規化方法,兩個不同的方法得出來的結果可以是是天差地遠!!

我真的沒有想過會差這麼多,不論Loss或是或是pred。我不確定我的思路是不是對的,我嘗試著解釋看看...

  • 我觀察了一下,整理了以下:
正規方法 預測線特徵 資料特徵
局部正規 不太穩定,與紅線細節上差異許多 LOSS非常難收斂,但有更多的「預測未來」結果,感覺有更多的參考歷史的感覺
漲跌幅 線和紅線幾乎如出一轍,就是晚了一天而已 LOSS收斂速度快,且有更高的能力預測歷史最高最低,但就是隻模仿貓(昨天漲我今天就預測它漲),感覺就是偷吃步了

我認為這兩個方法都各有其優點和缺點,現在,我有一個大膽的想法...

如果我將這兩種正規化的方法結合再一起呢?

聽起來好像不賴,明天開測!

程式碼

LSTM_01 :: local normalization
LSTM_02 :: quote change


上一篇
TFRecord踩坑踩好踩滿
下一篇
實戰前的測試路(二) :: 加入第二個變數
系列文
AI可以分析股票嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言