python用ARIMA模型預(yù)測CO2濃度時(shí)間序列實(shí)現(xiàn)|附代碼數(shù)據(jù)
全文下載鏈接:http://tecdat.cn/?p=20424
時(shí)間序列為預(yù)測未來數(shù)據(jù)提供了方法。根據(jù)先前的值,時(shí)間序列可用于預(yù)測經(jīng)濟(jì),天氣的趨勢。時(shí)間序列數(shù)據(jù)的特定屬性意味著通常需要專門的統(tǒng)計(jì)方法?(?點(diǎn)擊文末“閱讀原文”獲取完整代碼數(shù)據(jù)********?)?。
在本教程中,我們將首先介紹和討論自相關(guān),平穩(wěn)性和季節(jié)性的概念,然后繼續(xù)應(yīng)用最常用的時(shí)間序列預(yù)測方法之一,稱為ARIMA。
Python中可用的一種用于建模和預(yù)測時(shí)間序列的未來點(diǎn)的方法稱為?SARIMAX,它表示帶有季節(jié)性回歸的?季節(jié)性自回歸綜合移動平均線。在這里,我們將主要關(guān)注ARIMA,用于擬合時(shí)間序列數(shù)據(jù)以更好地理解和預(yù)測時(shí)間序列中的未來點(diǎn)。
為了充分利用本教程,熟悉時(shí)間序列和統(tǒng)計(jì)信息可能會有所幫助。
在本教程中,我們將使用?Jupyter Notebook?處理數(shù)據(jù)。
第1步-安裝軟件包
要設(shè)置我們的時(shí)間序列預(yù)測環(huán)境:
cd environments
. my_env/bin/activate
從這里開始,為我們的項(xiàng)目創(chuàng)建一個(gè)新目錄。
mkdir ARIMAcd ARIMA
現(xiàn)在?我們安裝?statsmodels
和數(shù)據(jù)繪圖軟件包?matplotlib
。
pip?install?pandas numpy statsmodels matplotlib
第2步-導(dǎo)入包并加載數(shù)據(jù)
要開始使用我們的數(shù)據(jù),我們將啟動Jupyter Notebook:
要?jiǎng)?chuàng)建新的筆記本文件,請?從右上方的下拉菜單中選擇“?新建”??>“??Python 3?”:

首先導(dǎo)入所需的庫:
import warningsimport itertoolsimport pandas as pdimport numpy as npimport statsmodels.api as smimport matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
我們將使用CO2數(shù)據(jù)集,該數(shù)據(jù)集收集了從1958年3月至2001年12月CO2樣本。我們可以將這些數(shù)據(jù)引入如下:
y?=?data.data
讓我們對數(shù)據(jù)進(jìn)行一些預(yù)處理。每周數(shù)據(jù)處理起來比較麻煩,因?yàn)闀r(shí)間比較短,所以讓我們使用每月平均值。我們還可以使用 fillna()?函數(shù)?來確保時(shí)間序列中沒有缺失值。
# “ MS”字符串按月初將數(shù)據(jù)分組到存儲中y = y['co2'].resample('MS').mean()# 填充缺失值y = y.fillna(y.bfill())
Outputco21958-03-01 ?316.1000001958-04-01 ?317.2000001958-05-01 ?317.433333...2001-11-01 ?369.3750002001-12-01 ?371.020000
讓我們用數(shù)據(jù)可視化探索這個(gè)時(shí)間序列:
plt.show()

當(dāng)我們繪制數(shù)據(jù)時(shí),可以發(fā)現(xiàn)時(shí)間序列具有明顯的季節(jié)性模式,并且總體趨勢呈上升趨勢。
點(diǎn)擊標(biāo)題查閱往期內(nèi)容

R語言中的時(shí)間序列分析模型:ARIMA-ARCH / GARCH模型分析股票價(jià)格

左右滑動查看更多

01

02

03
04

現(xiàn)在,我們繼續(xù)使用ARIMA進(jìn)行時(shí)間序列預(yù)測。
第3步-ARIMA時(shí)間序列模型
在時(shí)間序列預(yù)測中使用的最常見的方法是被稱為ARIMA模型。ARIMA是可以擬合時(shí)間序列數(shù)據(jù)的模型,以便更好地理解或預(yù)測序列中的未來點(diǎn)。
有三種不同的整數(shù)(p
,??d
,??q
)是用來參數(shù)化ARIMA模型。因此,ARIMA模型用符號表示?ARIMA(p, d, q)
。這三個(gè)參數(shù)共同說明了數(shù)據(jù)集中的季節(jié)性,趨勢和噪聲:
p
?是模型的?自回歸?部分。它使我們能夠?qū)⑦^去值的影響納入模型。從直覺上講,這類似于聲明如果過去三天天氣一直溫暖,明天可能會溫暖。d
?是?模型的差分部分。包含了要應(yīng)用于時(shí)間序列的差分量(即,要從當(dāng)前值中減去的過去時(shí)間點(diǎn)的數(shù)量)。從直覺上講,這類似于如果最近三天的溫差很小,則明天的溫度可能相同。q
?是?模型的?_移動平均_部分。這使我們可以將模型的誤差設(shè)置為過去在先前時(shí)間點(diǎn)觀察到的誤差值的線性組合。
在處理季節(jié)性影響時(shí),我們使用?季節(jié)性?ARIMA(表示為)??ARIMA(p,d,q)(P,D,Q)s
。這里,?(p, d, q)
?是非季節(jié)參數(shù),盡管?(P, D, Q)
?遵循相同的定義,但適用于時(shí)間序列的季節(jié)分量。該術(shù)語?s
?是時(shí)間序列的周期性(4
?季度,?12
?每年)。
相關(guān)視頻
**
拓端
,贊7
**
拓端
,贊6
**
拓端
,贊9
**
拓端
,贊6
**
拓端
,贊17
**
拓端
,贊13
**
拓端
,贊17
在下一節(jié)中,我們將描述如何為季節(jié)性ARIMA時(shí)間序列模型自動識別最佳參數(shù)的過程。
第4步-ARIMA時(shí)間序列模型的參數(shù)選擇
當(dāng)希望使用季節(jié)性ARIMA模型擬合時(shí)間序列數(shù)據(jù)時(shí),我們的首要目標(biāo)是找到ARIMA(p,d,q)(P,D,Q)s
?可優(yōu)化目標(biāo)指標(biāo)的值?。有許多準(zhǔn)則和最佳實(shí)踐可以實(shí)現(xiàn)此目標(biāo),但是ARIMA模型的正確參數(shù)化可能是艱苦的手動過程,需要領(lǐng)域?qū)I(yè)知識和時(shí)間。其他統(tǒng)計(jì)編程語言(例如)?R
?提供?解決此問題的自動化方法,但這些方法尚未移植到Python。在本節(jié)中,我們將通過編寫Python代碼以編程方式選擇ARIMA(p,d,q)(P,D,Q)s
?時(shí)間序列模型的最佳參數(shù)值來解決此問題?。
我們將使用“網(wǎng)格搜索”來迭代探索參數(shù)的不同組合。對于每種參數(shù)組合,我們使用?模塊中的SARIMAX()
?擬合新的季節(jié)性ARIMA模型。探索了整個(gè)參數(shù)范圍,我們的最佳參數(shù)集便會成為產(chǎn)生最佳性能的一組參數(shù)。讓我們首先生成我們要評估的各種參數(shù)組合:
#定義p,d和q參數(shù),使其取0到2之間的任何值p = d = q = range(0, 2)
# 生成p、q和q三元組的所有不同組合
pdq = list(itertools.product(p, d, q))
# 生成所有不同的季節(jié)性p,q和q組合
seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
Output
Examples of parameter combinations for Seasonal ARIMA...SARIMAX: (0, 0, 1) x (0, 0, 1, 12)SARIMAX: (0, 0, 1) x (0, 1, 0, 12)SARIMAX: (0, 1, 0) x (0, 1, 1, 12)SARIMAX: (0, 1, 0) x (1, 0, 0, 12)
現(xiàn)在,我們可以使用上面定義的三元組參數(shù)來自動化訓(xùn)練和評估不同組合上的ARIMA模型的過程。在統(tǒng)計(jì)和機(jī)器學(xué)習(xí)中,此過程稱為用于模型選擇的網(wǎng)格搜索(或超參數(shù)優(yōu)化)。
在評估和比較不同參數(shù)的統(tǒng)計(jì)模型時(shí),可以根據(jù)其擬合數(shù)據(jù)的程度或其準(zhǔn)確預(yù)測未來數(shù)據(jù)點(diǎn)的能力來對每個(gè)模型進(jìn)行排名。我們將使用?AIC
?(Akaike Information Criterion)值,該值可通過使用擬合的ARIMA模型方便地返回?statsmodels
。AIC
?在考慮模型整體復(fù)雜性的同時(shí),?測量模型擬合數(shù)據(jù)的程度。與使用較少特征以達(dá)到相同擬合優(yōu)度的模型相比,在使用大量特征的模型將獲得更大的AIC得分。因此,我們尋找產(chǎn)生最低AIC
?的模型?。
下面的代碼塊通過參數(shù)組合進(jìn)行迭代,并使用中的?SARIMAX
?函數(shù)?statsmodels
?來擬合相應(yīng)的Season ARIMA模型。擬合每個(gè)?SARIMAX()
模型后,代碼將輸出出它們各自的?AIC
?分?jǐn)?shù)。
warnings.filterwarnings("ignore") # 指定忽略警告消息
? ? ? ?try: ? ? ? ? ? ?mod = sm.tsa.statespace.SARIMAX(y, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?order=param, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?seasonal_order=param_seasonal, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?enforce_stationarity=False, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?enforce_invertibility=False)
上面的代碼產(chǎn)生以下結(jié)果
Output
SARIMAX(0, 0, 0)x(0, 0, 1, 12) - AIC:6787.3436240402125SARIMAX(0, 0, 0)x(0, 1, 1, 12) - AIC:1596.711172764114SARIMAX(0, 0, 0)x(1, 0, 0, 12) - AIC:1058.9388921320026SARIMAX(0, 0, 0)x(1, 0, 1, 12) - AIC:1056.2878315690562SARIMAX(0, 0, 0)x(1, 1, 0, 12) - AIC:1361.6578978064144SARIMAX(0, 0, 0)x(1, 1, 1, 12) - AIC:1044.7647912940095...
...
...SARIMAX(1, 1, 1)x(1, 0, 0, 12) - AIC:576.8647112294245SARIMAX(1, 1, 1)x(1, 0, 1, 12) - AIC:327.9049123596742SARIMAX(1, 1, 1)x(1, 1, 0, 12) - AIC:444.12436865161305SARIMAX(1, 1, 1)x(1, 1, 1, 12) - AIC:277.7801413828764
代碼的輸出表明,?SARIMAX(1, 1, 1)x(1, 1, 1, 12)
?該AIC
?值的最低?值為277.78。因此,在我們考慮的所有模型中,我們應(yīng)該將其視為最佳選擇。
步驟5 —擬合ARIMA時(shí)間序列模型
使用網(wǎng)格搜索,我們確定了一組參數(shù),這些參數(shù)對我們的時(shí)間序列數(shù)據(jù)產(chǎn)生了最佳擬合模型。我們可以繼續(xù)更深入地分析此模型。
我們將從將最佳參數(shù)值插入新?SARIMAX
?模型開始:
results?= mod.fit()
Output
============================================================================== ? ? ? ? ? ? ? ? coef ? ?std err ? ? ? ? ?z ? ? ?P>|z| ? ? ?[0.025 ? ? ?0.975]
------------------------------------------------------------------------------ar.L1 ? ? ? ? ?0.3182 ? ? ?0.092 ? ? ?3.443 ? ? ?0.001 ? ? ? 0.137 ? ? ? 0.499
ma.L1 ? ? ? ? -0.6255 ? ? ?0.077 ? ? -8.165 ? ? ?0.000 ? ? ?-0.776 ? ? ?-0.475
ar.S.L12 ? ? ? 0.0010 ? ? ?0.001 ? ? ?1.732 ? ? ?0.083 ? ? ?-0.000 ? ? ? 0.002
ma.S.L12 ? ? ?-0.8769 ? ? ?0.026 ? ?-33.811 ? ? ?0.000 ? ? ?-0.928 ? ? ?-0.826sigma2 ? ? ? ? 0.0972 ? ? ?0.004 ? ? 22.634 ? ? ?0.000 ? ? ? 0.089 ? ? ? 0.106
==============================================================================
summary
?輸出結(jié)果產(chǎn)生的?屬性?SARIMAX
?返回了大量信息,但是我們將注意力集中在系數(shù)上。?coef
?列顯示每個(gè)函數(shù)的權(quán)重(即重要性)以及每個(gè)函數(shù)如何影響時(shí)間序列。?P>|z|
?列告知我們每個(gè)特征權(quán)重的重要性。在這里,每個(gè)權(quán)重的p值都小于或接近?0.05
,因此將所有權(quán)重保留在我們的模型中是合理的。
在擬合季節(jié)性ARIMA模型時(shí),重要的是運(yùn)行模型診斷程序,以確保沒有違反模型所做的假設(shè)。
plt.show()

我們主要關(guān)心的是確保模型的殘差不相關(guān)并且零均值正態(tài)分布。如果季節(jié)性ARIMA模型不滿足這些屬性,則表明它可以進(jìn)一步改善。
在這種情況下,我們的模型診斷建議根據(jù)以下內(nèi)容正態(tài)分布模型殘差:
在右上角的圖中,我們看到紅線?
KDE
?靠近?N(0,1)
?紅線,(其中?N(0,1)
)是均值0
?和標(biāo)準(zhǔn)偏差?為的正態(tài)分布。這很好地表明了殘差呈正態(tài)分布。?左下方的 qq圖顯示,殘差(藍(lán)色點(diǎn))分布遵循從標(biāo)準(zhǔn)正態(tài)分布。同樣,表明殘差是正態(tài)分布的。
隨時(shí)間推移的殘差(左上圖)沒有顯示任何明顯的季節(jié)性變化,而是白噪聲。右下方的自相關(guān)(即相關(guān)圖)圖證實(shí)了這一點(diǎn),該圖表明時(shí)間序列殘差有較低的相關(guān)性。
這些觀察結(jié)果使我們得出結(jié)論,我們的模型產(chǎn)生了令人滿意的擬合度,可以幫助我們理解時(shí)間序列數(shù)據(jù)并預(yù)測未來價(jià)值。
盡管我們具有令人滿意的擬合度,但可以更改季節(jié)性ARIMA模型的某些參數(shù)以改善模型擬合度。因此,如果擴(kuò)大網(wǎng)格搜索范圍,我們可能會找到更好的模型。
第6步-驗(yàn)證預(yù)測
我們已經(jīng)為時(shí)間序列獲得了模型,現(xiàn)在可以將其用于產(chǎn)生預(yù)測。我們首先將預(yù)測值與時(shí)間序列的實(shí)際值進(jìn)行比較,這將有助于我們了解預(yù)測的準(zhǔn)確性。
pred_ci?= pred.conf_int()
上面的代碼表示預(yù)測從1998年1月開始。
我們可以繪制CO2時(shí)間序列的實(shí)際值和預(yù)測值,評估我們的效果。
ax.fill_between(pred_ci.index,
? ? ? ? ? ? ? ?pred_ci.iloc[:, 0],
? ? ? ? ? ? ? ?pred_ci.iloc[:, 1], color='k', alpha=.2)
plt.show()
總體而言,我們的預(yù)測與真實(shí)值非常吻合,顯示出總體增長趨勢。
量化我們的預(yù)測準(zhǔn)確性也很有用。我們將使用MSE(均方誤差)來總結(jié)我們預(yù)測的平均誤差。對于每個(gè)預(yù)測值,我們計(jì)算其與真實(shí)值的差異并將結(jié)果平方。對結(jié)果進(jìn)行平方,在計(jì)算總體均值時(shí)正/負(fù)差不會互相抵消。
y_truth = y['1998-01-01':]# 計(jì)算均方誤差mse = ((y_forecasted - y_truth) ** 2).mean()
Output
我們的預(yù)測均方誤差為 0.07
我們提前一步進(jìn)行預(yù)測的MSE得出的值為?0.07
,因?yàn)樗咏?,因此非常低。如果MSE為0,則估算以理想的精度預(yù)測參數(shù)的觀測值,這是理想的情況,但是這通常是不可能的。
但是,使用動態(tài)預(yù)測可以更好地表示我們的真實(shí)預(yù)測能力。在這種情況下,我們僅使用時(shí)間序列中直到某個(gè)特定點(diǎn)的信息,之后,將使用以前的預(yù)測時(shí)間點(diǎn)中的值生成預(yù)測。
在下面的代碼塊中,我們指定從1998年1月起開始計(jì)算動態(tài)預(yù)測和置信區(qū)間。
通過繪制時(shí)間序列的觀察值和預(yù)測值,我們可以看到,即使使用動態(tài)預(yù)測,總體預(yù)測也是準(zhǔn)確的。所有預(yù)測值(紅線)與真實(shí)情況(藍(lán)線)非常接近,并且都在我們預(yù)測的置信區(qū)間內(nèi)。
我們再次通過計(jì)算MSE來量化預(yù)測的效果:
# 提取時(shí)間序列的預(yù)測值和真實(shí)值y_forecasted = pred_dynamic.predicted_meany_truth = y['1998-01-01':]# 計(jì)算均方誤差mse = ((y_forecasted - y_truth) ** 2).mean()
print('The Mean Squared Error of our forecasts is {}'.format(round(mse, 2)))
Output
我們的預(yù)測均方誤差為 1.01
從動態(tài)預(yù)測獲得的預(yù)測值產(chǎn)生的MSE為1.01。這比前面的略高,這是可以預(yù)期的,因?yàn)槲覀兯蕾嚨臅r(shí)間序列的歷史數(shù)據(jù)較少。
提前一步和動態(tài)預(yù)測都確認(rèn)此時(shí)間序列模型有效。但是,時(shí)間序列預(yù)測的興趣在于能夠提前預(yù)測未來值。
第7步-生成和可視化預(yù)測
最后,我們描述了如何利用季節(jié)性ARIMA時(shí)間序列模型來預(yù)測未來數(shù)據(jù)。
# 獲取未來500步的預(yù)測pred_uc = results.get_forecast(steps=500)# 獲取預(yù)測的置信區(qū)間pred_ci = pred_uc.conf_int()

我們可以使用此代碼的輸出來繪制時(shí)間序列并預(yù)測其未來值。
?

現(xiàn)在,我們所生成的預(yù)測和相關(guān)的置信區(qū)間都可以用于進(jìn)一步了解時(shí)間序列并預(yù)測預(yù)期結(jié)果。我們的預(yù)測表明,時(shí)間序列預(yù)計(jì)將繼續(xù)穩(wěn)定增長。
隨著我們對未來的進(jìn)一步預(yù)測,置信區(qū)間會越來越大。
結(jié)論
在本教程中,我們描述了如何在Python中實(shí)現(xiàn)季節(jié)性ARIMA模型。展示了如何進(jìn)行模型診斷以及如何生成二氧化碳時(shí)間序列的預(yù)測。
您可以嘗試以下一些其他操作:
更改動態(tài)預(yù)測的開始日期,以了解這如何影響預(yù)測的整體質(zhì)量。
嘗試更多的參數(shù)組合,以查看是否可以提高模型的擬合優(yōu)度。
選擇其他指標(biāo)選擇最佳模型。例如,我們使用該?
AIC
?找到最佳模型。

本文摘選?《?ARIMA模型預(yù)測CO2濃度時(shí)間序列-python實(shí)現(xiàn)?》?,點(diǎn)擊“閱讀原文”獲取全文完整資料。
點(diǎn)擊標(biāo)題查閱往期內(nèi)容
R語言ARIMA-GARCH波動率模型預(yù)測股票市場蘋果公司日收益率時(shí)間序列
R語言中的時(shí)間序列分析模型:ARIMA-ARCH / GARCH模型分析股票價(jià)格
R語言多元Copula GARCH 模型時(shí)間序列預(yù)測
python中的copula:Frank、Clayton和Gumbel copula模型估計(jì)與可視化
R語言中的copula GARCH模型擬合時(shí)間序列并模擬分析
matlab使用Copula仿真優(yōu)化市場風(fēng)險(xiǎn)數(shù)據(jù)VaR分析
R語言多元Copula GARCH 模型時(shí)間序列預(yù)測
R語言Copula函數(shù)股市相關(guān)性建模:模擬Random Walk(隨機(jī)游走)
R語言實(shí)現(xiàn) Copula 算法建模依賴性案例分析報(bào)告
R語言ARMA-GARCH-COPULA模型和金融時(shí)間序列案例
R語言基于copula的貝葉斯分層混合模型的診斷準(zhǔn)確性研究
R語言COPULA和金融時(shí)間序列案例
matlab使用Copula仿真優(yōu)化市場風(fēng)險(xiǎn)數(shù)據(jù)VaR分析
matlab使用Copula仿真優(yōu)化市場風(fēng)險(xiǎn)
R語言多元CopulaGARCH模型時(shí)間序列預(yù)測
R語言Copula的貝葉斯非參數(shù)MCMC估計(jì)
R語言COPULAS和金融時(shí)間序列R語言乘法GARCH模型對高頻交易數(shù)據(jù)進(jìn)行波動性預(yù)測
R語言GARCH-DCC模型和DCC(MVT)建模估計(jì)
Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模擬進(jìn)行股價(jià)預(yù)測
R語言時(shí)間序列GARCH模型分析股市波動率
R語言ARMA-EGARCH模型、集成預(yù)測算法對SPX實(shí)際波動率進(jìn)行預(yù)測
matlab實(shí)現(xiàn)MCMC的馬爾可夫轉(zhuǎn)換ARMA - GARCH模型估計(jì)
Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模擬進(jìn)行股價(jià)預(yù)測
使用R語言對S&P500股票指數(shù)進(jìn)行ARIMA + GARCH交易策略
R語言用多元ARMA,GARCH ,EWMA, ETS,隨機(jī)波動率SV模型對金融時(shí)間序列數(shù)據(jù)建模
R語言股票市場指數(shù):ARMA-GARCH模型和對數(shù)收益率數(shù)據(jù)探索性分析
R語言多元Copula GARCH 模型時(shí)間序列預(yù)測
R語言使用多元AR-GARCH模型衡量市場風(fēng)險(xiǎn)
R語言中的時(shí)間序列分析模型:ARIMA-ARCH / GARCH模型分析股票價(jià)格
R語言用Garch模型和回歸模型對股票價(jià)格分析
GARCH(1,1),MA以及歷史模擬法的VaR比較
matlab估計(jì)arma garch 條件均值和方差模型
R語言ARMA-GARCH-COPULA模型和金融時(shí)間序列案例