- 在线时间
- 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)来建立模型。+ @* p' v# l" z% w5 K7 `2 H
ARIMA模型的三个主要参数是p、d和q,分别对应于自回归、差分和滑动平均的阶数。4 j3 ^9 T. l* J- W% V
2 D1 k9 r7 x% z+ h A/ Q1 F1.自回归(AR):自回归部分使用先前时间点的观测值来预测当前值。p参数表示自回归的阶数,即使用多少个先前时间点的值作为预测输入。. X8 _1 { T6 B. l k- ?; S
2.差分(I):差分是对时间序列进行一阶或多阶的差分操作,可以消除序列的非平稳性。d参数表示差分的阶数,默认为1阶差分。
% f3 d6 @5 ?7 R5 u3.滑动平均(MA):滑动平均部分使用先前的误差值来预测当前值。q参数表示滑动平均的阶数,即使用多少个先前的误差值作为预测输入。1 g: s8 @# F$ u. I8 ]5 {
2 @4 _: f9 a( D( k+ I
ARIMA模型的一般表示形式为ARIMA(p, d, q),其中p、d和q是非负整数。它可以很好地处理具有线性趋势和季节性的时间序列数据。- {4 t1 t1 E/ j9 s
ARIMA模型的建立包括以下步骤:. W( Z/ `3 |- _4 |
: G; ?! j$ i. a" `6 F
4.确定时间序列数据的平稳性,如平稳性检验、观察序列的趋势和季节性等。
0 Z7 y- n9 O9 a7 t( [5.如果时间序列不平稳,进行差分操作以实现平稳性。0 z7 t0 ]: d* g9 S1 A h
6.通过观察ACF和PACF图来确定p和q的合适取值范围。
' u* V, O: d" K+ w: @7.根据AIC等准则,以不同的p、d、q值建立多个ARIMA模型。9 ^/ e+ B) t. m/ L
8.对每个模型进行参数估计和模型拟合。- b% a) |0 D) I8 t+ J' V2 {
9.使用拟合的模型进行预测,并对模型的拟合效果进行评估。
. g1 b# P" w( H- s
) M8 c7 D) D& _ARIMA模型是时间序列分析领域中常用的模型之一,它可以用于预测未来趋势、季节性和周期性等时间序列数据的变化。在实际应用中,ARIMA模型可以被用于经济预测、股票市场分析、天气预测等各种领域。# m. _( m, s) f8 \
7 Y g3 s% B$ X0 u! S# 导入所需的库7 [* P& f: z* C# i! l) v9 k' ^; ]
import numpy as np
4 u7 O! W9 V. O% W2 z1 g# Qimport pandas as pd" b4 W; O7 q+ f% k& H
import statsmodels.api as sm
( @. H# g2 j4 c9 O; jfrom statsmodels.graphics.tsaplots import plot_acf, plot_pacf
) R. ^; I7 A7 Z( a2 g: K; w- bimport matplotlib.pyplot as plt; V! |) Z4 H( v( Y
+ D9 l0 f# t* _& I9 s! ]. I0 L这些是导入需要使用的库,包括NumPy、Pandas、statsmodels和matplotlib。
5 Y9 B, _; j n7 U/ C. P# 源数据
/ a4 w& l4 s; L: Ndf = pd.DataFrame({
& A( W* S% G. w6 j$ q 'year': [i for i in range(1971, 1991)],
, N; l! c: [# v7 g0 @$ J/ f 'num': [66.6, 68.9, 38, 34.5, 15.5,! l8 S& S: a0 m5 D2 p$ z' `
12.6, 27.5, 92.5, 155.4, 154.6,
4 r' G5 }( B$ e( D 140.4, 115.9, 66.6, 45.9, 17.9,
4 k! k2 ~$ Y3 R9 _. m 3.4, 29.4, 100.2, 157.6, 142.6],& l0 G B7 `7 n7 r$ ?9 ?
})5 S' n, H4 L+ [7 c0 I. S! b1 G* |+ |
2 {7 W/ E8 M% J. e+ R: T4 i这里创建了一个DataFrame df,包含年份和对应的数据值。这个数据将用于建立ARIMA模型。$ W# m, I/ x5 N8 ?" l, t q
# 画 acf 图
0 y8 R v) |+ l0 U5 Hplot_acf(df['num'])
b" @9 S; A% B! l6 U$ g' d/ y& W
4 N# K7 g. ~- A, f这段代码用于画出序列的自相关函数(ACF)图。ACF图可以帮助我们分析时间序列数据的自相关性。
* Q K+ h$ }0 Q# 画 pacf 图( `5 v4 ]$ V4 T* w6 M) W4 b3 P7 x) P
plot_pacf(df['num'], lags=9)
) u. u4 [, F0 d6 b* h( ^( ]8 b8 s% l& o) z. H! V* H
这段代码用于画出序列的偏自相关函数(PACF)图。PACF图可以帮助我们分析时间序列数据的偏自相关性。3 a, q6 M- ^ s) i3 k G
# 建立模型,参考 acf、pacf 代入 p、q,观察 aic
! O3 v' }! b% o* ]7 F/ D' |. U- dstr_list = []; G9 C$ t, v. {* j# x
for p in range(1, 6):+ s$ |' k5 Y; w2 a9 z
for q in range(1, 3):( @0 J8 U6 v6 o+ m( _: ]
model = sm.tsa.ARMA(df['num'], (p, q)).fit()
$ q: ~+ C, Z/ x, R0 L1 s, g str_list.append('p = {}, q = {}, aic = {}'.format(p, q, model.aic))) s+ M7 l$ n; x ]$ S5 K
for each in str_list:8 v( @0 h' ?( i0 d7 B9 m
print(each)
/ g* D D+ j3 X# V
6 n# G' ^& i, p& L4 T9 D这段代码用于建立ARIMA模型并观察模型的AIC(赤池信息准则)值。通过对不同(p, q)值的组合进行模型拟合,并输出对应的AIC值,以便选择最优的(p, q)值。5 w+ `7 [6 R3 y- g1 \% g
# 发现 p=2,q=2 时 aic 最小,取 p=2,q=25 y+ a. x4 c. m# c! m; t; z
model = sm.tsa.ARMA(df['num'], (2, 2)).fit()4 U e; `/ L \6 h
model.summary()+ U, U( s2 C7 @$ a* M
4 C& |. S1 `* D% |; h4 O9 @. ?
根据观察AIC值的结果,选择最优(p, q)值为(2, 2),然后建立ARIMA模型并进行拟合。
. `8 F f P( O* ^' F8 y G7 R# 预测和画图+ ]& w0 O) p$ e
plt.plot(df['year'], df['num'])# C4 w% L$ ^' S2 h4 g2 {9 D5 d
plt.scatter(df['year'], df['num'], label='actual')' |( Q; k/ g: h2 ]- O4 @
year_list = [i for i in range(1971, 2001)]
: r$ c# ~8 `+ i! C: r- |3 wplt.plot(year_list, model.predict(0, len(year_list)-1))
, j% f9 F1 I! @plt.scatter(year_list, model.predict(0, len(year_list)-1), label='predict')
9 Y/ j% N# T6 }$ j2 }$ Z# Pplt.legend()
+ Q5 W7 h! [/ D& p* G
0 e4 ~3 f" v: b3 C这段代码用于使用拟合的模型进行预测,并绘制实际值和预测值的图表。首先画出实际值的曲线,然后画出预测值的曲线,并将预测值的点标记在图上。
0 C7 y5 \* d# O& h' |% d希望以上解释对你有帮助。如果你还有任何问题,请随时提问。2 B; A: N$ K5 X* \
. t* M: B! g, r3 p4 X
8 s! d* U% e$ @7 k+ ` } b |
zan
|