/ Q1 k( v: j# q( C- i2 M# Z02 截尾和拖尾- |% ^/ E6 i2 k# }" R2 @
(1)p阶自回归模型 AR(P) * N' S4 |8 N E* [0 X; P7 ^# O
AR(p)模型的偏自相关函数PACF在p阶之后应为零,称其具有截尾性; - ?8 S9 {/ [+ n, m
AR(p)模型的自相关函数ACF不能在某一步之后为零(截尾),而是按指数衰减(或成正弦波形式),称其具有拖尾性。 2 @& X5 X" C: B' i/ z 1 H B0 V h a* C* f+ p0 |(2)q阶移动平均模型 MA(q) & \! v8 V( K6 O* m% dMA(q)模型的自相关函数ACF在q阶之后应为零,称其具有截尾性; 1 {, t% z$ k. D# o1 N$ J0 E
MA(q)模型的偏自相关函数PACF不能在某一步之后为零(截尾),而是按指数衰减(或成正弦波形式),称其具有拖尾性。0 z1 |/ ^; W# y
$ z( e% c$ {! m5 ^& x
03 如何判断拖尾和截尾# w) h8 h/ U" M. o- |0 d, `
1 E) C) f( v* c; O* O(1)如果样本自相关系数(或偏自相关系数)在最初的d阶明显大于2倍标准差范围,而后几乎95%的样本自相关(偏自相关)系数都落在2倍标准差范围以内,而且由非零自相关(偏自相关)系数衰减为小值波动的过程非常突然,这时,通常视为自相关(偏自相关)系数截尾。 7 Z9 M( I/ v, u" \( k3 K& S5 _$ A" b% i. x
(2)如果有超过5%的样本相关系数落在2倍标准差范围以外,或者是由显著非零的相关函数衰减为小值波动的过程比较缓慢或者非常连续,这时,通常视为相关系数不截尾。 9 U" g( C K2 R' Q3 V3 f 5 s+ w# q7 z& x1 R M" ]2、时间序列算法公式 8 n0 s8 _5 W2 K2 M重要的几种为:AR、MA、ARMA、ARIMA模型,具体公式见下图:2 ?1 c) P* Z# T. \ # E; L0 e7 F( J! f) O : }" h6 |* `8 }) u8 Y \# h5 E8 J
3、详细步骤 . O% A* u" `- X% w" H" @6 k01 平稳性检验(adf检验)! ]' x) ?) w' Y( N V; z
& ]4 h2 ] s2 H
# a 时序图检验) T9 U7 E9 l0 b2 m
4 n$ o# `. u3 r' w$ B根据平稳时间序列的均值和方差都为常数的性质,平稳序列的时序图显示该序列值始终在一个常熟附近随机波动,而且波动的范围有界;如果有明显的趋势性或者周期性,那他通常不是平稳序列 2 ?$ M$ w* v% h+ C * p5 s1 b! e! t' A- |4 X8 h# b 自相关图检验。# W7 V8 O4 c( H4 L
+ x! O! T3 H t$ q C
平稳序列具有短期相关性民政性质对平稳序列而言通常只有近期的序列值对现时值的影响比较明显,间隔越远的过去只对现时值得影响越小。随着延迟期数K的增加,平稳序列的自相关系数Pk(延迟K期)会比较快的衰减趋向于零,并在零附近随机波动,而非平稳序列的自相关系数衰减的速度比较慢,这就是利用自相关图进行平稳性检验的标准+ x/ W0 U$ ?1 c- Q5 y
( \6 \. y+ k( D& B$ X9 F" d9 r6 q5 V- U
#c 单位根检验 6 U8 }/ ^/ q1 f4 c6 J# ?# t& Z% Y, m# [, p7 e, ~
单位根检验是指检验序列中是否存在单位根,如果存在单位根就是非平稳时间序列了3 ^! H8 ?+ P! F9 f- D4 _9 O
/ C4 k7 U6 ~0 h" _
3 I" T. W/ M. E) z l; a( h
# ADF单位根检验 3 a6 M: C3 L, f, u 5 F. v. S7 Y6 |其中第二中的ADF检验中,如果p值显著大于0.05,统计量化大于三个或者两个水平值,差距越大,越不平稳。 2 O/ g$ B- W, t8 V1 B& x1 L # G2 s/ I1 g& K' p' z2 d, N& S若统计量显著小于三个置信度且p值接近0,为平稳序列 9 ^$ Y9 X$ k; \ ?6 F+ F: |: z7 D
其他情况,可能是数据量不够的原因没有展现趋势 $ c9 Z8 b' B8 W6 }! T2 |, p8 k W( m- Q6 L: M- C5 s3 d1 ~% n, ?02 对数据进行差分构造平稳序列; H- o E! M9 e" t3 ^8 Y& g
差分运算: 1 ]0 L% w+ L7 Z x; \$ Y! _- h2 U5 a. k5 d
p阶差分2 U/ K* P/ r8 Y$ m4 F# J
; q, D0 s, h7 ~! H相聚一期的两个序列值之间的减法运算称为I阶差分运算* z7 K1 f$ t' }+ l6 T
! O6 u$ v6 v/ j6 Q1 c ]3 i& k
k步差分 : t1 C7 |8 v. L$ o ) m7 S8 H5 D; F: d" }2 {' o; N相聚k期的两个序列值之间的减法运算称为k步chafenyunsuan. d9 y3 Z, k X {" F I. y) H5 z n
( `1 k& f" x5 @+ T. V! S! J# `#差分后的结果 ( A6 y+ \6 u5 o# ?/ p& s, HD_data = data.diff(k).dropna() * `5 d1 Q3 `8 ?6 ?3 u5 g( e) V& Y* X8 M7 k' z- M0 v& B. c7 Y
k 相距k时间/ _; Q1 M% B( m& G: t+ r# v
2 {# ]+ e8 r0 ?5 T$ s% l N一般在一阶差分后就是比较平稳的序列" N* Y. W) X% a- I; i
' O( I1 D. F# J4 `$ s, u% N% @9 |, `* e03 平稳性监测9 m$ w- w7 k3 N) c( N) `# L' i
04 白噪声检验6 ^0 Z$ c; Q9 r1 @7 ?! ^
#白噪声检验 - K# r/ {+ p+ C- b4 o( Dfrom statsmodels.stats.diagnostic import acorr_ljungbox; C$ b5 |! Z( K2 X; p7 F, y
2 S% b/ ]: e' N) {; M
#返回统计量和p值- |# R; e. U8 S0 I3 M
3 g, m& _. D* X) {5 L3 S; F/ O( Iprint(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) # 分别为stat值(统计量)和P值 / y1 ]0 |: A7 j" F0 Z/ r0 S2 v% r8 T. _$ k
# P值小于0.05,所以一阶差分后的序列为平稳非白噪声序列。 0 m) n4 E }2 E8 g, O/ }# x5 H9 |! V5 u# m
05 定阶 . s$ a6 w3 [8 P. P* `第一种方法人为识别 & M5 f& B4 @8 u9 `* u: N7 q8 e% v& M
一阶差分后自相关图显示1阶截尾,7 V) P1 w d: O6 ~9 ]: j
+ E% S& F6 R+ X( x
偏自相关显示托尾性,所以建立ARIMA(0,1,1)" B/ i, [- e0 P. x* E
; ]* t: ~4 {( X " q0 d x. ^! q3 R0 V2 Z5 \1 @# 1 平稳性检测4 Y6 B9 @. t h. t; A" l9 C F
% P' m; `2 K4 E9 A5 z8 u
from statsmodels.tsa.stattools import adfuller as ADF 2 o I0 H4 U, V3 p4 h5 ^2 Q$ |/ J3 N
w- L* q4 ~; u' l/ qdef tagADF(t):; j/ g' |! `9 D' G! l$ H
result = pandas.DataFrame(index=[! c r5 {! f* X: e0 {; V B
"Test Statistic Value", "p-value", "Lags Used", : l8 q7 Q8 q& T1 d" I+ |# q "Number of Observations Used", 6 S- b X. s1 k
"Critical Value(1%)", "Critical Value(5%)", "Critical Value(10%)"' _8 p5 B7 }& f. B( h
], columns=['销量'] , [" ?: [% _6 `0 L; _# }0 b ); g- q7 E' D6 B$ w } result['销量']['Test Statistic Value'] = t[0]( E5 a- u6 J2 [5 y0 ^$ v: H
result['销量']['p-value'] = t[1]: w; m1 S3 p7 v5 P, d
result['销量']['Lags Used'] = t[2] 0 W" s4 r5 U3 \6 d7 C result['销量']['Number of Observations Used'] = t[3] : [6 ?1 S) t3 d l( ~2 _- Q. a result['销量']['Critical Value(1%)'] = t[4]['1%']. c5 ^% B4 G5 Z& p% ^
result['销量']['Critical Value(5%)'] = t[4]['5%']4 g; O: M* H. x# M h* h
result['销量']['Critical Value(10%)'] = t[4]['10%']2 X$ P% Q! C( `5 c0 C" [
return result;" l1 F! v/ T$ _
; Z8 X( f* o6 J, @4 V$ V4 U7 y) p( F" q Q' q2 T
print('原始序列的ADF检验结果为:',tagADF(ADF(data[u'销量']))) # 添加标签后展现 / Z! `+ {" O. X1 `- m& s P' O( j* K0 _) E
# 平稳判断:得到统计量大于三个置信度(1%,5%,10%)临界统计值,p值显著大于0.05,该序列为非平稳序列。 4 r \6 Y4 O, g# 备注:得到的统计量显著小于3个置信度(1%,5%,10%)的临界统计值时,为平稳 此时p值接近于0 此处不为0,尝试增加数据量,原数据太少5 n% ]& {: L% D# m d5 e: \7 i
6 S0 E/ K; t$ F; {) j2 O) F# 2 进行数据差分,一般一阶差分就可以+ u& R. G" ?9 ~" y" g$ Q
( `# L$ ` N0 X0 I9 I
D_data = data.diff(1).dropna()" m1 c, p3 D; M8 G9 O$ R
D_data.columns = [u'销量差分'] 6 S3 [$ R! M9 A, [) g0 z w3 D! L7 j$ p+ j! V' ?/ L7 F
#差分图趋势查看 " t( d9 k* L* h* z* H& J% P# s # b6 V! n" y* K# U' nD_data.plot() ' o; T5 u) N0 O
plt.show()- H+ t6 K2 b: v* g
, G$ l0 J( K( O: X7 p1 b; J
# 附加:查看自相关系数合片自相关系数(查分之后),可以用于平稳性的检测,也可用于定阶系数预估 0 B9 w" O8 {+ L# c0 ?6 Z8 N! t2 U5 ~9 u
#自相关图) P# m% @5 Z* h9 y9 k9 R# i
% L& Z1 P' @$ v% E' @' `
plot_acf(D_data).show() . o6 [& g+ y0 R! ~, Y$ ^ 5 e. ], s; Q; H! a; ~' s. _plt.show() ; X6 J$ l. @3 n1 p; o3 i5 e 5 R( G3 U8 R1 ?8 n I3 x) v#偏自相关图 * X6 v' h6 a5 W( d% D- T 4 |7 P! S4 e) q1 ` I: u- Yfrom statsmodels.graphics.tsaplots import plot_pacf) h# e/ H8 u2 q5 n& x* b
0 W& @' s w6 q0 P! aplot_pacf(D_data).show() 9 m. O1 J9 j6 a1 j" ^& |$ E A: Q% x& X, v7 I' d# 3 平稳性检测. |! ~! F z/ _7 ^ J: L
0 N4 f. o$ n3 H& ~. W$ ^4 b
print(u'差分序列的ADF检验结果为:', tagADF(ADF(D_data[u'销量差分']))) ) a1 t1 Y) p; L. t5 Q% w b; U& u: n. L/ _ J& U
# 解释:Test Statistic Value值小于两个水平值,p值显著小于0.05,一阶差分后序列为平稳序列。 / [/ U8 Z; a V. V 0 A. m# V1 v g. Z6 v) s0 Q. J+ W. C2 s# 4 白噪声检验* A" i2 k @4 p. g5 q
from statsmodels.stats.diagnostic import acorr_ljungbox ! v$ g1 V" U5 o3 E0 s 8 M4 Y9 @' j! L! d4 }, @4 s& P#返回统计量和p值0 |) s. ?8 M: Q! _& I
( N+ u+ z* ]) K0 c4 z' g
print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) # 分别为stat值(统计量)和P值4 h6 R7 C$ J( ~8 h) P