python平穩性檢驗專題及常見問題 - CSDN

2021-01-07 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.
  • 平穩性檢驗結果分析專題及常見問題 - CSDN
    平穩性定義所謂時間序列的平穩性,是指時間序列的均值,方差以及協方差都是常數,與時間t無關。這樣的序列才可以作為我們基於歷史預測未來的基礎。滿足以上條件屬於嚴平穩,一般達到弱平穩都是可以接受的。平穩性是當前時間序列分析的前提條件,因為我們的建模過程基本都是以大數定理和中心極限定理為理論基礎(比如ARMA,ARIMA模型等),而大數定理和中心極限定理也是有前提條件的,那就是要求樣本同分布(等價於時間序列的平穩性)。如果這個條件不滿足,那麼我們的很多分析結果是不可靠的。白噪聲屬於平穩序列,因為它的均值為0,方差為常數,協方差為0。
  • 時間序列平穩性檢驗 - CSDN
    強平穩和弱平穩3. Python平穩性檢驗實戰重要性:10分 (1-10)。時間序列數據的平穩性對於我們採用什麼樣的分析方式、選擇什麼樣的模型有著至關重要的影響。我們想一下,假如一個時間序列的波動趨勢從來沒有穩定過,那麼它每個時期的波動對於之後一段時期的影響都是無法預測的,因為它隨時可能「變臉」。
  • python 卡方檢驗專題及常見問題 - CSDN
    卡方檢驗可以用於判斷兩個類別變量的相關性是否顯著。在分類的應用場景中可以用卡方檢驗選擇特徵,特徵與目標變量的相關性越顯著說明特徵越重要,預測力越強。      一、先簡單介紹一下卡方檢驗的步驟。假設y為目標變量,取值為好和壞,x為特徵變量取值為高、中、低。
  • 位根平穩性檢驗R語言_r語言平穩性檢驗 - CSDN
    對序列的平穩性的檢驗有兩種方法:一種是圖檢驗方法,即根據時序圖和自相關圖所顯示的特徵做出判斷;一種是統計檢驗方法,即構造檢驗統計量進行假設檢驗。圖檢驗方法是一種操作簡便、運用廣泛的平穩性判別方法。
  • r語言 平穩性檢驗 - CSDN
    老師是用一節課講完的,本篇文章只做了平穩性檢驗~~~下一篇再寫純隨機性檢驗全部代碼yield <- c(15.2,16.9,15.3,14.9,15.7,15.1,16.7)par(mfrow=c(1,2))plot(yield)yield <- ts(yield,start = 1884)plot(yield)help(plot)plot(yield,
  • python 卡方專題及常見問題 - CSDN
    卡方檢驗是一種用途很廣的計數資料的假設檢驗方法。它屬於非參數檢驗的範疇,主要是比較兩個及兩個以上樣本率( 構成比)以及兩個分類變量的關聯性分析。其根本思想就是在於比較理論頻數和實際頻數的吻合程度或擬合優度問題。
  • 卡方檢驗結果分析專題及常見問題 - CSDN
    R語言卡方檢驗與結果可視化1,卡方分析簡介與實例2,R語言chisq.test()3,基於ggstatsplot包的可視化分析卡方分析簡介與實例:卡方檢驗是生物學中應用很廣的一種假設檢驗,可以通過對構成比,率進行檢驗,進而判斷分類資料間的偏差程度。
  • python卡方分析專題及常見問題 - CSDN
    卡方檢驗是一種用途很廣的計數資料的假設檢驗方法。它屬於非參數檢驗的範疇,主要是比較兩個及兩個以上樣本率( 構成比)以及兩個分類變量的關聯性分析。其根本思想就是在於比較理論頻數和實際頻數的吻合程度或擬合優度問題。
  • f檢驗 matlab專題及常見問題 - CSDN
    Mann-Kendall顯著性檢驗工具:1、MATLAB2、DPS3、示例數據(數據採用的是魏鳳英老師《現代氣候統計診斷預測技術》中的1900-1990年上海市的年平均氣溫數據)Mann-Kendall原理可詳細參考https://wenku.baidu.com
  • r語言白噪聲檢驗眼_r語言白噪聲檢驗 - CSDN
    [時間序列分析][1]--平穩性,白噪聲的檢驗  這是一個全新的專題,講關於時間序列分析的。   做時間序列分析,之前需要做兩個準備工作,即檢查序列是否是平穩的,如果是平穩的,還要檢查是否是白噪聲。我們一個一個來講。
  • r語言做白噪聲檢驗_r語言中如何做白噪聲檢驗 - CSDN
    [時間序列分析][1]--平穩性,白噪聲的檢驗  這是一個全新的專題,講關於時間序列分析的。   做時間序列分析,之前需要做兩個準備工作,即檢查序列是否是平穩的,如果是平穩的,還要檢查是否是白噪聲。我們一個一個來講。
  • r 平穩性檢驗 語言_r語言平穩性檢驗方法 - CSDN
    協整檢驗是為了檢驗非平穩序列的因果關係,協整檢驗是解決偽回歸為問題的重要方法。首先回歸偽回歸例子:偽回歸Spurious regression 偽回歸方程的擬合優度、顯著性水平等指標都很好,但是其殘差序列是一個非平穩序列,擬合一個偽回歸:
  • 卡方檢驗相關性專題及常見問題 - CSDN
    那麼有一個問題:協方差數值大小是否代表了相關程度呢?也就是說如果協方差為 100 是否一定比協方差為 10 的正相關性強呢?假如X1、Y1 和 X2、Y2 分別聯合分布圖,如下所示:考察兩個變量的相關關係,首先得看清楚兩個變量都是什麼類型的,統計分析中常見的變量類型有連續型數值變量,無序分類變量、有序分類變量:連續型數值變量:如銷售額、氣溫、工資收入、考試成績;無序分類變量:如性別男和女,血型種類;有序分類變量:如學歷水平小學、初中、高中
  • python的int類型專題及常見問題 - CSDN
    在以前的Python2中,整型分為int和long,也就是整型和長整型, 長整型不存在溢出問題, 即可以存放任意大小的數值,理論支持無限大數字。因此在Python3 中,統一使用長整型,用int表示,在Python3中不存在long,只有int。
  • 方差檢驗專題及常見問題 - CSDN
    Excel雙樣本T檢驗之等方差檢驗1 聲明本文的數據來自網絡,部分代碼也有所參照,這裡做了注釋和延伸,旨在技術交流,如有冒犯之處請聯繫博主及時處理。
  • t檢驗 機器學習專題及常見問題 - CSDN
    均值對比的假設檢驗方法主要有 Z 檢驗和 T 檢驗,它們的區別在於 Z 檢驗面向總體數據和大樣本數據,而 T 檢驗適用於小規模抽樣樣本。下面分別介紹 Z 檢驗和 T 檢驗。Z 檢驗需要事先知道總體方差,另外,如果總體不服從正態分布,那麼樣本量要大於等於 30 ;如果總體服從正態分布,那麼對樣本量沒有要求。
  • python一元線性回歸分析專題及常見問題 - CSDN
    python多重線性回歸分析多重線性回歸分析定義多重線性回歸模型:Mulitiple Linear Regression多元線性回歸模型:MultivariateLinear Regression數據準備#多重線性回歸#數據準備import pandas as pddf=pd.read_csv('e:/python/out/corr.csv',encoding='utf8')df根據預測目標,確定自變量和因變量#多重線性回歸
  • python卡方檢驗 - CSDN
    卡方檢驗可以用於判斷兩個類別變量的相關性是否顯著。在分類的應用場景中可以用卡方檢驗選擇特徵,特徵與目標變量的相關性越顯著說明特徵越重要,預測力越強。      一、先簡單介紹一下卡方檢驗的步驟。假設y為目標變量,取值為好和壞,x為特徵變量取值為高、中、低。
  • t檢驗回歸方程專題及常見問題 - CSDN
    回歸方程的顯著性檢驗  t 檢驗(回歸係數的檢驗)  F 檢驗(回歸方程的檢驗)  相關係數的顯著性檢驗  樣本決定係數  三種檢驗的關係  假設:正態性假設 (方便檢驗計算)t 檢驗  用t 檢驗來檢驗回歸係數的顯著性。