python处理时间序列非平稳_用python做时间序列预测4:平稳/非平稳时间序列
Stationary Series 平穩序列
平穩序列有三個基本標準:
1、序列的均值(mean)不應該是時間的函數(意思是不應該隨時間變化),而應該是一個常數。下面的左圖滿足這個條件,而右圖的均值受時間的變化影響。
2、序列的方差(variance)不應該是時間的函數。這種特性稱為homoscedasticity(同方差性)。下圖描繪了平穩序列和非平穩序列,注意右圖分布的不同變化范圍。
3、t時間段的序列和前一個時間段的序列的協方差(協方差,衡量的是兩個變量在一段時間內同向變化的程度)應該只和時間間隔有關,而與時間t無關,在時間序列中,因為是同一個變量在不同時間段的值序列,所以這里的協方差稱為自協方差。右圖隨著時間的增加,有一段變得越來越緊密了。所以右圖的序列的協方差不是常數。
帶有趨勢和季節性成分的時間序列都是非平穩的,下圖給出了更多的區分平穩性的例子:
為什么要關注序列的平穩性?
大多數的統計預測方法都是以平穩時間序列為假設前提來設計的。 比如,對于時間序列自回歸預測來說,我們的假設是變量的歷史和現狀呈現出的基本特性,在未來階段的一個長時期里會維持不變,而這里的基本特性一般就是用上面提到的均值、方差、自協方差來表示。 更具體的說,自回歸預測模型本質是'利用序列的滯后階數(lags)作為自變量'的線性回歸模型,比如lags=2表示使用變量的t-1和t-2時刻的值作為自變量來預測t時刻的值。那么通過在歷史序列上訓練模型后,得到的這個線性回歸模型的各自變量的系數就代表了各滯后時刻的值與下一時刻值的相關性,如果時間序列接近平穩,這些相關性在未來一段時間內都不會有大的變化,那么預測未來就成為了可能。 所以,相對非平穩序列的預測,平穩序列的預測更簡單和可靠。
非平穩序列如何做預測?
對于非平穩時間序列的預測,我們需要先將其轉換為平穩時間序列,方法包括:
差分(一階或n階)
取log
開根號
時間序列分解
綜合使用上面的方法
一般來說,做個一階差分,就可以得到接近平穩的時間序列了,如果方差隨時間變化較大,那么先取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]
如何測試序列的平穩性?
對于判斷時間序列是否平穩,可以通過肉眼觀測時間序列圖,就類似上面提到的平穩性的3個基本標準,或者 將時間序列分成多個連續的部分,計算各部分的均值、方差和自相關性(或協方差),如果結果相差很大,那么序列就不平穩。但是這些方法都不能量化平穩性,也就是用一個數值來表示出時間序列的平穩性。為此,我們可以使用‘Unit Root Tests’即單位根檢驗,該方法的思想是如果時間序列有單位根,則就是非平穩的。
以下是常用的兩個基于單位根檢驗思想的實現:
Augmented Dickey Fuller test (ADF Test) 零假設為序列有單位根,是非平穩的,P-Value如果小于顯著級別(0.05),則可以拒絕零假設。
Kwiatkowski-Phillips-Schmidt-Shin – KPSS test (trend stationary) 與ADF正好相反,零假設為序列是平穩的。另外,在python中,可以通過指定regression='ct'參數來讓kps把“確定性趨勢(deterministic trend)”的序列認為是平穩的。所謂確定性趨勢的序列就是斜率始終保持不變的序列,比如下面這樣的:
下面是對應的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
白噪聲和平穩序列的區別
白噪聲的遵循均值為0的隨機分布,沒有絲毫的模式可言。用python制造一個白噪聲序列,并可視化如下:
randvals = np.random.randn(1000)
pd.Series(randvals).plot(title='Random White Noise', color='k')
去除趨勢
減去最佳擬合線
減去均值線,或者移動平均線
減去/除以 利用時間序列分解出的趨勢序列
去除季節性
季節性窗口內的移動平均法,平滑季節性
季節性差分,就是用當前值減去一個季節窗口之前對應的時刻的值
減去/除以 利用時間序列分解出的季節性序列
如何判斷序列是否有季節性?
通過肉眼看圖
通過自相關函數判斷
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())
時間序列分解出的季節性序列來計算,其思想是越沒有季節性,那么Rt的方差和Rt+St的方差越應該區別不大,反之,這個方差的比值越應該小于1,公式如下:
Fs越接近0,越沒有季節性,越接近1,季節性越強。
原文作者: 程序員一一滌生(云+社區)
總結
以上是生活随笔為你收集整理的python处理时间序列非平稳_用python做时间序列预测4:平稳/非平稳时间序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LDA算法简单推导
- 下一篇: websocket python爬虫_p