数学建模社区-数学中国

标题: ARMA 模型使用拟合的模型进行预测 [打印本页]

作者: 2744557306    时间: 2024-3-20 10:19
标题: ARMA 模型使用拟合的模型进行预测
ARIMA(Autoregressive Integrated Moving Average)模型是一种常用的时间序列分析方法,用于对时间序列数据建模和预测。它通过结合自回归(AR)和滑动平均(MA)模型的特性,并对序列进行差分(Integration,即I)来建立模型。! l& m( Z+ l/ S  w- M
ARIMA模型的三个主要参数是p、d和q,分别对应于自回归、差分和滑动平均的阶数。
* ^. ]' }* ~5 A) D9 a
% d$ a5 f* g: b; }1.自回归(AR):自回归部分使用先前时间点的观测值来预测当前值。p参数表示自回归的阶数,即使用多少个先前时间点的值作为预测输入。
# X+ R/ A4 P( v: s* ~2.差分(I):差分是对时间序列进行一阶或多阶的差分操作,可以消除序列的非平稳性。d参数表示差分的阶数,默认为1阶差分。
. E  F% z/ h1 n: S3.滑动平均(MA):滑动平均部分使用先前的误差值来预测当前值。q参数表示滑动平均的阶数,即使用多少个先前的误差值作为预测输入。
- y) P' Y1 z8 a4 f4 ?$ ^$ h: I6 J" G5 }
ARIMA模型的一般表示形式为ARIMA(p, d, q),其中p、d和q是非负整数。它可以很好地处理具有线性趋势和季节性的时间序列数据。
, A0 N# Z( D9 F8 e3 Y  ?9 X) sARIMA模型的建立包括以下步骤:; |" r1 N+ c7 F4 o8 o% S) I) n6 i
& a0 y: |4 Y: ~3 }& k6 P5 d' {
4.确定时间序列数据的平稳性,如平稳性检验、观察序列的趋势和季节性等。
  K% w+ C2 O/ l3 C2 z5.如果时间序列不平稳,进行差分操作以实现平稳性。9 l0 K+ H5 P$ e/ P
6.通过观察ACF和PACF图来确定p和q的合适取值范围。# r1 ?' ?9 x$ ~2 X& z2 o
7.根据AIC等准则,以不同的p、d、q值建立多个ARIMA模型。7 [& t( S4 D: E/ p
8.对每个模型进行参数估计和模型拟合。
, p. Z+ C% }, m1 \7 O' t9.使用拟合的模型进行预测,并对模型的拟合效果进行评估。9 S$ u* h% m) p# t1 E
! r9 m" O6 B0 f- _
ARIMA模型是时间序列分析领域中常用的模型之一,它可以用于预测未来趋势、季节性和周期性等时间序列数据的变化。在实际应用中,ARIMA模型可以被用于经济预测、股票市场分析、天气预测等各种领域。
( I: u% o6 Q1 A) l- ~
; C1 w# A, ]  j7 F. |1 i5 V  H) x# g# 导入所需的库
- P9 ]; Z7 Y2 s( @3 s! \import numpy as np
* q, j0 n. u, Z0 x+ N- timport pandas as pd# g, h' T/ g$ S+ Q3 \  f
import statsmodels.api as sm) l6 L- w- v3 n& k7 N
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
" I5 |4 |2 H  N3 h2 a& Rimport matplotlib.pyplot as plt
: g! k7 e; r' M) A/ ^7 a# I8 e2 b9 a
这些是导入需要使用的库,包括NumPy、Pandas、statsmodels和matplotlib。6 d! v4 y6 X& c
# 源数据. _1 h+ {, N8 c$ F' j: _: U8 `& y
df = pd.DataFrame({5 x7 T5 Z0 _; @
    'year': [i for i in range(1971, 1991)],
1 B3 e! Y9 ~- p+ O1 t    'num': [66.6, 68.9, 38, 34.5, 15.5,
2 R* P# i9 T0 q, b7 q            12.6, 27.5, 92.5, 155.4, 154.6,
. ]1 U" ~% I+ ~+ P+ n            140.4, 115.9, 66.6, 45.9, 17.9,, x/ l; ^  f8 N! k( g
            3.4, 29.4, 100.2, 157.6, 142.6],3 D! r- \; h  N; T) m. u1 w
})
5 x3 N+ i9 B( X
+ J: Y* j9 _/ |1 x. C. [/ E) C这里创建了一个DataFrame df,包含年份和对应的数据值。这个数据将用于建立ARIMA模型。
# h* H* t8 L9 U/ D/ w% {# 画 acf 图
1 b& W2 T+ B( Vplot_acf(df['num'])  d" _1 [4 I" n* X. n4 p5 A

, `4 U3 S* }% A, D$ v这段代码用于画出序列的自相关函数(ACF)图。ACF图可以帮助我们分析时间序列数据的自相关性。# L/ T0 x8 \8 [: F! x5 I6 [
# 画 pacf 图: k4 p* ?& Z+ C
plot_pacf(df['num'], lags=9)
, d! M" k3 T& I) l- C0 f
& C0 c& @- ?) e这段代码用于画出序列的偏自相关函数(PACF)图。PACF图可以帮助我们分析时间序列数据的偏自相关性。
: ]) g( Z& |4 r* D7 @: I% _: T- G' J# 建立模型,参考 acf、pacf 代入 p、q,观察 aic
* ?4 a6 Q; P/ ystr_list = []
( |7 m" ?2 \  K$ nfor p in range(1, 6):" J6 Y' {  v' G# ?
    for q in range(1, 3):
! z, D$ ~- X" u$ S& ^) S9 ]: ^        model = sm.tsa.ARMA(df['num'], (p, q)).fit()& T, l7 o# a, Q5 [. Y2 E" N6 U
        str_list.append('p = {}, q = {}, aic = {}'.format(p, q, model.aic))
) g8 j8 U: q( p) G+ qfor each in str_list:$ Y- i  g+ {8 `) g
    print(each)
- ^: t* U, @2 J0 q/ j. b5 i  W  ?9 b% x$ m- {
这段代码用于建立ARIMA模型并观察模型的AIC(赤池信息准则)值。通过对不同(p, q)值的组合进行模型拟合,并输出对应的AIC值,以便选择最优的(p, q)值。  @8 `: _# z. w9 E! y
# 发现 p=2,q=2 时 aic 最小,取 p=2,q=2
3 N: M+ z3 r1 z* H) ?model = sm.tsa.ARMA(df['num'], (2, 2)).fit()
; z  C+ {. s8 H  m+ R& m$ K4 vmodel.summary()6 O3 ~- O7 d( ^9 O7 V" \
* O* e! v# C% ?$ a& r4 U  l, X
根据观察AIC值的结果,选择最优(p, q)值为(2, 2),然后建立ARIMA模型并进行拟合。
/ w8 n( r7 y4 `0 x5 n# 预测和画图
( ?- i8 h+ ^$ |) @  k9 a4 cplt.plot(df['year'], df['num'])  U' i& d6 O* q# {3 D7 ]7 k0 O
plt.scatter(df['year'], df['num'], label='actual')
# Y. O$ t3 S& ?year_list = [i for i in range(1971, 2001)]# U6 b5 w3 O2 Q" C
plt.plot(year_list, model.predict(0, len(year_list)-1))
& W8 W. h% i) h9 I$ e: i; Jplt.scatter(year_list, model.predict(0, len(year_list)-1), label='predict')
; i0 q8 |/ u/ F+ g5 o2 N5 ]/ hplt.legend()6 b! F5 `9 M9 \& T  p

# S, L& f5 X) z! h% y0 k8 ~/ T这段代码用于使用拟合的模型进行预测,并绘制实际值和预测值的图表。首先画出实际值的曲线,然后画出预测值的曲线,并将预测值的点标记在图上。( }* S/ ^2 W, m8 Y
希望以上解释对你有帮助。如果你还有任何问题,请随时提问。
& e  z2 O* p, G) \) `) U1 G! R$ b: ?2 a1 P$ Y: b5 L: N
3 M/ P" h" D: f  O, h3 t3 ^

24.arma.py

1.31 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5