数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-20 10:19
标题: ARMA 模型使用拟合的模型进行预测
ARIMA(Autoregressive Integrated Moving Average)模型是一种常用的时间序列分析方法,用于对时间序列数据建模和预测。它通过结合自回归(AR)和滑动平均(MA)模型的特性,并对序列进行差分(Integration,即I)来建立模型。! B* m1 Y7 w+ d
ARIMA模型的三个主要参数是p、d和q,分别对应于自回归、差分和滑动平均的阶数。
7 {; Q& @0 n. i4 o5 F
' P4 p) E- @( r# z+ [7 L1.自回归(AR):自回归部分使用先前时间点的观测值来预测当前值。p参数表示自回归的阶数,即使用多少个先前时间点的值作为预测输入。, U9 @8 o- {7 ^! X. z! c9 A4 d
2.差分(I):差分是对时间序列进行一阶或多阶的差分操作,可以消除序列的非平稳性。d参数表示差分的阶数,默认为1阶差分。
& [; X+ C" \9 J$ A! m+ B8 u* m3.滑动平均(MA):滑动平均部分使用先前的误差值来预测当前值。q参数表示滑动平均的阶数,即使用多少个先前的误差值作为预测输入。
' d0 H" ^/ v4 }. Z8 U+ C4 N
/ A* ?: c+ ~( b/ _# n* J1 G! w3 ZARIMA模型的一般表示形式为ARIMA(p, d, q),其中p、d和q是非负整数。它可以很好地处理具有线性趋势和季节性的时间序列数据。- E6 e& U4 \, W  d  H/ v
ARIMA模型的建立包括以下步骤:; }' K' L* T/ X

! J. b2 Q6 n" n+ o4.确定时间序列数据的平稳性,如平稳性检验、观察序列的趋势和季节性等。8 x! |: O. m$ {$ J3 J0 t: K
5.如果时间序列不平稳,进行差分操作以实现平稳性。
3 `" ^* _' k4 B1 n6.通过观察ACF和PACF图来确定p和q的合适取值范围。: w# y" l9 d! }
7.根据AIC等准则,以不同的p、d、q值建立多个ARIMA模型。
8 H9 x8 a" g# O8 S8.对每个模型进行参数估计和模型拟合。* r% H. E9 y3 }! s5 m! }# n
9.使用拟合的模型进行预测,并对模型的拟合效果进行评估。
$ O: f- o- s2 o/ g5 {) K
+ f1 G4 r( _; g) q; z6 j) k, h/ eARIMA模型是时间序列分析领域中常用的模型之一,它可以用于预测未来趋势、季节性和周期性等时间序列数据的变化。在实际应用中,ARIMA模型可以被用于经济预测、股票市场分析、天气预测等各种领域。
# M2 Z% X2 k& ~' @, x# r1 Y, o) T  @) z+ f5 I( f% ~
# 导入所需的库' L7 {+ g5 j) i- Q$ P
import numpy as np% T$ p# ?6 z; C/ @0 @' E
import pandas as pd2 S  B2 v0 r9 }& a, R
import statsmodels.api as sm
' j, j0 p  a) I$ N6 F, Sfrom statsmodels.graphics.tsaplots import plot_acf, plot_pacf1 A& s* f- w. H6 A6 R$ m$ {
import matplotlib.pyplot as plt
' b; S2 `, s; Y/ D9 @: R# w( |
# S8 }3 Q" G5 f3 b这些是导入需要使用的库,包括NumPy、Pandas、statsmodels和matplotlib。
. o% `* g, E3 G# 源数据- F! R% [( ~! U' H/ n- G
df = pd.DataFrame({
1 Y$ [: j0 E- ?# l    'year': [i for i in range(1971, 1991)],
6 m3 \) ]5 F5 e5 a    'num': [66.6, 68.9, 38, 34.5, 15.5,
( x' l: i4 d* |  d" ~; G- I            12.6, 27.5, 92.5, 155.4, 154.6,+ }# E; k: a+ Q) C; _8 U
            140.4, 115.9, 66.6, 45.9, 17.9,
: c+ t# f) A( O: |6 L3 B            3.4, 29.4, 100.2, 157.6, 142.6],0 Z5 V  O$ \. R" X: \  X" D1 A/ w
})
2 I: A% i& p: \& n6 d3 ~% J5 B
" H/ V' `& G! O0 k1 q5 T$ B1 K, Q这里创建了一个DataFrame df,包含年份和对应的数据值。这个数据将用于建立ARIMA模型。
( D3 m$ ]) U6 R6 t4 w# 画 acf 图
/ r  j0 U: y+ m; xplot_acf(df['num'])3 F, j+ G5 W  j
- o3 V9 I! m7 w+ c- S" f' b3 A& P
这段代码用于画出序列的自相关函数(ACF)图。ACF图可以帮助我们分析时间序列数据的自相关性。
5 B$ ^4 i0 Q3 W( C# 画 pacf 图# ~1 r3 x# C' s2 S; ^) }: J4 ?% G: D
plot_pacf(df['num'], lags=9)# l7 Y* @, s  x
3 w: {$ ^3 ?% o& e$ T( g  Q& `
这段代码用于画出序列的偏自相关函数(PACF)图。PACF图可以帮助我们分析时间序列数据的偏自相关性。
" t$ e7 z4 Q9 J# 建立模型,参考 acf、pacf 代入 p、q,观察 aic! E- \0 L1 i$ v5 A; z" Y5 S6 f
str_list = []6 _& f: }$ u2 t2 Z( E) A6 o
for p in range(1, 6):
7 {' E* Q( ~& S3 p- M    for q in range(1, 3):) ~7 p; m+ K5 ]
        model = sm.tsa.ARMA(df['num'], (p, q)).fit()
% ~; g( ^. U* f. {( n3 `4 ?; V8 [        str_list.append('p = {}, q = {}, aic = {}'.format(p, q, model.aic)), G- y1 G* G0 ^; c, N* f2 O
for each in str_list:
# h' z6 o/ K2 e) v3 A! A    print(each)9 f3 d) V' S# ^5 O( q$ o
3 N# n, |+ o  n: B! L
这段代码用于建立ARIMA模型并观察模型的AIC(赤池信息准则)值。通过对不同(p, q)值的组合进行模型拟合,并输出对应的AIC值,以便选择最优的(p, q)值。- _  z. k3 i' W$ K; u2 ~4 e# L* n2 e
# 发现 p=2,q=2 时 aic 最小,取 p=2,q=29 S" l7 M% W! X( U
model = sm.tsa.ARMA(df['num'], (2, 2)).fit()
% @+ c. W9 H9 x3 g* lmodel.summary()8 c) }: F, j/ a' |
( b  T/ ^5 ^8 [8 ?) \
根据观察AIC值的结果,选择最优(p, q)值为(2, 2),然后建立ARIMA模型并进行拟合。6 B$ L9 O& i3 p2 d" W
# 预测和画图
( {" s% |, k1 ?( ]0 t; w- }plt.plot(df['year'], df['num'])3 T% K5 z$ U& d! i/ j
plt.scatter(df['year'], df['num'], label='actual')
* s/ |2 {  a6 Tyear_list = [i for i in range(1971, 2001)]
0 C6 Z- |  ?7 Z5 ?  F- Tplt.plot(year_list, model.predict(0, len(year_list)-1))5 _& k6 z( m7 s7 ]3 a: @  f
plt.scatter(year_list, model.predict(0, len(year_list)-1), label='predict')
1 w. ~# N2 G; h( \plt.legend()
$ Y& E( j. B5 `" v& O+ a/ z4 o. _# \3 q% w# F. A+ j
这段代码用于使用拟合的模型进行预测,并绘制实际值和预测值的图表。首先画出实际值的曲线,然后画出预测值的曲线,并将预测值的点标记在图上。
6 g. S$ H5 v6 Q( ^希望以上解释对你有帮助。如果你还有任何问题,请随时提问。
0 v; h: L/ b) E7 C" T5 V
4 D+ u. S% ]# ^/ l0 f& d$ r; d; x0 k

24.arma.py

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

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






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