当前位置: 首页 > news >正文

【数学建模】(时间序列模型)ARIMA时间序列模型

ARIMA时间序列模型详解及常见时间序列模型概览

文章目录

  • ARIMA时间序列模型详解及常见时间序列模型概览
    • 1 引言
    • 2 ARIMA模型的基本概念
    • 3 ARIMA模型的组成部分详解
      • 3.1 AR模型 (自回归模型)
      • 3.2 MA模型 (移动平均模型)
      • 3 I (差分)
    • 4 ARIMA模型的建模步骤
    • 5 Python实现ARIMA模型
    • 6 常见时间序列模型概览
      • 1. 简单时间序列模型
      • 2. 指数平滑模型
      • 3. ARIMA族模型
      • 4. 状态空间模型
      • 5. 机器学习和深度学习模型
    • 7 ARIMA模型的优缺点
      • 优点
      • 缺点
    • 8 如何选择合适的时间序列模型
    • 9 结论
    • 参考资料

1 引言

时间序列分析在数据科学中占据重要地位,广泛应用于金融、经济、气象等领域。本文将详细介绍ARIMA模型的基本原理和应用,并简要概述其他常见的时间序列模型,帮助读者了解时间序列分析的全貌。

2 ARIMA模型的基本概念

ARIMA模型全称为自回归差分移动平均模型(AutoRegressive Integrated Moving Average),由三部分组成:

  • AR (AutoRegressive): 自回归部分
  • I (Integrated): 差分部分
  • MA (Moving Average): 移动平均部分

通常表示为ARIMA(p,d,q),其中:

  • p: 自回归项数
  • d: 差分次数
  • q: 移动平均项数

ARIMA模型的基本思想是利用数据本身的历史信息来预测未来。一个时间点上的标签值既受过去一段时间内的标签值影响,也受过去一段时间内的偶然事件的影响,这就是说,ARIMA模型假设:标签值是围绕着时间的大趋势而波动的,其中趋势是受历史标签影响构成的,波动是受一段时间内的偶然事件影响构成的,且大趋势本身不一定是稳定的。

简而言之,ARIMA模型就是试图通过数据的自相关性和差分的方式,提取出隐藏在数据背后的时间序列模式,然后用这些模式来预测未来的数据。其中:

  1. AR部分用于处理时间序列的自回归部分,它考虑了过去若干时期的观测值对当前值的影响。

  2. I部分用于使非平稳时间序列达到平稳,通过一阶或者二阶等差分处理,消除了时间序列中的趋势和季节性因素。

  3. MA部分用于处理时间序列的移动平均部分,它考虑了过去的预测误差对当前值的影响。

结合这三部分,ARIMA模型既可以捕捉到数据的趋势变化,又可以处理那些有临时、突发的变化或者噪声较大的数据。所以,ARIMA模型在很多时间序列预测问题中都有很好的表现。

3 ARIMA模型的组成部分详解

3.1 AR模型 (自回归模型)

AR模型,即自回归模型,其优势是对于具有较长历史趋势的数据,AR模型可以捕获这些趋势,并据此进行预测。但是AR模型不能很好地处理某些类型的时间序列数据,例如那些有临时、突发的变化或者噪声较大的数据。AR模型相信“历史决定未来”,因此很大程度上忽略了现实情况的复杂性、也忽略了真正影响标签的因子带来的不可预料的影响。

AR§模型假设当前值与过去p个时间点的值线性相关。数学表达式为:

X t = c + ϕ 1 X t − 1 + ϕ 2 X t − 2 + . . . + ϕ p X t − p + ε t X_t = c + \phi_1 X_{t-1} + \phi_2 X_{t-2} + ... + \phi_p X_{t-p} + \varepsilon_t Xt=c+ϕ1Xt1+ϕ2Xt2+...+ϕpXtp+εt

其中:

  • X t X_t Xt 是t时刻的值
  • c c c 是常数项
  • ϕ 1 , ϕ 2 , . . . , ϕ p \phi_1, \phi_2, ..., \phi_p ϕ1,ϕ2,...,ϕp 是模型参数
  • ε t \varepsilon_t εt 是白噪声

3.2 MA模型 (移动平均模型)

相反地,MA模型,即移动平均模型,可以更好地处理那些有临时、突发的变化或者噪声较大的时间序列数据。但是对于具有较长历史趋势的数据,MA模型可能无法像AR模型那样捕捉到这些趋势。MA模型相信“时间序列是相对稳定的,时间序列的波动是由偶然因素影响决定的”,但现实中的时间序列很难一直维持“稳定”这一假设。

(P.S. ARIMA模型是一种结合了AR模型和MA模型优点的模型,可以处理更复杂的时间序列问题。参考资料:时间序列模型(四):ARIMA模型)

MA(q)模型假设当前值与过去q个预测误差项线性相关。数学表达式为:

X t = μ + ε t + θ 1 ε t − 1 + θ 2 ε t − 2 + . . . + θ q ε t − q X_t = \mu + \varepsilon_t + \theta_1 \varepsilon_{t-1} + \theta_2 \varepsilon_{t-2} + ... + \theta_q \varepsilon_{t-q} Xt=μ+εt+θ1εt1+θ2εt2+...+θqεtq

其中:

  • μ \mu μ 是期望值
  • ε t \varepsilon_t εt 是白噪声
  • θ 1 , θ 2 , . . . , θ q \theta_1, \theta_2, ..., \theta_q θ1,θ2,...,θq 是模型参数

3 I (差分)

差分操作用于使非平稳时间序列转化为平稳序列(P.S. GNSS中的周跳检测)。d阶差分定义为:

∇ d X t = ( 1 − B ) d X t \nabla^d X_t = (1-B)^d X_t dXt=(1B)dXt

其中B是后移算子, B X t = X t − 1 B X_t = X_{t-1} BXt=Xt1

4 ARIMA模型的建模步骤

  1. 平稳性检验:使用ADF检验等方法检验时间序列是否平稳
  2. 差分处理:如果序列非平稳,进行差分直到序列平稳
  3. 模型识别:通过ACF和PACF图确定合适的p、q值
  4. 模型拟合:估计模型参数
  5. 模型诊断:检验残差是否为白噪声
  6. 模型预测:使用拟合好的模型进行预测

5 Python实现ARIMA模型

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf# 加载数据
data = pd.read_csv('data.csv', index_col='date', parse_dates=True)
ts = data['value']# 平稳性检验
def test_stationarity(timeseries):# ADF检验dftest = adfuller(timeseries, autolag='AIC')dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])for key, value in dftest[4].items():dfoutput['Critical Value (%s)'%key] = valueprint(dfoutput)# 差分处理
ts_diff = ts.diff().dropna()# 模型拟合
model = ARIMA(ts, order=(1, 1, 1))  # ARIMA(p,d,q)
model_fit = model.fit()
print(model_fit.summary())# 模型预测
forecast = model_fit.forecast(steps=10)  # 预测未来10个时间点

6 常见时间序列模型概览

除了ARIMA模型外,时间序列分析还有许多其他模型,以下是一些常见的时间序列模型:

1. 简单时间序列模型

  • 简单平均模型:使用历史数据的平均值作为预测值
  • 朴素模型(Naive Method):使用最近一期的观测值作为预测值
  • 季节性朴素模型:使用上一个季节周期对应时间点的值作为预测值
  • 移动平均模型:使用过去n个时间点的平均值作为预测值

2. 指数平滑模型

  • 简单指数平滑(SES):适用于无趋势、无季节性的数据
    y ^ t + 1 = α y t + ( 1 − α ) y ^ t \hat{y}_{t+1} = \alpha y_t + (1-\alpha)\hat{y}_t y^t+1=αyt+(1α)y^t

  • Holt线性趋势模型:适用于有趋势、无季节性的数据
    KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲ \hat{y}_{t+h} …

  • Holt-Winters季节性模型:适用于有趋势、有季节性的数据

    • 加法形式和乘法形式

3. ARIMA族模型

  • SARIMA:季节性ARIMA,处理具有季节性的时间序列
    S A R I M A ( p , d , q ) ( P , D , Q ) s SARIMA(p,d,q)(P,D,Q)_s SARIMA(p,d,q)(P,D,Q)s

  • ARIMAX:带外生变量的ARIMA模型
    X t = c + ϕ 1 X t − 1 + . . . + ϕ p X t − p + β 1 Z 1 , t + . . . + β k Z k , t + ε t + θ 1 ε t − 1 + . . . + θ q ε t − q X_t = c + \phi_1 X_{t-1} + ... + \phi_p X_{t-p} + \beta_1 Z_{1,t} + ... + \beta_k Z_{k,t} + \varepsilon_t + \theta_1 \varepsilon_{t-1} + ... + \theta_q \varepsilon_{t-q} Xt=c+ϕ1Xt1+...+ϕpXtp+β1Z1,t+...+βkZk,t+εt+θ1εt1+...+θqεtq

  • VARIMA:向量ARIMA,处理多变量时间序列

  • GARCH:广义自回归条件异方差模型,用于建模波动性
    σ t 2 = ω + ∑ i = 1 p α i ε t − i 2 + ∑ j = 1 q β j σ t − j 2 \sigma_t^2 = \omega + \sum_{i=1}^{p} \alpha_i \varepsilon_{t-i}^2 + \sum_{j=1}^{q} \beta_j \sigma_{t-j}^2 σt2=ω+i=1pαiεti2+j=1qβjσtj2

4. 状态空间模型

  • 卡尔曼滤波:递归估计动态系统状态的算法
  • 结构时间序列模型:将时间序列分解为趋势、季节性和不规则成分

5. 机器学习和深度学习模型

  • Prophet:Facebook开发的时间序列预测工具,适合处理具有强季节性的数据
  • LSTM (长短期记忆网络):一种特殊的RNN,能够学习长期依赖关系
  • GRU (门控循环单元):LSTM的简化版本,计算效率更高
  • Transformer:基于注意力机制的模型,近年来在时间序列预测中表现出色
  • N-BEATS:纯深度学习方法,不依赖于传统的时间序列分解

7 ARIMA模型的优缺点

优点

  1. 理论基础扎实,模型简单易懂
  2. 适用于大多数线性时间序列问题
  3. 预测短期趋势效果较好
  4. 模型解释性强

缺点

  1. 只适用于平稳或可通过差分转化为平稳的时间序列
  2. 对非线性关系的建模能力有限
  3. 需要较长的历史数据才能得到较好的效果
  4. 不适合处理具有长期记忆特性的序列

8 如何选择合适的时间序列模型

选择时间序列模型时,需要考虑以下因素:

  1. 数据特性:是否存在趋势、季节性、周期性
  2. 预测时间范围:短期预测和长期预测适合的模型不同
  3. 数据量:深度学习模型通常需要更多的数据
  4. 解释性需求:是否需要理解模型的内部机制
  5. 计算资源:复杂模型需要更多的计算资源

9 结论

ARIMA作为经典的时间序列分析模型,在许多场景下仍然表现良好。随着机器学习和深度学习的发展,时间序列分析工具箱不断丰富,为不同的应用场景提供了更多选择。在实际应用中,应根据具体问题特点选择合适的模型,有时候甚至可以将多种模型结合使用,以获得更好的预测效果。

参考资料

  1. Box, G. E. P., & Jenkins, G. M. (1976). Time Series Analysis: Forecasting and Control.
  2. Hyndman, R. J., & Athanasopoulos, G. (2018). Forecasting: Principles and Practice.
  3. statsmodels官方文档: https://www.statsmodels.org/
  4. 时间序列模型(四):ARIMA模型

希望这篇文章对您了解ARIMA和其他时间序列模型有所帮助!如有任何问题,欢迎在评论区留言交流。


http://www.mrgr.cn/news/97217.html

相关文章:

  • #SVA语法滴水穿石# (013)关于内建系统函数
  • 实践:用Ollama+DeepSeek-R1搭建AI知识库
  • 博途 TIA Portal之1200做主站与200SMART的S7通讯
  • Axure RP9.0教程: 查询条件隐藏与显示(综合了动态面板状态切换及展开收缩效果实现)
  • C++ KMP算法
  • #SVA语法滴水穿石# (013)关于 disable iff、matched 、expect 的用法
  • 贪心算法之最小生成树问题
  • 分治-归并排序-逆序对问题
  • 【VUE】RuoYi-Vue3项目结构的分析
  • MessageQueue --- RabbitMQ WorkQueue
  • C++ 排序(1)
  • 我的购物车设计思考:从个人项目到生产实战思考的蜕变
  • 【2016】【论文笔记】差频可调谐THz技术——
  • 基于编程的运输设备管理系统设计(vue+springboot+ssm+mysql8.x)
  • 九、重学C++—类和函数
  • Python解决“组成字符串ku的最大次数”问题
  • Three.js 系列专题 1:入门与基础
  • 多周期多场景的供应链优化问题 python 代码
  • Java的Selenium元素定位-xpath
  • 【深度学习】通过colab将本地的数据集上传到drive