时间序列算法之ARIMA模型详解与python代码示例【动手学机器学习】

发布于:2024-06-26 ⋅ 阅读:(37) ⋅ 点赞:(0)

ARIMA模型详解

ARIMA(AutoRegressive Integrated Moving Average)模型是时间序列分析中一种广泛使用的统计模型。它结合了自回归(AR)模型、差分(I)和移动平均(MA)模型的特点,适用于非平稳时间序列数据的建模和预测。

ARIMA模型的定义

ARIMA模型由三个部分组成:

  1. 自回归(AR)部分:表示时间序列当前值与其前若干个时刻值之间的线性关系。
  2. 差分(I)部分:通过对时间序列进行差分操作,使其转化为平稳序列。
  3. 移动平均(MA)部分:表示时间序列当前值与前若干个时刻的误差项之间的线性关系。

ARIMA模型通常表示为 A R I M A ( ( p , d , q ) ) ARIMA((p, d, q)) ARIMA((p,d,q)),其中:

  • p 是自回归部分的阶数。
  • d 是差分次数。
  • q 是移动平均部分的阶数。

ARIMA模型的数学表达式

ARIMA((p, d, q))模型的数学表达式为:
( 1 − ∑ i = 1 p ϕ i L i ) ( 1 − L ) d X t = c + ( 1 + ∑ j = 1 q θ j L j ) ϵ t (1 - \sum_{i=1}^{p} \phi_i L^i) (1 - L)^d X_t = c + (1 + \sum_{j=1}^{q} \theta_j L^j) \epsilon_t (1i=1pϕiLi)(1L)dXt=c+(1+j=1qθjLj)ϵt

其中:

  • X t 是时间序列在时刻 t 的值。 X_t 是时间序列在时刻 t 的值。 Xt是时间序列在时刻t的值。
  • c 是常数项。 c是常数项。 c是常数项。
  • ϕ i 是自回归部分的系数。 \phi_i 是自回归部分的系数。 ϕi是自回归部分的系数。
  • θ j 是移动平均部分的系数。 \theta_j 是移动平均部分的系数。 θj是移动平均部分的系数。
  • ϵ t 是白噪声误差项,通常假设为均值为零、方差为 σ 2 的独立同分布随机变量。 \epsilon_t 是白噪声误差项,通常假设为均值为零、方差为 \sigma^2 的独立同分布随机变量。 ϵt是白噪声误差项,通常假设为均值为零、方差为σ2的独立同分布随机变量。
  • L 是滞后算子( L a g O p e r a t o r ),定义为 L k X t = X t − k . L 是滞后算子(Lag Operator),定义为 L^k X_t = X_{t-k} . L是滞后算子(LagOperator),定义为LkXt=Xtk.

ARIMA模型的步骤

  1. 平稳性检验

    • 在应用ARIMA模型之前,需要确保时间序列是平稳的。如果时间序列不是平稳的,可以通过差分等方法将其转化为平稳序列。
  2. 模型识别与阶数确定

    • 使用自相关函数(ACF)和偏自相关函数(PACF)图来识别模型的阶数 p、d和q.
    • ACF用于识别MA部分的阶数 q,PACF用于识别AR部分的阶数 p.
    • 差分次数d通常通过单位根检验(如ADF检验)确定.
  3. 模型参数估计

    • 使用最大似然估计(MLE)或最小二乘法(OLS)等方法估计模型参数 ϕ i \phi_i ϕi θ j \theta_j θj.
  4. 模型诊断

    • 检查模型的残差序列是否为白噪声,残差的ACF图是否接近零,使用Ljung-Box检验等方法进行模型诊断.
  5. 模型预测

    • 使用ARIMA模型对未来的时间序列值进行预测.

ARIMA模型的实现

以下是使用Python中的statsmodels库实现ARIMA模型的示例代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller

# 生成非平稳时间序列数据
np.random.seed(42)
n = 100
time_series = np.cumsum(np.random.randn(n))

# 绘制时间序列图
plt.figure(figsize=(12, 6))
plt.plot(time_series, label='Time Series')
plt.legend()
plt.show()

# 检查平稳性
result = adfuller(time_series)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')

# 差分使其平稳
diff_series = np.diff(time_series)

# 绘制差分后的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(diff_series, label='Differenced Time Series')
plt.legend()
plt.show()

# 绘制ACF和PACF图
fig, ax = plt.subplots(2, 1, figsize=(12, 8))
plot_acf(diff_series, lags=20, ax=ax[0])
plot_pacf(diff_series, lags=20, ax=ax[1])
plt.show()

# 确定ARIMA模型的阶数(p, d, q)
p = 2  # AR部分的阶数
d = 1  # 差分次数
q = 2  # MA部分的阶数

# 拟合ARIMA模型
model = ARIMA(time_series, order=(p, d, q))
model_fit = model.fit()

# 打印模型摘要
print(model_fit.summary())

# 预测未来的值
forecast_steps = 10
forecast = model_fit.forecast(steps=forecast_steps)
print(f"Forecast: {forecast}")

# 绘制预测结果
plt.figure(figsize=(12, 6))
plt.plot(time_series, label='Observed')
plt.plot(range(n, n + forecast_steps), forecast, label='Forecast', color='red')
plt.legend()
plt.show()

总结

ARIMA模型通过结合自回归、差分和移动平均的特点,能够有效地描述和预测非平稳时间序列数据。应用ARIMA模型时,需要进行平稳性检验、模型识别与阶数确定、参数估计、模型诊断和预测等步骤。通过合理地选择和调整模型参数,可以提高时间序列分析和预测的准确性。


网站公告

今日签到

点亮在社区的每一天
去签到