1 e9 h o+ v, b: h/ E' r3 w3 l3、详细步骤5 b/ s5 M/ N6 G, g$ _7 P
01 平稳性检验(adf检验)/ T3 [9 k# b' U
0 A) b. a s* C8 k' ]
# a 时序图检验/ B) `9 o, a8 v- G' ^" a7 c0 L( N
8 G7 I+ [8 [( e0 _; q+ M" n根据平稳时间序列的均值和方差都为常数的性质,平稳序列的时序图显示该序列值始终在一个常熟附近随机波动,而且波动的范围有界;如果有明显的趋势性或者周期性,那他通常不是平稳序列, W8 w4 H6 m) p) J
0 ]- i" }8 F; j4 d* D5 t
# b 自相关图检验。0 q; E- n' _' ~4 D* I
! I5 n$ O- a0 x
平稳序列具有短期相关性民政性质对平稳序列而言通常只有近期的序列值对现时值的影响比较明显,间隔越远的过去只对现时值得影响越小。随着延迟期数K的增加,平稳序列的自相关系数Pk(延迟K期)会比较快的衰减趋向于零,并在零附近随机波动,而非平稳序列的自相关系数衰减的速度比较慢,这就是利用自相关图进行平稳性检验的标准 ! A* U/ M9 d! j( ?4 R# E- v& X3 Z i/ q
+ X% a0 c9 _& }2 b0 h$ i2 b#c 单位根检验 # y1 R7 }: h0 k9 B @
; ~$ E& M# Y4 D' w. S* W
单位根检验是指检验序列中是否存在单位根,如果存在单位根就是非平稳时间序列了 . f- M& {+ a% W! {: V& L. O) N S% ?+ }
6 q# f4 v% y' h. u
# ADF单位根检验$ W* p/ e* d6 r2 A) D( |. t
9 g0 W# t! }# ]
其中第二中的ADF检验中,如果p值显著大于0.05,统计量化大于三个或者两个水平值,差距越大,越不平稳。7 s: t0 {! P* }4 p. H- d. z: H
4 }+ E8 F: v: _ y) P* d3 w+ D) ]
若统计量显著小于三个置信度且p值接近0,为平稳序列2 H. _5 r' G C. N
7 m$ x* b' I1 n3 I其他情况,可能是数据量不够的原因没有展现趋势" E4 g- ^, j; \( M
8 ?0 H+ p, W4 K2 ~' e, z9 I
02 对数据进行差分构造平稳序列7 |1 C$ v2 Q: {+ f1 z, c& w
差分运算:% E- F$ X, X8 l0 Z L( w! T
3 V& R7 V' p9 q7 j) vp阶差分 6 e R/ l p9 j! _: [3 I" j$ O4 h" V8 O1 ^+ `# T$ N" C+ e' |7 Y& E
相聚一期的两个序列值之间的减法运算称为I阶差分运算 7 a) h9 [8 @5 v " |0 [% x E* H* u9 kk步差分 ; Y8 ]" [9 \! D& x 4 L8 J1 i" ? a# S相聚k期的两个序列值之间的减法运算称为k步chafenyunsuan6 y3 @" n! R; M; O+ [
5 U5 _1 f V" ]$ Q2 [$ ?
#差分后的结果 7 P" W% Q& D W9 F8 @D_data = data.diff(k).dropna()2 ]8 a2 H) k4 n0 A: d5 K0 u! v% Y
7 x( j* F4 N! t( g+ B* _
k 相距k时间4 `1 n& {0 v8 L4 {! D( o# V
8 h K& _3 L [. t2 d$ Y
一般在一阶差分后就是比较平稳的序列9 W. r7 d8 I5 A; A, V: g# {
7 J, i2 ?1 J, e, M6 ~
03 平稳性监测6 H; M5 w! S7 O9 k9 p) Z
04 白噪声检验 . p, q) t/ O: L1 M1 j#白噪声检验 ( p& D f, `2 n% T4 p0 nfrom statsmodels.stats.diagnostic import acorr_ljungbox 7 L* d! p" T) L/ m; x X+ R7 ?4 I% l: k2 g0 n2 }! ]#返回统计量和p值 - {3 y% s. o7 y2 R9 C; ]5 o. U4 p9 o3 ^! G8 [$ _
print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) # 分别为stat值(统计量)和P值; b! p) B1 w7 _3 u
% P- L- E% e' P- p: Q& M6 P* O
# P值小于0.05,所以一阶差分后的序列为平稳非白噪声序列。/ b7 i6 V; R. N$ y5 z8 R9 M) g0 Z
! n- I3 H; f3 J
05 定阶 ' r5 Q. I; n* I6 w# m第一种方法人为识别 a* I- O( g6 @; ]3 q( }- }: \, F5 q" V u V( ?3 d1 g. I% q4 F
一阶差分后自相关图显示1阶截尾,9 O# w4 a# F. D8 O/ V. W% k0 g
3 T) q" I1 e# A. \ D
偏自相关显示托尾性,所以建立ARIMA(0,1,1) * |! l0 ?4 n& g# o" Z& l, q/ |$ D' o- `! b% B; ]" Z
第二种:相对最优模型识别 & }/ e k, q- K+ H" s8 Z P# B; U- F2 p- \
计算ARMA(p,q)。当p,q均小于所组合BIC信息量,取其中BIC信息量达到最小的模型阶数 ! K3 ?7 z( e/ E6 L 5 ]" W d& Q) H, r1 `1 s确定pq值( n% f$ G. J, \. @/ j
, `" W) t5 G7 p5 R7 _( K. ~from statsmodels.tsa.arima_model import ARIMA , w2 r/ l \, }' s#定阶 7 p( F. b* f0 ~% ] I1 s* y; V 2 R5 j$ S* ?4 ]) x0 \0 n$ L#一般阶数不超过length/10( N7 e) t% k0 H# f2 u% V: X. X
, L7 S Y: N" \& P
pmax = int(len(D_data)/10) 3 r5 k) M7 B; ?& [" O; V K
$ m/ _: [$ E6 ]2 d, W0 ^& H. s#一般阶数不超过length/10) `* y% q# V( z
) a6 G5 ]0 a3 Q2 f" s3 s
qmax = int(len(D_data)/10) ( ]* v% Y, R* \( s4 Y+ g" o2 r7 w4 k2 Y
$ Y% c- a0 Y( t% B$ N
8 {# M7 e5 @4 G) i5 z
#bic矩阵 + g% |; |1 X, w6 F - g0 y3 a) r. o! G7 Gbic_matrix = [] ) F! N4 G* x* q2 w& X8 [2 Q' yfor p in range(pmax+1):( X5 J/ o7 _: v! G; U9 I
tmp = [] G) L: `' \1 D$ ~; E5 A
for q in range(qmax+1):7 {9 c% q) K0 ~% o, N
#存在部分报错,所以用try来跳过报错。 ' T! P, D6 T$ p3 D1 r/ B6 d% V8 M try: : O( u; t" m# f; ^( F( M tmp.append(ARIMA(data, (p,1,q)).fit().bic); K, A9 V J( p8 x# O. k
except: : m+ [- n* k# V( S5 v; L3 a" } tmp.append(None) + \5 {& l* B, H; l3 j bic_matrix.append(tmp)- | n, E, w" B# x @& |& @0 k
: @+ o l/ T" P7 I, _' @% Y" n
#从中可以找出最小值' c3 v7 v4 y! l- {7 k3 b) j# f
7 x0 H5 _. X8 {9 y& v( T: |
bic_matrix = pandas.DataFrame(bic_matrix) " M% l& `7 K/ J( x0 n
0 k5 m! I! k: k5 A
#先用stack展平,然后用idxmin找出最小值位置。 9 i' V( d/ o1 q+ j8 W( K6 \: ?7 o. z( f8 h7 W! {6 q! B
p,q = bic_matrix.stack().idxmin() ! O4 x5 V3 p6 b+ q+ E$ Q
' G9 N. A6 U C2 ]$ s6 F; [! _3 N. w9 E7 r( W \
4、案例代码 : C8 `1 a3 c" s5 G, `' F! O2 W Z0 n% P. h5 y$ b
import pandas $ s2 _2 h' U$ x $ N3 z; F1 `& R9 y) o# 读取数据,指定日期为索引列; Q B4 w. o. x6 i
+ C/ ]* X: Z' f! kdata = pandas.read_csv(* E1 l/ [& p0 {
'D:\\DATA\\pycase\\number2\\9.3\\Data.csv' ,* {9 E o6 b0 H2 M+ Q
index_col='日期' & S% V3 I j) I) ' ^4 R! R$ h8 @' x, d, n( t! @ X t
# 绘图过程中! r8 z/ @% ]' u1 K* s o8 y" m
( k* W0 {" o' i
import matplotlib.pyplot as plt! j, @) S! U N9 d4 x. B2 j
$ k. w7 H( G$ S& s; [7 Z( H- s. K9 |# 用来正常显示中文标签 * M* ~! S5 x4 h. d - r( X. T0 l# [' u/ a. Rplt.rcParams['font.sans-serif']=['SimHei'] : x: Z) v, R- h7 l% w3 I3 y. R; ~7 T6 {) L( g; K( M$ c* ]: i
# 用来正常显示负号" m/ g: w0 q9 h4 g* i i
/ w9 t+ y6 n# K# V4 h" V
plt.rcParams['axes.unicode_minus'] = False 9 J# Z1 |# Y+ Q0 g& J" r " C N& A# x5 p) m1 x3 c: U( \# 查看趋势图 7 Y2 j6 a5 N* R+ gdata.plot() #有增长趋势,不平稳 ' `( P" T& Y8 g' P. [: \/ I. p 3 Z* z8 l" T: O( n: m/ } ?+ Q7 g+ L% c$ e. @+ h5 e$ p
# 附加:查看自相关系数合片自相关系数(查分之后),可以用于平稳性的检测,也可用于定阶系数预估5 f% T4 J# {1 G( F/ P( T
# K9 S0 K+ H3 k5 L
#自相关图() ( M5 E, |% l3 y3 j' v" {3 | B6 k Y' A
from statsmodels.graphics.tsaplots import plot_acf & R& K) I. Z. f* d% T$ g0 E' W1 _9 W9 X5 i( S# F! o _
plot_acf(data).show() #自相关图既不是拖尾也不是截尾。以上的图的自相关是一个三角对称的形式,这种趋势是单调趋势的典型图形,说明这个序列不是平稳序列3 j$ [/ S& X( B) _' \. n g8 S
' l6 }1 N- q+ \" D/ | [* s3 g
; B& {; g3 {) z4 ^