- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
ARIMA(Autoregressive Integrated Moving Average)模型是一种常用的时间序列分析方法,用于对时间序列数据建模和预测。它通过结合自回归(AR)和滑动平均(MA)模型的特性,并对序列进行差分(Integration,即I)来建立模型。% E/ K7 e8 S- E7 D
ARIMA模型的三个主要参数是p、d和q,分别对应于自回归、差分和滑动平均的阶数。3 I* s1 @3 }( M
. {, C* {# d7 [0 \1 x$ b1.自回归(AR):自回归部分使用先前时间点的观测值来预测当前值。p参数表示自回归的阶数,即使用多少个先前时间点的值作为预测输入。
8 q! ] i& B6 N; [" p2.差分(I):差分是对时间序列进行一阶或多阶的差分操作,可以消除序列的非平稳性。d参数表示差分的阶数,默认为1阶差分。6 ~3 d/ U% t* l, o" b7 y
3.滑动平均(MA):滑动平均部分使用先前的误差值来预测当前值。q参数表示滑动平均的阶数,即使用多少个先前的误差值作为预测输入。5 l7 V! k; Q, C/ v2 V$ {
6 B" ?4 \( e; _" FARIMA模型的一般表示形式为ARIMA(p, d, q),其中p、d和q是非负整数。它可以很好地处理具有线性趋势和季节性的时间序列数据。0 P' a. S8 ~$ h! b( ^
ARIMA模型的建立包括以下步骤:( q( ^ n- l# ~0 l2 C3 y* B
, a. {/ p' `2 C3 n. u4.确定时间序列数据的平稳性,如平稳性检验、观察序列的趋势和季节性等。
) c+ i- {# w- ?: J/ c ?' ?0 b5.如果时间序列不平稳,进行差分操作以实现平稳性。
! h" J5 |9 c6 ~& w4 P( ~6.通过观察ACF和PACF图来确定p和q的合适取值范围。 c# P" o0 U$ n E) \- u
7.根据AIC等准则,以不同的p、d、q值建立多个ARIMA模型。0 |. E- c, o4 j' C2 g" S7 n: R( y
8.对每个模型进行参数估计和模型拟合。8 {) }; y6 J- f8 T* D5 b& q
9.使用拟合的模型进行预测,并对模型的拟合效果进行评估。) q) Q5 ]" G: b
4 N: ]9 I: c" i% b6 kARIMA模型是时间序列分析领域中常用的模型之一,它可以用于预测未来趋势、季节性和周期性等时间序列数据的变化。在实际应用中,ARIMA模型可以被用于经济预测、股票市场分析、天气预测等各种领域。9 Y: B1 ^/ ^* N) U, m" E/ s
& A: T: W& t7 b4 D# 导入所需的库
7 s9 \$ |" W7 n I+ g( iimport numpy as np
3 E: g1 w% S! Z$ Fimport pandas as pd
$ L4 `& }( j+ Iimport statsmodels.api as sm4 U* ?4 @: d, z+ G6 G+ U7 W
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf! B4 V k: B4 K$ |
import matplotlib.pyplot as plt
* [* n [. {3 Y, L
8 B. Z# R, V M, }' p" w这些是导入需要使用的库,包括NumPy、Pandas、statsmodels和matplotlib。
; f5 L6 g: T8 E1 Y x4 {7 G# 源数据
* m! U3 H; G0 v qdf = pd.DataFrame({0 J, D: k( j. V: [
'year': [i for i in range(1971, 1991)],
5 s% h9 N4 ?- q+ V% s" z0 E 'num': [66.6, 68.9, 38, 34.5, 15.5,
' R5 j9 A! W- o/ D! v 12.6, 27.5, 92.5, 155.4, 154.6,
3 l7 C' j0 ~5 d+ S+ K 140.4, 115.9, 66.6, 45.9, 17.9,! M2 n% j( H. K2 f: e3 z3 l. b
3.4, 29.4, 100.2, 157.6, 142.6],/ f% `4 g9 D J2 |. m
}); j1 u. l( g" z/ e+ H7 s4 N
1 b% r/ M* L' `' T4 \* K
这里创建了一个DataFrame df,包含年份和对应的数据值。这个数据将用于建立ARIMA模型。0 j; G0 ?( R' x0 a( `' O
# 画 acf 图
0 F, q3 Z8 a' s$ p& W) `plot_acf(df['num'])1 d, h* _. D; W6 F$ H
; Q: \! q+ W! x7 R2 ?, X9 E! e这段代码用于画出序列的自相关函数(ACF)图。ACF图可以帮助我们分析时间序列数据的自相关性。
' j/ {" S t8 Z& C' o# 画 pacf 图
) I! e+ h0 x! f2 { L& V% Wplot_pacf(df['num'], lags=9)' D' v4 V% J6 o* Q8 W; y+ u$ S
+ f2 h4 ~+ h# M! g8 E# r这段代码用于画出序列的偏自相关函数(PACF)图。PACF图可以帮助我们分析时间序列数据的偏自相关性。9 C& K: o; h% d" C y; _' O
# 建立模型,参考 acf、pacf 代入 p、q,观察 aic9 y$ I6 `( r, ?9 l- C& t8 F. I
str_list = []
- Z; @* z! Y* J7 j' jfor p in range(1, 6):( e. F* T( i! u: j6 {4 l K2 c4 |
for q in range(1, 3):( f* e: F. a! J3 i
model = sm.tsa.ARMA(df['num'], (p, q)).fit(), v: t* W3 f- d# f. L7 i
str_list.append('p = {}, q = {}, aic = {}'.format(p, q, model.aic)), L( s! R- B/ s
for each in str_list:8 `% M+ J9 m ?* r1 H" ~7 a
print(each)
9 s; t P/ V* w7 `+ {$ B
2 w7 ?2 E& {$ g1 R: B这段代码用于建立ARIMA模型并观察模型的AIC(赤池信息准则)值。通过对不同(p, q)值的组合进行模型拟合,并输出对应的AIC值,以便选择最优的(p, q)值。, W: _7 `/ F0 |" a- \, O( ^. x
# 发现 p=2,q=2 时 aic 最小,取 p=2,q=21 W& z! Q; d1 I5 h# y
model = sm.tsa.ARMA(df['num'], (2, 2)).fit()
/ y5 ~; `$ m: A7 umodel.summary()2 |6 Y8 O4 a9 }5 Q+ h
) f( y$ n* v; t& b. C" `# @根据观察AIC值的结果,选择最优(p, q)值为(2, 2),然后建立ARIMA模型并进行拟合。3 x9 E. Z- z. }* D& K6 @) @! ~
# 预测和画图5 m9 ^# y* u* _4 j* Y6 {
plt.plot(df['year'], df['num'])
- C) ^+ |* b$ h- ?: O$ @plt.scatter(df['year'], df['num'], label='actual')8 l0 n0 ]: f1 C/ }0 l# u/ Z
year_list = [i for i in range(1971, 2001)]
% Z. _, D! E& S' jplt.plot(year_list, model.predict(0, len(year_list)-1))
% m, g# [' B' y: |plt.scatter(year_list, model.predict(0, len(year_list)-1), label='predict')$ \$ T5 B- B2 ~& l0 F' m* d+ Q8 ^
plt.legend()
7 K7 B( M5 T; F. p& W( Q6 d9 A& { E8 k- F! H5 c4 ]1 K
这段代码用于使用拟合的模型进行预测,并绘制实际值和预测值的图表。首先画出实际值的曲线,然后画出预测值的曲线,并将预测值的点标记在图上。
& W; }' s. ^# N O% Q' P4 x希望以上解释对你有帮助。如果你还有任何问题,请随时提问。
' U* D4 a9 d& g, J
) ~# x& p) ]( a: O$ v* k8 k$ {9 }
|
zan
|