python处理时间序列非平稳_用python做时间序列预测4:平稳/非平稳时间序列
Stationary Series 平穩(wěn)序列
平穩(wěn)序列有三個基本標準:
1、序列的均值(mean)不應(yīng)該是時間的函數(shù)(意思是不應(yīng)該隨時間變化),而應(yīng)該是一個常數(shù)。下面的左圖滿足這個條件,而右圖的均值受時間的變化影響。
2、序列的方差(variance)不應(yīng)該是時間的函數(shù)。這種特性稱為homoscedasticity(同方差性)。下圖描繪了平穩(wěn)序列和非平穩(wěn)序列,注意右圖分布的不同變化范圍。
3、t時間段的序列和前一個時間段的序列的協(xié)方差(協(xié)方差,衡量的是兩個變量在一段時間內(nèi)同向變化的程度)應(yīng)該只和時間間隔有關(guān),而與時間t無關(guān),在時間序列中,因為是同一個變量在不同時間段的值序列,所以這里的協(xié)方差稱為自協(xié)方差。右圖隨著時間的增加,有一段變得越來越緊密了。所以右圖的序列的協(xié)方差不是常數(shù)。
帶有趨勢和季節(jié)性成分的時間序列都是非平穩(wěn)的,下圖給出了更多的區(qū)分平穩(wěn)性的例子:
為什么要關(guān)注序列的平穩(wěn)性?
大多數(shù)的統(tǒng)計預(yù)測方法都是以平穩(wěn)時間序列為假設(shè)前提來設(shè)計的。 比如,對于時間序列自回歸預(yù)測來說,我們的假設(shè)是變量的歷史和現(xiàn)狀呈現(xiàn)出的基本特性,在未來階段的一個長時期里會維持不變,而這里的基本特性一般就是用上面提到的均值、方差、自協(xié)方差來表示。 更具體的說,自回歸預(yù)測模型本質(zhì)是'利用序列的滯后階數(shù)(lags)作為自變量'的線性回歸模型,比如lags=2表示使用變量的t-1和t-2時刻的值作為自變量來預(yù)測t時刻的值。那么通過在歷史序列上訓練模型后,得到的這個線性回歸模型的各自變量的系數(shù)就代表了各滯后時刻的值與下一時刻值的相關(guān)性,如果時間序列接近平穩(wěn),這些相關(guān)性在未來一段時間內(nèi)都不會有大的變化,那么預(yù)測未來就成為了可能。 所以,相對非平穩(wěn)序列的預(yù)測,平穩(wěn)序列的預(yù)測更簡單和可靠。
非平穩(wěn)序列如何做預(yù)測?
對于非平穩(wěn)時間序列的預(yù)測,我們需要先將其轉(zhuǎn)換為平穩(wěn)時間序列,方法包括:
差分(一階或n階)
取log
開根號
時間序列分解
綜合使用上面的方法
一般來說,做個一階差分,就可以得到接近平穩(wěn)的時間序列了,如果方差隨時間變化較大,那么先取log再做一階差分就可以了。
什么是差分?
比如有一個序列:[1,5,2,12,20] 一階差分,得到:[5-1, 2-5, 12-2, 20-12] = [4, -3, 10, 8] 二階差分(即在一階差分之后,再做一次差分),得到:[-3-4, -10-3, 8-10] = [-7, -13, -2]
如何測試序列的平穩(wěn)性?
對于判斷時間序列是否平穩(wěn),可以通過肉眼觀測時間序列圖,就類似上面提到的平穩(wěn)性的3個基本標準,或者 將時間序列分成多個連續(xù)的部分,計算各部分的均值、方差和自相關(guān)性(或協(xié)方差),如果結(jié)果相差很大,那么序列就不平穩(wěn)。但是這些方法都不能量化平穩(wěn)性,也就是用一個數(shù)值來表示出時間序列的平穩(wěn)性。為此,我們可以使用‘Unit Root Tests’即單位根檢驗,該方法的思想是如果時間序列有單位根,則就是非平穩(wěn)的。
以下是常用的兩個基于單位根檢驗思想的實現(xiàn):
Augmented Dickey Fuller test (ADF Test) 零假設(shè)為序列有單位根,是非平穩(wěn)的,P-Value如果小于顯著級別(0.05),則可以拒絕零假設(shè)。
Kwiatkowski-Phillips-Schmidt-Shin – KPSS test (trend stationary) 與ADF正好相反,零假設(shè)為序列是平穩(wěn)的。另外,在python中,可以通過指定regression='ct'參數(shù)來讓kps把“確定性趨勢(deterministic trend)”的序列認為是平穩(wěn)的。所謂確定性趨勢的序列就是斜率始終保持不變的序列,比如下面這樣的:
下面是對應(yīng)的python代碼:
from statsmodels.tsa.stattools import adfuller, kpss
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'])
# ADF Test
result = adfuller(df.value.values, autolag='AIC')
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
for key, value in result[4].items():
print('Critial Values:')
print(f' {key}, {value}')
# KPSS Test
result = kpss(df.value.values, regression='c')
print('\nKPSS Statistic: %f' % result[0])
print('p-value: %f' % result[1])
for key, value in result[3].items():
print('Critial Values:')
print(f' {key}, {value}')
輸出:
ADF Statistic: 3.14518568930674
p-value: 1.0
Critial Values:
1%, -3.465620397124192
Critial Values:
5%, -2.8770397560752436
Critial Values:
10%, -2.5750324547306476
KPSS Statistic: 1.313675
p-value: 0.010000
Critial Values:
10%, 0.347
Critial Values:
5%, 0.463
Critial Values:
2.5%, 0.574
Critial Values:
1%, 0.739
白噪聲和平穩(wěn)序列的區(qū)別
白噪聲的遵循均值為0的隨機分布,沒有絲毫的模式可言。用python制造一個白噪聲序列,并可視化如下:
randvals = np.random.randn(1000)
pd.Series(randvals).plot(title='Random White Noise', color='k')
去除趨勢
減去最佳擬合線
減去均值線,或者移動平均線
減去/除以 利用時間序列分解出的趨勢序列
去除季節(jié)性
季節(jié)性窗口內(nèi)的移動平均法,平滑季節(jié)性
季節(jié)性差分,就是用當前值減去一個季節(jié)窗口之前對應(yīng)的時刻的值
減去/除以 利用時間序列分解出的季節(jié)性序列
如何判斷序列是否有季節(jié)性?
通過肉眼看圖
通過自相關(guān)函數(shù)判斷
from pandas.plotting import autocorrelation_plot
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv')
# Draw Plot
plt.rcParams.update({'figure.figsize':(9,5), 'figure.dpi':120})
autocorrelation_plot(df.value.tolist())
時間序列分解出的季節(jié)性序列來計算,其思想是越?jīng)]有季節(jié)性,那么Rt的方差和Rt+St的方差越應(yīng)該區(qū)別不大,反之,這個方差的比值越應(yīng)該小于1,公式如下:
Fs越接近0,越?jīng)]有季節(jié)性,越接近1,季節(jié)性越強。
原文作者: 程序員一一滌生(云+社區(qū))
總結(jié)
以上是生活随笔為你收集整理的python处理时间序列非平稳_用python做时间序列预测4:平稳/非平稳时间序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LDA算法简单推导
- 下一篇: Un*、Id分别突变情况下单闭环直流调速