簡(jiǎn)單講解三種時(shí)間序列預(yù)測(cè)方法
時(shí)間序列預(yù)測(cè)是根據(jù)歷史數(shù)據(jù)預(yù)測(cè)未來值的任務(wù)??缧袠I(yè)的例子包括天氣、銷售數(shù)字和股票價(jià)格的預(yù)測(cè)。最近,它已被應(yīng)用于預(yù)測(cè)比特幣等加密貨幣的價(jià)格趨勢(shì)。鑒于時(shí)間序列預(yù)測(cè)應(yīng)用在各行各業(yè)的盛行,每個(gè)數(shù)據(jù)科學(xué)家都應(yīng)該對(duì)時(shí)間序列預(yù)測(cè)的可用方法有所了解。
有多種方法可用于時(shí)間序列預(yù)測(cè)。最常用的一種是自回歸移動(dòng)平均 (ARMA),這是一種使用過去值預(yù)測(cè)未來值的統(tǒng)計(jì)模型。然而,這種方法有缺陷,因?yàn)樗鼪]有捕捉季節(jié)性趨勢(shì)。它還假設(shè)時(shí)間序列數(shù)據(jù)是平穩(wěn)的,這意味著其統(tǒng)計(jì)屬性不會(huì)隨時(shí)間變化。這種類型的行為是一種理想化的假設(shè),在實(shí)踐中并不成立,這意味著 ARMA 可能會(huì)提供有偏差的結(jié)果。
ARMA的擴(kuò)展是自回歸綜合移動(dòng)平均(ARIMA)模型,該模型不假設(shè)平穩(wěn)性,但仍假設(shè)數(shù)據(jù)幾乎沒有季節(jié)性。幸運(yùn)的是,Seasonal ARIMA (SARIMA)變體是一種統(tǒng)計(jì)模型,可以處理非平穩(wěn)數(shù)據(jù)并捕獲一些季節(jié)性。
Python 提供了許多易于使用的庫和工具來執(zhí)行時(shí)間序列預(yù)測(cè)。具體來說,Python 中的stats庫提供了只需幾行代碼即可構(gòu)建 ARMA、ARIMA 和 SARIMA 模型的工具。由于所有這些模型都在單個(gè)庫中可用,因此您可以在同一腳本或筆記本中使用不同模型輕松運(yùn)行許多實(shí)驗(yàn)。
接下來我們來學(xué)習(xí)如何構(gòu)建ARMA、ARIMA和SARIMA模型來預(yù)測(cè)比特幣(BTC)未來價(jià)格。
讀取和顯示BTC時(shí)間序列數(shù)據(jù)
使用Pandas數(shù)據(jù)閱讀器讀取BTC的歷史價(jià)格:
打開Python腳本并從 Pandas庫中導(dǎo)入數(shù)據(jù)讀取器:
導(dǎo)入Pandas庫本身并放寬列和行的顯示限制:
導(dǎo)入日期時(shí)間庫,定義數(shù)據(jù)拉取的開始和結(jié)束日期:
現(xiàn)在已經(jīng)做好了提取比特幣價(jià)格時(shí)間序列數(shù)據(jù)所需的一切準(zhǔn)備工作,接下來正式開始。

圖中數(shù)據(jù)框包含許多列,來看看每列的含義:
日期:這是我們時(shí)間序列中的索引,用于指定與價(jià)格相關(guān)的日期。
收盤價(jià):當(dāng)天購買BTC的最后價(jià)格。
開盤價(jià):當(dāng)天購買BTC的第一個(gè)價(jià)格。
高:當(dāng)天購買BTC的最高價(jià)格。
低:當(dāng)天購買BTC的最低價(jià)格。
成交量:當(dāng)天的總交易次數(shù)。
Adj Close:根據(jù)股息和股票分割調(diào)整的收盤價(jià)。
我們將在我們的預(yù)測(cè)模型中使用收盤價(jià),具體來說,我們將使用歷史收盤BTC價(jià)格來預(yù)測(cè)未來的BTC價(jià)格。
讓我們將收盤價(jià)BTC數(shù)據(jù)寫入csv文件。這樣,我們就可以避免使用Pandas數(shù)據(jù)讀取器重復(fù)拉取數(shù)據(jù)。
讀入csv文件并顯示前五行:

為了使用stats庫提供的模型,需要將日期列設(shè)置為數(shù)據(jù)框索引,使用 to_datetime方法格式化該日期:
現(xiàn)在日期是索引,我們可以刪除日期列:
顯示數(shù)據(jù)框:

繪制我們的時(shí)間序列數(shù)據(jù),導(dǎo)入數(shù)據(jù)可視化庫Seaborn和Matplotlib:
使用Seaborn來格式化可視化:
并使用Matplotlib標(biāo)記y軸和x軸。將調(diào)整x軸上的日期,以便它們更易于閱讀:
最后,使用Matplotlib生成我們的繪圖:

繼續(xù)構(gòu)建第一個(gè)時(shí)間序列模型,即自回歸移動(dòng)平均線。
為訓(xùn)練和測(cè)試拆分?jǐn)?shù)據(jù)
模型構(gòu)建的一個(gè)重要部分是拆分我們的數(shù)據(jù)以進(jìn)行訓(xùn)練和測(cè)試。拆分用于訓(xùn)練和測(cè)試的數(shù)據(jù)可確保您構(gòu)建的模型可以在訓(xùn)練數(shù)據(jù)之外進(jìn)行泛化,并確保性能和輸出具有統(tǒng)計(jì)意義。
拆分?jǐn)?shù)據(jù),使得2020年11月之前的所有數(shù)據(jù)都作為訓(xùn)練數(shù)據(jù),2020年之后的所有數(shù)據(jù)都成為測(cè)試數(shù)據(jù):

自回歸移動(dòng)平均線 (ARMA)
ARMA 中的術(shù)語“自回歸”意味著該模型使用過去的值來預(yù)測(cè)未來的值。具體來說,預(yù)測(cè)值是過去值的加權(quán)線性組合。這種回歸方法類似于線性回歸,不同的是這里的特征輸入是歷史值。
移動(dòng)平均是指由白噪聲項(xiàng)的加權(quán)線性組合表示的預(yù)測(cè),其中白噪聲是隨機(jī)信號(hào)。這里的想法是ARMA使用過去值和白噪聲的組合來預(yù)測(cè)未來值。自回歸模擬市場(chǎng)參與者的行為,例如買賣 BTC。白噪聲模擬戰(zhàn)爭(zhēng)、經(jīng)濟(jì)衰退和政治事件等沖擊事件。
我們可以使用SARIMAX包定義ARMA模型:
定義輸入:
定義模型,使用SARIMAX類定義ARMA模型,傳入 (1, 0 ,1) 的順序參數(shù):
ARMAmodel = SARIMAX(y, order = (1, 0, 1))
擬合模型:
生成預(yù)測(cè):
繪制結(jié)果:

使用均方根誤差來評(píng)估性能:

RMSE相當(dāng)高,我們可以在檢查圖時(shí)猜到。不幸的是,當(dāng)價(jià)格實(shí)際上漲時(shí),該模型預(yù)測(cè)價(jià)格會(huì)下降。同樣,ARMA的局限性在于它對(duì)非平穩(wěn)時(shí)間序列失敗并且不能捕捉季節(jié)性。讓我們看看我們是否可以使用ARIMA提高性能
自回歸綜合移動(dòng)平均線 (ARIMA)
從stats庫中導(dǎo)入ARIMA包:
ARIMA 任務(wù)具有三個(gè)參數(shù):
第一個(gè)參數(shù)對(duì)應(yīng)于滯后(過去的值);
第二個(gè)對(duì)應(yīng)于差分(這是使非平穩(wěn)數(shù)據(jù)平穩(wěn)的原因);
最后一個(gè)參數(shù)對(duì)應(yīng)于白噪聲(用于模擬沖擊事件)。
用順序參數(shù)(2,2,2)定義一個(gè)ARIMA模型:

圖中看到ARIMA預(yù)測(cè)(黃色)落在ARMA預(yù)測(cè)之上,接下來嘗試將差分參數(shù)增加到ARIMA(2,3,2):

感覺這有助于捕捉價(jià)格上漲的方向,接著嘗試使用 ARIMA(5,4,2) 進(jìn)一步調(diào)整參數(shù):

RMSE為793,比ARMA好。
最后,測(cè)試加入季節(jié)性的SARIMA是否會(huì)進(jìn)一步提高性能。
Seasonal ARIMA (SARIMA)
Seasonal ARIMA捕捉歷史價(jià)值、沖擊事件和季節(jié)性。我們可以使用SARIMAX類定義一個(gè)SARIMA模型:

這里我們的RMSE為966,比ARIMA稍差。這可能是由于缺乏超參數(shù)調(diào)整。如果我們使用SARIMA模型的參數(shù),我們應(yīng)該能夠進(jìn)一步提高性能。
如果又大神可以使用超參數(shù),看看是否可以構(gòu)建一個(gè)性能優(yōu)于ARIMA的SARIMA模型。此外,也可以使用網(wǎng)格搜索等方法通過算法找到每個(gè)模型的最佳參數(shù)。
本文代碼:
https://github.com/spierre91/builtiin/blob/main/time_series_forecasting.py
總結(jié)
時(shí)間序列預(yù)測(cè)是許多數(shù)據(jù)科學(xué)團(tuán)隊(duì)面臨的跨行業(yè)常見任務(wù)。充分了解可用的常用工具和方法將使數(shù)據(jù)科學(xué)家能夠快速運(yùn)行新實(shí)驗(yàn)并生成結(jié)果。了解每個(gè)模型中參數(shù)的重要性,例如滯后參數(shù)、差分、白噪聲和季節(jié)性,可以為構(gòu)建簡(jiǎn)單的時(shí)間序列模型奠定基礎(chǔ)。這也為理解一些可用的更高級(jí)技術(shù)奠定了良好的基礎(chǔ)。
能夠準(zhǔn)確可靠地預(yù)測(cè)未來事件是一項(xiàng)寶貴的技能,在加密貨幣和傳統(tǒng)金融市場(chǎng)之外也有應(yīng)用。但是始終記得,對(duì)于任何數(shù)據(jù)科學(xué)家來說,無論他們從事什么行業(yè),熟悉基礎(chǔ)知識(shí)都是有用的。
如果你想要學(xué)習(xí)時(shí)間序列方面的相關(guān)知識(shí),需要積累時(shí)間序列方面的項(xiàng)目經(jīng)驗(yàn),可以學(xué)習(xí)下圖中的項(xiàng)目課程。
原文鏈接:
https://pub.towardsai.net/time-series-forecasting-in-python-4e7d65580b9
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
