arma python 檢驗專題及常見問題 - CSDN

2020-12-23 CSDN技術社區

假如某個觀察值序列通過序列預處理可以判定為平穩非白噪聲序列,就可以利用ARMA模型對該序列進行建模。建模的基本步驟如下:

(1)求出該觀察值序列的樣本自相關係數(ACF)和樣本偏自相關係數(PACF)的值。

(2)根據樣本自相關係數和偏自相關係數的性質,選擇適當的ARMA(p,q)模型進行擬合。

(3)估計模型中位置參數的值。

(4)檢驗模型的有效性。如果模型不通過檢驗,轉向步驟(2),重新選擇模型再擬合。

(5)模型優化。如果擬合模型通過檢驗,仍然轉向不走(2),充分考慮各種情況,建立多個擬合模型,從所有通過檢驗的擬合模型中選擇最優模型。

(6)利用擬合模型,預測序列的將來走勢。

二、代碼實現

1、繪製時序圖,查看數據的大概分布

trainSeting.head()

Out[36]:

date

2017-10-01 126.4

2017-10-02 82.4

2017-10-03 78.1

2017-10-04 51.1

2017-10-05 90.9

Name: sales, dtype: float64

plt.plot(trainSeting)

2、平穩性檢驗

'''進行ADF檢驗

adf_test的返回值

Test statistic:代表檢驗統計量

p-value:代表p值檢驗的概率

Lags used:使用的滯後k,autolag=AIC時會自動選擇滯後

Number of Observations Used:樣本數量

Critical Value(5%) : 顯著性水平為5%的臨界值。

(1)假設是存在單位根,即不平穩;

(2)顯著性水平,1%:嚴格拒絕原假設;5%:拒絕原假設,10%類推。

(3)看P值和顯著性水平a的大小,p值越小,小於顯著性水平的話,就拒絕原假設,認為序列是平穩的;大於的話,不能拒絕,認為是不平穩的

(4)看檢驗統計量和臨界值,檢驗統計量小於臨界值的話,就拒絕原假設,認為序列是平穩的;大於的話,不能拒絕,認為是不平穩的

'''

#滾動統計

def rolling_statistics(timeseries):

#Determing rolling statistics

rolmean = pd.rolling_mean(timeseries, window=12)

rolstd = pd.rolling_std(timeseries, window=12)

#Plot rolling statistics:

orig = plt.plot(timeseries, color='blue',label='Original')

mean = plt.plot(rolmean, color='red', label='Rolling Mean')

std = plt.plot(rolstd, color='black', label = 'Rolling Std')

plt.legend(loc='best')

plt.title('Rolling Mean & Standard Deviation')

plt.show(block=False)

##ADF檢驗

from statsmodels.tsa.stattools import adfuller

def adf_test(timeseries):

rolling_statistics(timeseries)#繪圖

print ('Results of Augment Dickey-Fuller Test:')

dftest = adfuller(timeseries, autolag='AIC')

dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])

for key,value in dftest[4].items():

dfoutput['Critical Value (%s)'%key] = value #增加後面的顯著性水平的臨界值

print (dfoutput)

adf_test(trainSeting) #從結果中可以看到p值為0.1097>0.1,不能拒絕H0,認為該序列不是平穩序列

返回結果如下

Results of Augment Dickey-Fuller Test:

Test Statistic? ? -5.718539e+00

p-value? ? ? 7.028398e-07

#Lags Used? ? ? 0.000000e+00

Number of Observations Used 6.200000e+01

Critical Value (1%)? -3.540523e+00

Critical Value (5%)? -2.909427e+00

Critical Value (10%)? -2.592314e+00

dtype: float64

通過上面可以看到,p值小於0.05,可以認為該序列為平穩時間序列。

3、白噪聲檢驗

'''acorr_ljungbox(x, lags=None, boxpierce=False)函數檢驗無自相關

lags為延遲期數,如果為整數,則是包含在內的延遲期數,如果是一個列表或數組,那麼所有時滯都包含在列表中最大的時滯中

boxpierce為True時表示除開返回LB統計量還會返回Box和Pierce的Q統計量

返回值:

lbvalue:測試的統計量

pvalue:基於卡方分布的p統計量

bpvalue:((optionsal), float or array) – test statistic for Box-Pierce test

bppvalue:((optional), float or array) – p-value based for Box-Pierce test on chi-square distribution

'''

from statsmodels.stats.diagnostic import acorr_ljungbox

def test_stochastic(ts,lag):

p_value = acorr_ljungbox(ts, lags=lag) #lags可自定義

return p_value

test_stochastic(trainSeting,[6,12])

Out[62]: (array([13.28395274, 14.89281684]), array([0.03874194, 0.24735042]))

從上面的分析結果中可以看到,延遲6階的p值為0.03<0.05,因此可以拒絕原假設,認為該序列不是白噪聲序列。

4、確定ARMA的階數

(1)利用自相關圖和偏自相關圖

####自相關圖ACF和偏相關圖PACF

import statsmodels.api as sm

def acf_pacf_plot(ts_log_diff):

sm.graphics.tsa.plot_acf(ts_log_diff,lags=40) #ARIMA,q

sm.graphics.tsa.plot_pacf(ts_log_diff,lags=40) #ARIMA,p

acf_pacf_plot(trainSeting) #查看數據的自相關圖和偏自相關圖

(2)藉助AIC、BIC統計量自動確定

##藉助AIC、BIC統計量自動確定

from statsmodels.tsa.arima_model import ARMA

def proper_model(data_ts, maxLag):

init_bic = float("inf")

init_p = 0

init_q = 0

init_properModel = None

for p in np.arange(maxLag):

for q in np.arange(maxLag):

model = ARMA(data_ts, order=(p, q))

try:

results_ARMA = model.fit(disp=-1, method='css')

except:

continue

bic = results_ARMA.bic

if bic < init_bic:

init_p = p

init_q = q

init_properModel = results_ARMA

init_bic = bic

return init_bic, init_p, init_q, init_properModel

proper_model(trainSeting,40)

#在statsmodels包裡還有更直接的函數:

import statsmodels.tsa.stattools as st

order = st.arma_order_select_ic(ts_log_diff2,max_ar=5,max_ma=5,ic=['aic', 'bic', 'hqic'])

order.bic_min_order

'''

我們常用的是AIC準則,AIC鼓勵數據擬合的優良性但是儘量避免出現過度擬合(Overfitting)的情況。所以優先考慮的模型應是AIC值最小的那一個模型。

為了控制計算量,我們限制AR最大階不超過5,MA最大階不超過5。 但是這樣帶來的壞處是可能為局部最優。

timeseries是待輸入的時間序列,是pandas.Series類型,max_ar、max_ma是p、q值的最大備選值。

order.bic_min_order返回以BIC準則確定的階數,是一個tuple類型

返回值如下:

order.bic_min_order

Out[13]: (1, 0)

5、建模

從上述結果中可以看到,可以選擇AR(1)模型

################################模型######################################

# AR模型,q=0

#RSS是殘差平方和

# disp為-1代表不輸出收斂過程的信息,True代表輸出

from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(trainSeting,order=(1,0,0)) #第二個參數代表使用了二階差分

results_AR = model.fit(disp=-1)

plt.plot(trainSeting)

plt.plot(results_AR.fittedvalues, color='red') #紅色線代表預測值

plt.title('RSS:%.4f' % sum((results_AR.fittedvalues-trainSeting)**2))#殘差平方和

6、預測未來走勢

############################預測未來走勢##########################################

# forecast方法會自動進行差分還原,當然僅限於支持的1階和2階差分

forecast_n = 12 #預測未來12個天走勢

forecast_AR = results_AR.forecast(forecast_n)

forecast_AR = forecast_AR[0]

print (forecast_AR)

print (forecast_ARIMA_log)

[90.49452199 84.05407353 81.92752342 81.22536496 80.99352161 80.91697003

80.89169372 80.88334782 80.88059211 80.87968222 80.87938178 80.87928258]

##將預測的數據和原來的數據繪製在一起,為了實現這一目的,我們需要增加數據索引,使用開源庫arrow:

import arrow

def get_date_range(start, limit, level='day',format='YYYY-MM-DD'):

start = arrow.get(start, format)

result=(list(map(lambda dt: dt.format(format) , arrow.Arrow.range(level, start,limit=limit))))

dateparse2 = lambda dates:pd.datetime.strptime(dates,'%Y-%m-%d')

return map(dateparse2, result)

# 預測從2017-12-03開始,也就是我們訓練數據最後一個數據的後一個日期

new_index = get_date_range('2017-12-03', forecast_n)

forecast_ARIMA_log = pd.Series(forecast_AR, copy=True, index=new_index)

print (forecast_ARIMA_log.head())

##繪圖如下

plt.plot(trainSeting,label='Original',color='blue')

plt.plot(forecast_ARIMA_log, label='Forcast',color='red')

plt.legend(loc='best')

plt.title('forecast')

以上這篇利用python實現平穩時間序列的建模方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。

相關焦點

  • python時間序列平穩性檢驗專題及常見問題 - CSDN
    在做時間序列分析時,我們經常要對時間序列進行平穩性檢驗,而我們常用的軟體是SPSS或SAS,但實際上python也可以用來做平穩性檢驗,而且效果也非常好,今天筆者就講解一下如何用python來做時間序列的平穩性檢驗。首先我們還是來簡單介紹一下平穩性檢驗的相關概念。圖1.
  • f檢驗 matlab專題及常見問題 - CSDN
    Mann-Kendall顯著性檢驗工具:1、MATLAB2、DPS3、示例數據(數據採用的是魏鳳英老師《現代氣候統計診斷預測技術》中的1900-1990年上海市的年平均氣溫數據)Mann-Kendall原理可詳細參考https://wenku.baidu.com
  • 方差檢驗專題及常見問題 - CSDN
    假設檢驗的步驟(1)建立統計假設;(2)收集樣本數據;(3)選定檢驗方法;(4)計算檢驗統計量值;(5)確定P值,給出推斷結論。二、t檢驗t檢驗是應用t分布的特徵,將t作為檢驗的統計量來進行的檢驗。對於兩組服從正態分布的定量數據的平均數差異的檢驗均可以採用t檢驗,常見的t檢驗有單樣本t檢驗、獨立樣本t檢驗和配對樣本t檢驗。1.單樣本T檢驗單樣本t檢驗是指對樣本平均數與總體平均數的差異進行的顯著性檢驗。即檢驗單個變量的均值是否與給定的常數之間存在差異。
  • python 預測股票專題及常見問題 - CSDN
    基於VAR算法的預測向量自回歸(VAR)模型就是非結構化的多方程模型,它的核心思想不考慮經濟理論,而直接考慮經濟變量時間時序之間的關係,避開了結構建模方法中需要對系統中每個內生變量關於所有內生變量滯後值函數建模的問題
  • t檢驗回歸方程專題及常見問題 - CSDN
    通過最小二乘法擬合好模型的參數後,一個重要的問題就是:這個模型真的「好"嗎?滿足什麼條件、什麼性質的模型可以稱作一個「好模型」呢?2. 單參數顯著性檢驗——t檢驗2.1 問題的提出首先,我們應該想到的問題是,在一個多元回歸模型中,是不是每一個引入的自變量對因變量都有實實在在的影響呢?
  • 的方法 線性回歸方程檢驗專題及常見問題 - CSDN
    因此,對相關程度進行檢驗也是重要的,相關程度的檢驗方法主要有三種:相關係數的檢驗回歸方程的檢驗回歸係數的檢驗相關係數的檢驗變差關係先來一張圖:如上圖所示:當給定X0時,Y的實際值與均值的差值就是Y值隨X值的全部變化,稱之為總變差。
  • 多元線性回歸t檢驗專題及常見問題 - CSDN
    1.t檢驗t檢驗是對單個變量係數的顯著性檢驗,一般看p值; 如果p值小於0.05表示該自變量對因變量解釋性很強。2.F檢驗F檢驗是對整體回歸方程顯著性的檢驗,即所有變量對被解釋變量的顯著性檢驗
  • mnist tensorflow 預測專題及常見問題 - CSDN
    for updating:Please use alternatives such as official/mnist/dataset.py from tensorflow/models.WARNING:tensorflow:From /home/cnu105/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python
  • windows 服務啟動1053專題及常見問題 - CSDN
    1.問題描述今天在啟動一個Windows服務時,服務啟動不了,且提示:1053錯誤那麼是什麼導致了1053錯誤呢?這個問題就能解決了。」 3.實際解決於是根據他的思路,我雙擊了服務程序。結果出現了如下的提示框:
  • kappa一致性檢驗教程 - CSDN
    一、基礎知識在數據分析或臨床工作中,我們會經常遇到檢驗一致性的問題,如判斷不同模型或者診斷方法在預測結果上是否具有一致性,如模型預測的結果與實際結果是否具有一致性,又如兩名或多名醫生對同一病人的診斷結論是否一致
  • python test檢驗 - CSDN
    /usr/bin/python# Paired difference hypothesis testing - Student's t-test# Author: Jin Zhuojun# History: Create Tue May 8 16:12:21 CST 2012import string
  • r語言tseries - CSDN
    一、【包】library(zoo) #時間格式預處理library(xts) #同上library(timeSeires) #同上library(urca) #進行單位根檢驗library(tseries) #arma模型library(fUnitRoots) #進行單位根檢驗
  • android 首次打開判斷專題及常見問題 - CSDN
    前言用真機運行appium代碼,首次打開app有的手機會出現權限彈窗問題,一般這種彈窗都是在引導頁前面或者引導頁後面出現。權限彈窗上面的按鈕都是固定的,只需要定位到「始終允許」按鈕,點擊確定就可以了。還有一個問題是這種彈窗的個數不確定,有的app是2個有的是3個,為了解決這個問題,可以專門寫個判斷方法。
  • python 月初 月末專題及常見問題 - CSDN
  • f t 線性回歸專題及常見問題 - CSDN
    2、T檢驗T檢驗是對各個回歸係數的檢驗,絕對值越大,sig就越小,sig代表t檢驗的顯著性,在統計學上,sig<0.05一般被認為是係數檢驗顯著,顯著的意思就是你的回歸係數的絕對值顯著大於0,表明自變量可以有效預測因變量的變異,做出這個結論你有5%的可能會犯錯誤,即有95%的把握結論正確。
  • iot深圳 nb專題及常見問題 - CSDN
    關注同名公眾號「IoT黑板報」 ,獲取更多物理網資訊及乾貨 關注物聯網領域,尋求報導或投稿請郵件聯繫 jiawd@csdn.net高通驍龍835各項跑分出爐 性能碾壓去年所有旗艦手機@威鋒網 高通最新移動平臺 Snapdragon 835,基本上可以確認是今年旗艦智慧型手機的標配,在驍龍 835 真機到來之前,隨著昨日中國發布會的解禁,越來越多的相關跑分測試也隨之出爐
  • spss 方法 線性回歸專題及常見問題 - CSDN
    二.解析在進行影響失能老年人照護需求的單因素分析時,根據資料情況選擇t檢驗、方差分析或秩和檢驗。該表格可以用來檢驗模型的統計學意義,由結果可得F=22.563,P<0.001,因此應該拒絕原假設,認為回歸模型通過了置信水平為0.05的F檢驗,即所擬合的方程具有統計學意義。(3)模型摘要
  • android啟動頁設計專題及常見問題 - CSDN
    轉載請註明出處:http://blog.csdn.net/wangjihuanghun/article/details/63255144啟動頁幾乎成為了每個app的標配,有些商家在啟動頁中增加了開屏廣告以此帶來更多的收入。
  • eviews線性回歸模型專題及常見問題 - CSDN
    最小二乘估計的原理、t檢驗、F檢驗、擬合優度R方值。從以上回歸結果可以看出,擬合優度很高,整體效果的F檢驗通過。但很明顯,在5%的顯著性水平下,模型中的各參數均不通過檢驗,在10%的顯著性水平下,也只有X2的係數通過檢驗。故認為解析變量之間存在多重共線性。
  • 協整檢驗數據分析 - CSDN
    我們按面板數據的長度,可以分為長面板數據和短面板數據,長面板數據的單位根檢驗方法為:LLC檢驗、Breitung檢驗、IPS檢驗、Fisher式檢驗、HadriLM檢驗。短面板數據的單位根檢驗方法為:HT檢驗。