- 在线时间
- 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)来建立模型。
$ _( o, j4 ~" ?) lARIMA模型的三个主要参数是p、d和q,分别对应于自回归、差分和滑动平均的阶数。
0 U+ Z2 k2 P3 |! p/ F" `/ I
3 E. {* X2 }) s8 H. f9 l/ R! |1.自回归(AR):自回归部分使用先前时间点的观测值来预测当前值。p参数表示自回归的阶数,即使用多少个先前时间点的值作为预测输入。
' {, {: `: [% R2.差分(I):差分是对时间序列进行一阶或多阶的差分操作,可以消除序列的非平稳性。d参数表示差分的阶数,默认为1阶差分。1 M' ~1 y- ?7 ?8 G
3.滑动平均(MA):滑动平均部分使用先前的误差值来预测当前值。q参数表示滑动平均的阶数,即使用多少个先前的误差值作为预测输入。
1 S- ?7 W/ c. [8 B0 s1 ]! r5 H/ ^6 F% q) H. w& k% X
ARIMA模型的一般表示形式为ARIMA(p, d, q),其中p、d和q是非负整数。它可以很好地处理具有线性趋势和季节性的时间序列数据。# c$ u7 q6 O6 H9 |
ARIMA模型的建立包括以下步骤:
3 a* I' ^: M6 w7 Y9 m7 e% J5 U0 z8 x) W* [7 }+ G6 R1 |
4.确定时间序列数据的平稳性,如平稳性检验、观察序列的趋势和季节性等。
( X6 E7 v9 j7 ~' D1 \( O5.如果时间序列不平稳,进行差分操作以实现平稳性。& x6 J9 E( o3 C8 X0 q* v; g. l7 k
6.通过观察ACF和PACF图来确定p和q的合适取值范围。
6 c0 n* z5 C* b. J9 `1 ~7.根据AIC等准则,以不同的p、d、q值建立多个ARIMA模型。
- A5 ?0 V. [1 [' d+ q/ v8.对每个模型进行参数估计和模型拟合。! C/ L6 {; y; g2 t2 {
9.使用拟合的模型进行预测,并对模型的拟合效果进行评估。
! H3 [+ `# ?$ [# C* m2 Y4 B4 B* c' o; h( Z3 _
ARIMA模型是时间序列分析领域中常用的模型之一,它可以用于预测未来趋势、季节性和周期性等时间序列数据的变化。在实际应用中,ARIMA模型可以被用于经济预测、股票市场分析、天气预测等各种领域。
. X0 A% I3 Q" N% N9 ~* j4 K' j5 r, g1 E/ ]
# 导入所需的库$ W7 q, z+ f( [0 X
import numpy as np4 z$ m$ o- U- E( b ]# G! `
import pandas as pd2 }" U- a& k1 ]- [# a4 w4 d
import statsmodels.api as sm
* t# G X( i: zfrom statsmodels.graphics.tsaplots import plot_acf, plot_pacf0 M* x" J4 Z6 a4 q |- ?; h
import matplotlib.pyplot as plt
5 {( f$ H7 Q. {; X6 n! K* ~
" P: E& w% @! o# w' L这些是导入需要使用的库,包括NumPy、Pandas、statsmodels和matplotlib。0 S6 d8 |: v' ?& n# M
# 源数据$ \4 E+ v# A& Q; a3 f2 ?
df = pd.DataFrame({
9 |3 \- r. c- G1 r8 A) q# `0 w 'year': [i for i in range(1971, 1991)],
: p+ O0 b0 K" ^, v5 Z 'num': [66.6, 68.9, 38, 34.5, 15.5,
6 ^! S# l* B7 X o8 G 12.6, 27.5, 92.5, 155.4, 154.6,
# j1 c, p0 W- Q0 y" D' w P 140.4, 115.9, 66.6, 45.9, 17.9,4 T4 |- a7 [* e8 J
3.4, 29.4, 100.2, 157.6, 142.6],4 n7 U0 H. o/ @6 ~; f, |
})& e9 j9 f2 m/ [+ |
0 \1 U/ _6 x: r6 o* B3 ~这里创建了一个DataFrame df,包含年份和对应的数据值。这个数据将用于建立ARIMA模型。5 F, c: o% V1 f
# 画 acf 图
9 ]; Q3 U, `/ b3 xplot_acf(df['num'])
* x$ i, |7 X; H0 D" }2 _& a
6 {3 L- A1 a8 f! a# e$ V. b" F' N这段代码用于画出序列的自相关函数(ACF)图。ACF图可以帮助我们分析时间序列数据的自相关性。
1 i! s# W \# Z( p# 画 pacf 图
/ \$ Z! h' A% o# _! }- jplot_pacf(df['num'], lags=9)
) \7 b) e9 K1 p! `: ?) I9 q
6 u, `4 t* a5 T: W这段代码用于画出序列的偏自相关函数(PACF)图。PACF图可以帮助我们分析时间序列数据的偏自相关性。' H# M' w% ? f/ J; j
# 建立模型,参考 acf、pacf 代入 p、q,观察 aic
7 M) p( F. z& e% I. t Lstr_list = []5 h3 W: a/ d* `; @& U, D0 x
for p in range(1, 6):+ p& b+ d0 j( a, g4 t
for q in range(1, 3):
9 p- u/ r/ U8 L+ V7 v8 D" a% s% e model = sm.tsa.ARMA(df['num'], (p, q)).fit(): Y3 X6 I$ R; ^" g" r6 r
str_list.append('p = {}, q = {}, aic = {}'.format(p, q, model.aic))! W; E7 @1 X' {, Q. R# s) u
for each in str_list:
: K9 q) {) i0 s; P" V' Z print(each), j4 J4 i' E# s! a6 Z4 Q+ i
: t' U$ E: ^' c这段代码用于建立ARIMA模型并观察模型的AIC(赤池信息准则)值。通过对不同(p, q)值的组合进行模型拟合,并输出对应的AIC值,以便选择最优的(p, q)值。
- ^" w% V- C, z: U) V# 发现 p=2,q=2 时 aic 最小,取 p=2,q=25 Q) {" S( z' a; d- V/ L! e& M4 F# v
model = sm.tsa.ARMA(df['num'], (2, 2)).fit()
1 ~8 p: g* c5 X8 ? c* L( s+ B* Hmodel.summary()
( l- N; i8 g" } \# h# q
. ]+ z2 J- T" A% A2 i$ |4 S: W根据观察AIC值的结果,选择最优(p, q)值为(2, 2),然后建立ARIMA模型并进行拟合。
& C8 w+ ~( x5 x/ }8 \3 f1 }# 预测和画图0 H9 q! B+ Z& S+ J9 C
plt.plot(df['year'], df['num'])
) W( p a7 G5 \' R0 Hplt.scatter(df['year'], df['num'], label='actual')* W1 @; x7 r" v+ t/ C
year_list = [i for i in range(1971, 2001)]1 V# V6 b b, e# H G
plt.plot(year_list, model.predict(0, len(year_list)-1))
0 e: ~6 s$ C. W7 }" s) X6 \plt.scatter(year_list, model.predict(0, len(year_list)-1), label='predict')% p- p6 I: R" ~6 _$ ~7 j }
plt.legend()
2 j; h' E6 H( g/ L) o
1 {: g' c8 f c7 e这段代码用于使用拟合的模型进行预测,并绘制实际值和预测值的图表。首先画出实际值的曲线,然后画出预测值的曲线,并将预测值的点标记在图上。 M# A7 o$ ^! O5 k& o
希望以上解释对你有帮助。如果你还有任何问题,请随时提问。
! s: l' w" J3 O, f9 k E$ ^ _5 H o* d- i8 n ~: o0 p! O- m- z1 ?+ }
" M/ E. s/ m- y/ m# C$ r
|
zan
|