在 Machine Learning (ML) 火速發展的這幾年,曾幾何時我也非常嚮往從事股票預測 (Stock Prediction) 的研究方向。但這類領域從一開始就有個偽命題,也就是預測價格。它導致了預測結果永遠延遲當前市價步調,無法達到當初人們想用 ML 達成的目的。因此另一個開拓的方向也就誕生了,也就是不預測價格這麼精細的目的,而是預測趨勢 ! 看當下行情是「做多機率多」,亦或是「做空機率多」。扯遠了~ 我閱讀到的這篇文章是經典的預測價格的方法,有幸從網上得到優質敲門磚 ~ 我拜讀後並記錄學習過程,另外也為未來定下個目標 「實現趨勢預測」 !
git clone https://github.com/Junwu0615/NVDA-Price-Stock-Prediction.git
pip install -r requirements.txt
conda env create -f C:\Users\xxx\environment.yaml
python NVDA-Price-Stock-Prediction.py -h
-h
Help : Show this help message and exit.-open
Open : Add open feature ?T
/F
-high
High : Add high feature ?T
/F
-low
Low : Add low feature ?T
/F
-vol
Volume : Add volume feature ?T
/F
-utm
: Use Trained Model ?T
/F
- 使用「開盤價」、「最高價」、「最低價」、「交易量」, 4 種特徵來預測「收盤價」。
python NVDA-Price-Stock-Prediction.py -open T -high T -low T -vol T -utm F
python NVDA-Price-Stock-Prediction.py -open F -high F -low F -vol T -utm F
python NVDA-Price-Stock-Prediction.py -open F -high F -low F -vol T -utm T
我透過 Financial Modeling Prep 取得我想預測的標的 NVIDIA ,它需要註冊會員以取得 API key,接著使用日線圖的 API 叫出該 Symbol 歷史資料。另外,我已先將其內容存儲成 json 格式 -> NVDA_history_20190225_20240223.json
。
- 原始資料如下圖所示。
-
- 將資料範圍大小,規範於 0 至 1 區間,標準化後的資料如下圖所示。
-
- 接著將資料切割成訓練集 ( 90% ) 和測試集 ( 10% ),任務目標是預測「收盤價」,而其餘特徵都是餵給機器的輸入。
x_train = result[:int(number_train), :-1] y_train = result[:int(number_train), -1][:,-1]
- 模型使用序列神經模型的 GRU (原先文章使用 LSTM),實際跑過一遍後,效果確實也比較好。
- 我有測試幾組實驗,心得是使用雙層神經網路,且第一層維度設置不能比第二層小 (1024, 1024)。
- 丟失率
0.6
左右比較好,可以自行嘗試看看。批量大小依照原先設定128
,epoch 設定200
。 - 都設置好即可以開始訓練模型 ! (我起初玩 ML 流程都沒有這麼短...哩哩叩叩要設定一堆)
- 將結果還回正常區間後,用 Matplotlib 檢視成果 ( 因為不可能預測得到精確的數字,所以用趨勢的方式來檢視 )。 可參考
STEP.5 EXAMPLE
。另外有趣的是用單一特徵反而比多特徵效果還來的好,不知什麼原因 @@?