沒有看過基礎概念的請先看這篇

http://hn28082251.blogspot.com/2019/04/python-stocker.html

本次要教的是如何使用Changepoint Prior,來進行模型調整

官方說明如後

Changepoints represent where a time series goes from increasing to decreasing or from increasing slowly to increasingly rapidly (or vice versa). They occur at the places with the greatest change in the rate of the time series. The changepoint prior scale represents the amount of emphasis given to the changepoints in the model. This is used to control overfitting vs. underfitting (also known as the bias vs. variance tradeoff).

簡單的來說就是控制overfitting(過擬和) 跟 underfitting(欠擬和)

overfitting(過擬和)是指,使用過多參數,以致太適應資料,太適應資料可能會在未來預測的時候失準

underfitting(欠擬和)是使用太少參數,以致於不適應資料

本次資料以VTI(Vanguard Total Stock Market ETF)為例,這是我在美股的持股之一,資料集幫大家整理好了,請點選下方連結下載
https://drive.google.com/file/d/1gNPEnttLHBrbfUoiPU41ZMZmJsFy_Z8u/view?usp=sharing

在基礎教學中,我們已經學會如何快速建模,不過我們要來評估模型的預測效果如何,就用下方的程式碼來用過去資料來看看三個月前開始預測效果如何

vti.evaluate_prediction(start_date='2019-02-04', end_date='2019-05-14')

紅線之前代表訓練集的數據,紅線後代表開始預測,可以看得出來,並不是很理想!!!

但不要因此放棄,因為一開始全部都使用默認的參數,所以我們要開始去調整我們的模型,

趨勢變化過度擬合(靈活性太大)或不足(靈活性不夠),我們可以使用輸入參數調整稀疏之前的強度changepoint_prior_scale。默認情況下,此參數預設為0.05。增加它將使趨勢更加靈活

我們輸入下方這行程式碼並且執行

vti.changepoint_prior_analysis(changepoint_priors=[0.001, 0.05, 0.1, 0.2]) 

可以看到在不同的changepoint_priors下,擬合的狀況也不太相同

接下來我們在更詳細的比較不同的changepoint_priors下,一些其他的參考值

vti.changepoint_prior_validation(start_date='2018-01-04', end_date='2019-01-03', changepoint_priors=[0.001, 0.05, 0.1,0.15, 0.2, 0.25,0.4, 0.5, 0.6])

基於不同changepoint_priors下,訓練和測試準確性曲線和不確定性曲線

大致上可以看得出來,在changepoint_priors=0.25的時候效果較好

於是我們就把changepoint_prior_scale設成0.25吧!請加入下方的程式碼並執行

vti.changepoint_prior_scale = 0.25

然後再去看我們的模型

一樣用下方的程式碼

vti.evaluate_prediction(start_date='2019-02-04', end_date='2019-05-14')

可以看得出來預測效果有比較好一些了,這顯示了模型優化的重要性。使用默認值可以提初步預測,但是我們需要調整模型的設定,來讓模型效果更好。

下一篇來談談用優化後的模型來進行預測


本文章並沒有推薦任何投資標的,單純是個人的一些觀察與見解,為作者自行查看相關資料後整理而成,資料之正確性以各官方公告為主,任何人觀看本文之後,而有投資該股票基金或ETF之行為,自行對所有後果負責。 

歡迎分享轉載文章,願每一個人都能夠衣食無虞。 

我將思想傳授他人,他人之所得,亦無損於我之所有;猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。湯瑪斯‧傑弗遜(Thomas Jefferson)