/ e* X7 T- |& \7 N4 e1 ` : T& C( y, F! q! Y2 c/ |3、详细步骤 * W9 r a7 Z7 `: N3 l01 平稳性检验(adf检验)1 p4 F$ |! }& _; u. Q. \3 U ~
. B/ X8 B2 c! {$ F5 h# a 时序图检验 ! b8 T! g! |1 p' d" q5 P R( {9 u4 U
根据平稳时间序列的均值和方差都为常数的性质,平稳序列的时序图显示该序列值始终在一个常熟附近随机波动,而且波动的范围有界;如果有明显的趋势性或者周期性,那他通常不是平稳序列* u" ]$ B/ j. m
7 R4 w7 e+ W' o! M8 j, Y+ Y; ^0 T# b 自相关图检验。 8 o2 a. e: I* ]4 ^3 ?1 i1 k ( @3 z; B% }7 O. e1 V平稳序列具有短期相关性民政性质对平稳序列而言通常只有近期的序列值对现时值的影响比较明显,间隔越远的过去只对现时值得影响越小。随着延迟期数K的增加,平稳序列的自相关系数Pk(延迟K期)会比较快的衰减趋向于零,并在零附近随机波动,而非平稳序列的自相关系数衰减的速度比较慢,这就是利用自相关图进行平稳性检验的标准' q& @2 e/ b- Q9 @. {
! I: S& s% U# J9 L! V1 g' t- y6 `
\* |4 w- k( s/ B
#c 单位根检验 4 d2 |7 R* ?7 r2 U* C, p. Y/ ^$ B; {' K4 h+ Z, Z. H0 l4 Q
单位根检验是指检验序列中是否存在单位根,如果存在单位根就是非平稳时间序列了# a% W0 J. O+ m2 E
. D/ ~ S0 _+ `/ C Z4 e- L
1 X5 y+ W6 U- @% h$ G0 u2 v
# ADF单位根检验 2 g# w) Z5 h% r X7 r5 F7 n# z
其中第二中的ADF检验中,如果p值显著大于0.05,统计量化大于三个或者两个水平值,差距越大,越不平稳。) p* U0 A" H2 ~* a
/ C5 x/ ]% O7 X% f1 Y4 P5 k% L, I3 C3 _
若统计量显著小于三个置信度且p值接近0,为平稳序列; g }! o* n+ X
2 E; P G+ ^( C) T+ V其他情况,可能是数据量不够的原因没有展现趋势6 j/ H: a# L# v+ h1 _7 h4 l+ `
! N6 d& N8 A4 z( P! t
02 对数据进行差分构造平稳序列7 j) Q+ {2 C; O5 r1 S9 G( Q, V( {
差分运算:% F0 \! S# s2 K
3 ^; n7 F4 s) t# I
p阶差分 % t3 Y: W9 Q+ R$ j% J+ f9 Z' H5 R0 h) a- W6 u
相聚一期的两个序列值之间的减法运算称为I阶差分运算 n& v: ^0 z! e
! n6 B( ~0 y- g
k步差分 2 O% W7 T% ?- |2 Q! c) u7 V2 J- f( Q0 B2 O
相聚k期的两个序列值之间的减法运算称为k步chafenyunsuan( B( l6 }8 v2 j2 p0 j
5 [ l( d6 `6 j4 \9 ~% E
#差分后的结果% G. t8 h9 c' T. k2 D3 u! o7 E
D_data = data.diff(k).dropna() + c }/ A# Q+ Y$ i0 B / m( y D$ Z/ Mk 相距k时间 ! e; d- Q: V- y! s( q: C/ L0 f+ [3 r- o8 f0 G/ t
一般在一阶差分后就是比较平稳的序列 8 y- q' q1 n# g* A2 |. J- V" I% n. l, B+ n- f
03 平稳性监测 % P% V/ D, P( }: C) Z7 J+ |04 白噪声检验3 e! J. `0 a# X3 ~
#白噪声检验, L/ ?& A. a0 ?
from statsmodels.stats.diagnostic import acorr_ljungbox 3 H5 Q( I( z( @( O2 j0 U5 _ k( R2 ~5 X: ?8 R
#返回统计量和p值; R2 T" e6 Z+ ?. |. ^7 i# e0 W
0 `0 H% j& }8 L; ?/ u' V# P值小于0.05,所以一阶差分后的序列为平稳非白噪声序列。 % Q) k# n$ H3 s2 o8 m! c ; F: b* v- L2 _: ?+ E, j9 j# V0 Q: x6 \7 G2 {& q
# 5 p,q定阶( [# C8 o$ R: k& K9 p
+ D ^" b5 b* _) ]1 U, \7 O% L4 k
from statsmodels.tsa.arima_model import ARIMA " D' J: Q( {, q; Z/ z8 `1 P* w & @3 a- |# Q0 v9 u#一般阶数不超过length/10 9 S$ h$ s+ p# S1 k9 A6 k8 m% n' I7 P9 X( N
pmax = int(len(D_data)/10) 4 B" m& s4 t, l% G1 Z
/ |8 [0 {! v# D
0 B ^. ^5 I. D0 N. w, G! B: [6 H
#一般阶数不超过length/100 U5 a* l2 b% q! x8 W- O0 k3 U0 v$ ~
$ p- b2 s$ H; p! ]qmax = int(len(D_data)/10) $ c' T5 u2 J) f, G% r: d 7 n1 B5 X6 g! M- b7 l#bic矩阵# C' x* y7 X: b& b
" g8 I0 w' r B4 P. W) ]% B. dbic_matrix = [] 7 u% X& p$ Y, n# }8 C) b' p
for p in range(pmax+1):( s/ d5 X1 t; A
tmp = []1 N: X! r) ?+ B
for q in range(qmax+1): $ K5 }, S- O' X" z#存在部分报错,所以用try来跳过报错。 " G! p# i0 _% y9 q+ f& `, R: u try: ) j5 H; ~ V. M/ I& ~) r
tmp.append(ARIMA(data, (p,1,q)).fit().bic)/ J: l. y6 X c' D- Y5 |$ u1 }
except:" [' H, S' f) @: p/ U
tmp.append(None) & O0 N1 j4 }; q bic_matrix.append(tmp). w$ f' X) T7 A
6 g2 b5 Y0 d( a( k#从中可以找出最小值 9 u, a) n$ {' ]. w6 ~; Y 5 u. k. ~! L8 [- qbic_matrix = pandas.DataFrame(bic_matrix) $ M( Y/ t7 [% c8 V }- p( K 3 ~' a5 y: p( Z& H#先用stack展平,然后用idxmin找出最小值位置。 9 y, Y7 S. ^# ?% L6 m5 f) c7 N" Y
p,q = bic_matrix.stack().idxmin() ) e" g3 E, H8 T' M
& a9 v+ v. H; S; a5 H' [4 p& f" s6 D" F4 v6 A
$ f) r j2 ]) G% Uprint(u'BIC最小的p值和q值为:%s、%s' %(p,q)) 3 E+ l) ~) N m5 M! h. c# 取BIC信息量达到最小的模型阶数,结果p为0,q为1,定阶完成。 4 I1 r& c/ E2 T; j6 t ' U* ?) }$ o- C8 G$ g9 d K& \7 d' T% x# 6 建立模型和预测* x5 o; b. Z% @5 V
# {, s8 H. [' [6 Y& e
model = ARIMA(data, (p,1,q)).fit() % k, \+ S' a L/ |, X