数学建模社区-数学中国
标题:
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: S
3.滑动平均(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) s
ARIMA模型的建立包括以下步骤:
; |" 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 z
5.如果时间序列不平稳,进行差分操作以实现平稳性。
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' t
9.使用拟合的模型进行预测,并对模型的拟合效果进行评估。
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- t
import 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& R
import 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( V
plot_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/ y
str_list = []
( |7 m" ?2 \ K$ n
for 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+ q
for 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 v
model.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 c
plt.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; J
plt.scatter(year_list, model.predict(0, len(year_list)-1), label='predict')
; i0 q8 |/ u/ F+ g5 o2 N5 ]/ h
plt.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
2024-3-20 10:19 上传
点击文件名下载附件
下载积分: 体力 -2 点
1.31 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价:
2 点体力
[
记录
] [
购买
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5