上篇股票預測三試 :: 使用小的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之間了,將數字投射回去,它的數值一定是過往某一刻的資料。
所以我們應該要用全部
的資料才對呀?
那就回到原點啦!
沒關係,還有其他方法可以用,讓我們繼續下去吧! 今天有兩個測試方法想要試一試~
我是這麼做的,我特意將最大漲跌幅考慮進去模型裡面,大概變成這樣子
x
進行正規化縮小,y
則透過正規化參數直接調整,所以y
是可以大於0.66或小於0.33的 !
如此便能確保漲跌幅都在合理範圍。為什麼一定要正規到0-1呢? 其實也可以(-1, 1),原因在於我們的激勵函數是tanh,如果label有大於1,很可能會被tanh抹消掉。
下方是另外一個測試的內容...
我希望輸入的資料是「今天的價格是昨天的幾倍」的方式
我個人認為它比較好是因為直接使用了漲跌幅,但從資料的角度,它比較著重於「連續出現的上漲下跌排列」這樣的解釋。從這樣的角度,或許訓練出來的模型會偷吃步也說不定~
...上面那段話是我測試之前打的,然後真的驗證了偷吃步這部分 Orz
之所以使用這個測試單純只是想要了解輸入的天數對於這個較短期的預測是否能夠準確。 在做之前我的猜測是短時間(如10日)的訓練方式可以比較有效果,而長時間則不容易學出來,根據上次的經驗,大於60天的資訊幾乎可以不用考慮。
* 接下來的測試只會分別測10
、30
和60
看看結果
_________________________________________________________________
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
_________________________________________________________________
使用參數
結果
正規化方法 | 輸入天數 | Loss | 輸出結果 |
---|---|---|---|
局部正規 | 60 | ||
局部正規 | 30 | ||
局部正規 | 10 | ||
漲跌幅 | 60 | ||
漲跌幅 | 30 | ||
漲跌幅 | 10 |
從天數來看,或許是資料集的關係,小天數的效果好像更好些。其中比較令我意外的是我使用漲跌幅和輸入60天的資料的結果,這是第一次成功預測出比紅線更高的結果,畢竟test data是歷史最高嘛~ 難得!
不過真正特別的不是天數,是正規化方法,兩個不同的方法得出來的結果可以是是天差地遠!!
我真的沒有想過會差這麼多,不論Loss或是或是pred。我不確定我的思路是不是對的,我嘗試著解釋看看...
正規方法 | 預測線特徵 | 資料特徵 |
---|---|---|
局部正規 | 不太穩定,與紅線細節上差異許多 | LOSS非常難收斂,但有更多的「預測未來」結果,感覺有更多的參考歷史的感覺 |
漲跌幅 | 線和紅線幾乎如出一轍,就是晚了一天而已 | LOSS收斂速度快,且有更高的能力預測歷史最高最低,但就是隻模仿貓(昨天漲我今天就預測它漲),感覺就是偷吃步了 |
我認為這兩個方法都各有其優點和缺點,現在,我有一個大膽的想法...
如果我將這兩種正規化的方法結合再一起呢?
聽起來好像不賴,明天開測!
LSTM_01 :: local normalization
LSTM_02 :: quote change