数学建模社区-数学中国
标题:
ARMA 模型使用拟合的模型进行预测
[打印本页]
作者:
2744557306
时间:
2024-3-20 10:19
标题:
ARMA 模型使用拟合的模型进行预测
ARIMA(Autoregressive Integrated Moving Average)模型是一种常用的时间序列分析方法,用于对时间序列数据建模和预测。它通过结合自回归(AR)和滑动平均(MA)模型的特性,并对序列进行差分(Integration,即I)来建立模型。
: b5 ?, r- Q- c: v
ARIMA模型的三个主要参数是p、d和q,分别对应于自回归、差分和滑动平均的阶数。
2 J: s; O. z; i, X7 L! P) `2 ]
5 ]4 l' y4 K$ {2 H$ }
1.自回归(AR):自回归部分使用先前时间点的观测值来预测当前值。p参数表示自回归的阶数,即使用多少个先前时间点的值作为预测输入。
* ?# l& }6 B( A
2.差分(I):差分是对时间序列进行一阶或多阶的差分操作,可以消除序列的非平稳性。d参数表示差分的阶数,默认为1阶差分。
% o) X& s: d9 z" b2 r8 ?
3.滑动平均(MA):滑动平均部分使用先前的误差值来预测当前值。q参数表示滑动平均的阶数,即使用多少个先前的误差值作为预测输入。
. u/ ]! _3 y2 h; N: ^0 o3 u( v# ~
9 O) u. x! s0 i p# }5 W
ARIMA模型的一般表示形式为ARIMA(p, d, q),其中p、d和q是非负整数。它可以很好地处理具有线性趋势和季节性的时间序列数据。
1 k+ S7 U5 b3 y2 A
ARIMA模型的建立包括以下步骤:
- O3 c+ C3 a# b' S. I
+ h! }0 R* T: {: l, r" \ j
4.确定时间序列数据的平稳性,如平稳性检验、观察序列的趋势和季节性等。
, ?: \: S% ]* N/ C, T, C. V
5.如果时间序列不平稳,进行差分操作以实现平稳性。
9 m4 J0 f$ L5 E$ g) E, c
6.通过观察ACF和PACF图来确定p和q的合适取值范围。
) d3 e7 m9 q5 E/ j3 d2 P: H
7.根据AIC等准则,以不同的p、d、q值建立多个ARIMA模型。
5 K! ^4 b6 Y) P" C# N
8.对每个模型进行参数估计和模型拟合。
/ \0 F* W7 t$ t
9.使用拟合的模型进行预测,并对模型的拟合效果进行评估。
/ U' k G/ Y; h" q2 q* o
, X% m: B6 c5 x# I/ F1 h
ARIMA模型是时间序列分析领域中常用的模型之一,它可以用于预测未来趋势、季节性和周期性等时间序列数据的变化。在实际应用中,ARIMA模型可以被用于经济预测、股票市场分析、天气预测等各种领域。
% D/ a( j7 c; J* y
6 X8 U9 ~2 r W2 t
# 导入所需的库
. Q- V' `9 U5 k* j9 }( J& ~$ u
import numpy as np
9 R3 }& ]! I/ Y/ m7 a5 m" R
import pandas as pd
' y2 N3 O( D7 U s5 k
import statsmodels.api as sm
; j" n! k5 Y9 h* l
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
1 M& Q! g D# n1 P; l, {! ~' P
import matplotlib.pyplot as plt
0 Y% ?+ Z5 |8 l4 V }& Y! k
9 Z! q* w, F) U0 H8 n2 Q# _
这些是导入需要使用的库,包括NumPy、Pandas、statsmodels和matplotlib。
( V M9 s+ j" y6 |3 Q$ Z
# 源数据
% v' O8 ` d8 C) C' [8 A
df = pd.DataFrame({
. Q+ B2 c& W3 v8 u) W* X: K% E7 _
'year': [i for i in range(1971, 1991)],
8 b$ w" I7 D( ? i9 m. t
'num': [66.6, 68.9, 38, 34.5, 15.5,
$ _4 K, U6 w. S
12.6, 27.5, 92.5, 155.4, 154.6,
6 `% @( h. S/ i P) `/ t# B
140.4, 115.9, 66.6, 45.9, 17.9,
& K6 z. T7 ~7 `8 S8 i. X' r( {
3.4, 29.4, 100.2, 157.6, 142.6],
/ s2 d9 R( i; |; K- u' W4 H
})
" G6 q2 B: S6 z8 B3 |8 n
! l- }4 v9 f8 ~' R
这里创建了一个DataFrame df,包含年份和对应的数据值。这个数据将用于建立ARIMA模型。
3 ]5 _* l) X6 C6 ]" \) x I. C& g
# 画 acf 图
3 r. E3 W) }( A2 c0 L
plot_acf(df['num'])
+ a- q8 l- f) p b }( b0 \9 p
- \" }0 K7 m7 s" k
这段代码用于画出序列的自相关函数(ACF)图。ACF图可以帮助我们分析时间序列数据的自相关性。
$ [7 s2 \& C) p" ]/ ~/ \
# 画 pacf 图
4 }& d; L' S4 b6 L! g# N
plot_pacf(df['num'], lags=9)
# h* h* l( o+ J# {' @2 E
; K) x- D$ e& _5 g- B* H/ _( e9 M
这段代码用于画出序列的偏自相关函数(PACF)图。PACF图可以帮助我们分析时间序列数据的偏自相关性。
: k/ }5 L" L( K3 g7 r' c
# 建立模型,参考 acf、pacf 代入 p、q,观察 aic
) F" I" `. N! Z1 ^6 P
str_list = []
( c: \% t3 [. e3 R
for p in range(1, 6):
z) s. U% g) _8 B" Q! q# v
for q in range(1, 3):
6 m. r7 k: y" ^$ f# ]& t
model = sm.tsa.ARMA(df['num'], (p, q)).fit()
# \* _. t; b4 J' @8 ^7 w" u
str_list.append('p = {}, q = {}, aic = {}'.format(p, q, model.aic))
+ @9 s$ o7 \1 T3 a9 y4 `7 ?) R
for each in str_list:
+ ?" s% G; h7 C3 I7 L( ?3 d* K
print(each)
+ Q$ K, A* H1 U4 ]* L
4 {$ u# ^& P7 E5 C* }) M
这段代码用于建立ARIMA模型并观察模型的AIC(赤池信息准则)值。通过对不同(p, q)值的组合进行模型拟合,并输出对应的AIC值,以便选择最优的(p, q)值。
! w0 h2 L' D/ Q
# 发现 p=2,q=2 时 aic 最小,取 p=2,q=2
3 F, t" l5 k/ K5 Q8 ?
model = sm.tsa.ARMA(df['num'], (2, 2)).fit()
) w2 u U9 V9 g: K
model.summary()
) m. q# Q! R/ I0 E/ Y; p5 G. b* A
6 W0 C0 l- K8 n3 F
根据观察AIC值的结果,选择最优(p, q)值为(2, 2),然后建立ARIMA模型并进行拟合。
; R$ m7 q5 e6 h* }7 s7 J; }( T
# 预测和画图
G( V) N+ N4 ]
plt.plot(df['year'], df['num'])
( S6 Y0 ?2 w- X" L% n1 [% @' F/ z
plt.scatter(df['year'], df['num'], label='actual')
6 I5 P: b; q' g5 c9 ?% b: z; h
year_list = [i for i in range(1971, 2001)]
0 T/ ~$ u; q8 X! ]% `! q
plt.plot(year_list, model.predict(0, len(year_list)-1))
$ x7 s# M+ r' E- J, o( ]. ^/ L
plt.scatter(year_list, model.predict(0, len(year_list)-1), label='predict')
) C* }, K/ I7 ]' H
plt.legend()
% l+ R7 C1 b. b. r- G
* o4 Q' E: x7 l8 l7 X8 D p
这段代码用于使用拟合的模型进行预测,并绘制实际值和预测值的图表。首先画出实际值的曲线,然后画出预测值的曲线,并将预测值的点标记在图上。
; y R$ M W; N' i( _6 c/ a1 r
希望以上解释对你有帮助。如果你还有任何问题,请随时提问。
% F8 |: c Q" ^: f
0 T& X7 ?/ b/ s! g
/ o# l4 B0 X ^& ~7 Q( }. q
24.arma.py
2024-3-20 10:19 上传
点击文件名下载附件
下载积分: 体力 -2 点
1.31 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价:
2 点体力
[
记录
] [
购买
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5