資料準備
我們使用 FinMind 抓取台股資料,時間從 2010~2021 年,語法如下:
簡單檢視一下資料,將以收盤價 Close 爲主要 Lable 進行分析。
可以很明顯看到,在 2020/3 因爲疫情關係下崩,然後開始井噴~
特徵工程
只有 OCHL 及成交量資料是不夠的,通常需要做特徵工程來輔助模型預測,我們使用滯後指標(Lagging Indicator)來輔助預測。
我們使用簡單移動平均線(SMA)、指數移動平均線(EMA)、相對強弱指數 (RSI)及異同平滑移動平均線(MACD)作爲特徵。
SMA:一段期間的股價計算平均值
EMA:根據日期指數遞減加權,計算移動平均值,日期愈近的比重愈高
RSI:觀測買賣超指標
MACD:透過EMA觀測走勢量
接下來要做兩個處理,第一個是將 close 做 t-1 的動作,主要是我們想要用滯後資訊來預測下一日的股價。
第二是刪除掉有 null 的資料,讓資料保持完整性。
最後是訓練資料及驗證資料,畢竟股價會隨著時間越大波動越大,因此驗證資料抓一個月就好。
ARIMA
我們使用 Auto ARIMA 建模,估計 p、d、q 參數,詳細參考這裡。
看到模型結果都笑了,ARIMA(0,0,0) 不就代表白噪音模型 White Noise Model,是無法預測的隨機序列😂。
爲了比較不同演算法能力,我們還是把它做完。
PROPHET
Prophet 是 Facebook 開源的時間序列模型套件,以簡單好上手及多樣的視覺化圖表聞名,詳細可以參考官方文檔。
我們可以使用 model_fbp.plot_components(forecast)
來顯示模型的細節內容。
最後將驗證資料放進去預測看看。
可以看到 Prophet 的表現能力好一點,想深入研究的人可以擴大預測區間或是增加參數,相信模型的預測能力都會有所提升。
從上面實驗結果可以發現,時間序列的 RMSE 並不算太高,但隨着時間拉長應該波動會更大。而且我們是用較穩定的 0050 去預測,如果是個股的話表現應該會更差。
下次我們嘗試使用 Kaggle 流行的演算法試試看,是否能突破時間序列的表現。