ARIMA(Autoregressive Integrated Moving Average)模型是一种常用的时间序列分析方法,用于对时间序列数据建模和预测。它通过结合自回归(AR)和滑动平均(MA)模型的特性,并对序列进行差分(Integration,即I)来建立模型。 ; A7 i1 r0 ?8 _4 |# V, k) }+ T2 DARIMA模型的三个主要参数是p、d和q,分别对应于自回归、差分和滑动平均的阶数。& }6 Y9 U# n1 i: h6 g9 O
; L, ?. I4 Z- M4 R( C* R1 D
1.自回归(AR):自回归部分使用先前时间点的观测值来预测当前值。p参数表示自回归的阶数,即使用多少个先前时间点的值作为预测输入。. L) m. P/ e* P9 b- s
2.差分(I):差分是对时间序列进行一阶或多阶的差分操作,可以消除序列的非平稳性。d参数表示差分的阶数,默认为1阶差分。3 \4 z) C2 }! a; Q: x
3.滑动平均(MA):滑动平均部分使用先前的误差值来预测当前值。q参数表示滑动平均的阶数,即使用多少个先前的误差值作为预测输入。 $ w% p( a9 Y/ l0 h& R* [- [2 q* K5 S9 }- S0 L
ARIMA模型的一般表示形式为ARIMA(p, d, q),其中p、d和q是非负整数。它可以很好地处理具有线性趋势和季节性的时间序列数据。: j, ]" X& l9 U @, f! x; i
ARIMA模型的建立包括以下步骤: : G( D7 w0 O/ k$ C* {5 ~+ @. Z& k+ }( b0 |1 N
4.确定时间序列数据的平稳性,如平稳性检验、观察序列的趋势和季节性等。" |: Y; ?& g( m6 Z2 }
5.如果时间序列不平稳,进行差分操作以实现平稳性。 8 J/ e" w1 R+ J! ~8 c8 f E& ]6.通过观察ACF和PACF图来确定p和q的合适取值范围。 * t; E- {( I4 [' H7.根据AIC等准则,以不同的p、d、q值建立多个ARIMA模型。 5 P- O) u, R' n* Y& n8.对每个模型进行参数估计和模型拟合。2 P3 _+ g/ D' W/ ^6 h" i
9.使用拟合的模型进行预测,并对模型的拟合效果进行评估。 * s. q) { u/ q5 s0 b+ j8 @/ P* G: p$ H* ^
ARIMA模型是时间序列分析领域中常用的模型之一,它可以用于预测未来趋势、季节性和周期性等时间序列数据的变化。在实际应用中,ARIMA模型可以被用于经济预测、股票市场分析、天气预测等各种领域。 & E4 p/ N. ~; ~) Y9 F1 _0 p) a* b7 D5 x% B+ }
# 导入所需的库6 _' A( D8 k1 z$ s4 e
import numpy as np6 S2 N1 `6 o( r/ g$ Y
import pandas as pd 4 y {6 r8 I/ [- bimport statsmodels.api as sm2 x: q: {; S/ |+ W
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf * W' p ~& v3 i5 ?import matplotlib.pyplot as plt % O9 B; y0 H5 s- l4 ~0 l* z7 i1 g w" c9 B# h
这些是导入需要使用的库,包括NumPy、Pandas、statsmodels和matplotlib。 9 h. _* t( |3 ?5 d0 ?* i4 M# 源数据' {* i0 T- w) n2 U
df = pd.DataFrame({ 2 S( T/ I* C+ v/ d( E' j3 p 'year': [i for i in range(1971, 1991)],7 Z c3 @/ L) Q$ K. I
'num': [66.6, 68.9, 38, 34.5, 15.5,& d, H8 _- M* G
12.6, 27.5, 92.5, 155.4, 154.6,; j1 o% p* K% i
140.4, 115.9, 66.6, 45.9, 17.9,' c- t. b( E! x1 [2 q$ g
3.4, 29.4, 100.2, 157.6, 142.6], ! x% ~' O. p3 O# x; E% P})# H2 q( p$ H$ E& x- y* y
& o6 I0 T8 h% Y: q" j" K9 a
这里创建了一个DataFrame df,包含年份和对应的数据值。这个数据将用于建立ARIMA模型。8 z0 i4 S+ B6 x
# 画 acf 图9 j. A. \8 ?1 F7 o1 K
plot_acf(df['num']) : S) _+ }$ H& K8 \, P3 _* U 9 l* W. N9 I0 U+ J/ x( `这段代码用于画出序列的自相关函数(ACF)图。ACF图可以帮助我们分析时间序列数据的自相关性。 % w8 z5 f' e# l: {# 画 pacf 图2 W& s/ _1 e, R H7 n
plot_pacf(df['num'], lags=9) " @0 V9 ?" q& y: y2 Q: A; \9 E+ b
这段代码用于画出序列的偏自相关函数(PACF)图。PACF图可以帮助我们分析时间序列数据的偏自相关性。; ?8 z) s" e, k
# 建立模型,参考 acf、pacf 代入 p、q,观察 aic3 f+ {/ L5 q% }" r1 p
str_list = [] " D5 W3 _( Q) b- v( o7 M' R- Afor p in range(1, 6): ; v/ l d* C; m0 q6 M# g# I( @ for q in range(1, 3): 2 A) b9 E' ^. g% [% `" d. s" r" m( K model = sm.tsa.ARMA(df['num'], (p, q)).fit(); I# u' s7 m. h7 W
str_list.append('p = {}, q = {}, aic = {}'.format(p, q, model.aic))- t- g- E" a6 W N- _8 Z
for each in str_list:' d' {1 G- j/ K8 R$ U+ \2 h, P# J
print(each)1 g7 L& O, \6 o
. C3 T# z! ~. j0 Q+ C9 _3 l
这段代码用于建立ARIMA模型并观察模型的AIC(赤池信息准则)值。通过对不同(p, q)值的组合进行模型拟合,并输出对应的AIC值,以便选择最优的(p, q)值。 ; w' A5 z, D9 X d9 h# 发现 p=2,q=2 时 aic 最小,取 p=2,q=2 2 S5 v+ w5 t9 z6 amodel = sm.tsa.ARMA(df['num'], (2, 2)).fit()/ V: {8 y6 t( x7 y2 [3 G9 ?& ?3 l
model.summary() ' _1 O6 C' P* T$ k4 o, s& i, z* |9 S5 _5 m
根据观察AIC值的结果,选择最优(p, q)值为(2, 2),然后建立ARIMA模型并进行拟合。 ) ~6 X; ^, I9 x3 k# 预测和画图8 N8 K) A# q" @% @7 ~
plt.plot(df['year'], df['num']). P7 o& d- O. P! o5 H- X9 v# d
plt.scatter(df['year'], df['num'], label='actual') F: y! Q' [9 l, }" @7 kyear_list = [i for i in range(1971, 2001)]1 E, j3 e4 i" t
plt.plot(year_list, model.predict(0, len(year_list)-1)) # }7 s- s! Y! w; e* Jplt.scatter(year_list, model.predict(0, len(year_list)-1), label='predict') : I- p4 ?4 i, ?4 m! w" Rplt.legend()# D" T0 Y, U% f7 O6 M0 g2 L$ }
! X: q8 m; B- x这段代码用于使用拟合的模型进行预测,并绘制实际值和预测值的图表。首先画出实际值的曲线,然后画出预测值的曲线,并将预测值的点标记在图上。% l* @8 i7 R }" d9 T
希望以上解释对你有帮助。如果你还有任何问题,请随时提问。/ E) w1 a, |7 V, N
) G$ `" N8 Y5 ^, M S5 |: t