首页 > 其他分享 >05 自回归积分滑动平均模型 (ARIMA)

05 自回归积分滑动平均模型 (ARIMA)

时间:2024-08-26 10:56:13浏览次数:14  
标签:plt 05 series 模型 ARIMA 滑动 model best

1、基本介绍

自回归积分滑动平均模型 (ARIMA) 是一种常用的时间序列预测模型,能够处理非平稳的时间序列数据。ARIMA模型的基本思想是通过对时间序列数据进行差分操作,使其变得平稳,然后使用自回归(AR)和移动平均(MA)模型来进行预测

2、ARIMA模型的组成

ARIMA模型由三个主要部分组成

  • 自回归 (AR):模型的自回归部分表示时间序列当前值与其过去值之间的关系。AR部分的参数由滞后项的数量决定,通常记作 p

  • 差分 (I):差分部分用于将非平稳的时间序列数据转化为平稳序列。通过对时间序列数据进行差分处理,消除趋势和季节性。差分的次数由参数 d 确定。

  • 移动平均 (MA):模型的移动平均部分表示时间序列当前值与过去误差项的关系。MA部分的参数由误差项的滞后数量决定,通常记作 q

 3、ARIMA模型的数学表示

ARIMA模型的数学公式表示为:

(1 - φ1B - φ2B^2 - ... - φpB^p)(1 - B)^d Y_t = (1 + θ1B + θ2B^2 + ... + θqB^q) ε_t
其中:

Y_t 是时间序列数据

B 是滞后算子(即 B Y_t = Y_{t-1})

φ_i 是自回归部分的参数(AR部分)

θ_i 是移动平均部分的参数(MA部分)

ε_t 是白噪声误差项

p 是自回归项的阶数

d 是差分次数

q 是移动平均项的阶数

4、模型建模步骤

  • 数据预处理:收集和清洗时间序列数据,检查缺失值和异常值。

  • 平稳性检查:使用图形方法和单位根检验对数据进行平稳性检查。

  • 模型识别:使用ACF和PACF图来确定AR和MA部分的阶数。

  • 模型估计:使用统计软件估计ARIMA模型的参数。

  • 模型验证:检查残差是否符合白噪声假设,并调整模型以提高拟合优度。

  • 模型预测:应用模型进行未来值的预测,并评估预测性能。

 5、ARIMA模型的应用与优缺点

应用示例

ARIMA模型可以用于各种时间序列数据的预测和分析,包括:

  • 财务市场的股票价格预测
  • 经济指标如GDP和失业率的分析
  • 气象数据如温度和降水量的预测
  • 销售数据的需求预测

优点

  • ARIMA模型能够处理具有趋势的时间序列数据。
  • 模型可以通过差分处理处理非平稳序列。
  • 适用于短期预测。

缺点

  • 对于具有复杂季节性模式的时间序列,ARIMA模型可能不够灵活。
  • 模型的参数选择可能需要较多的试验和错误。
  • 对于长周期预测,ARIMA模型可能不如一些更复杂的模型(如深度学习模型)有效。

6、ARIMA代码详解 

import pandas as pd
import numpy as np
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
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题

# 生成示例数据
np.random.seed(42)  # 设置随机种子以确保结果可重复
n = 100  # 数据点数量
data = np.random.randn(n).cumsum()  # 生成随机数据的累计和作为时间序列数据

# 创建时间序列数据
date_range = pd.date_range(start='2022-01-01', periods=n, freq='D')  # 生成日期范围
time_series = pd.Series(data, index=date_range)  # 创建时间序列

# 绘制时间序列图
plt.figure(figsize=(10, 4))
plt.plot(time_series)
plt.title('时间序列图')
plt.xlabel('日期')
plt.ylabel('值')
plt.show()

# ADF检验,确定差分次数d
result = adfuller(time_series)
print('ADF Statistic:', result[0])
print('p-value:', result[1])
print('Critical Values:', result[4])

# 如果p-value大于0.05,序列可能是非平稳的,需要差分
d = 0
if result[1] > 0.05:
    d = 1  # 默认值,根据实际需要可能需要进一步差分

# 对序列进行差分
diff_series = time_series.diff().dropna()

# 再次进行ADF检验
result_diff = adfuller(diff_series)
print('差分后 ADF Statistic:', result_diff[0])
print('差分后 p-value:', result_diff[1])
print('差分后 Critical Values:', result_diff[4])

# 绘制自相关图和偏自相关图
plt.figure(figsize=(12, 6))
plt.subplot(121)
plot_acf(diff_series, lags=20, ax=plt.gca())
plt.title('自相关图 (ACF)')
plt.subplot(122)
plot_pacf(diff_series, lags=20, ax=plt.gca())
plt.title('偏自相关图 (PACF)')
plt.show()

# 确定p和q的值
p = 1  # 根据ACF和PACF图进行调整
q = 1  # 根据ACF和PACF图进行调整

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

# 输出模型总结
print(model_fit.summary())

# 计算AIC和BIC,尝试不同的(p, d, q)组合
best_aic = np.inf
best_bic = np.inf
best_order = None

# 尝试不同的参数组合
for p in range(0, 3):
    for d in range(0, 2):
        for q in range(0, 3):
            try:
                model = ARIMA(time_series, order=(p, d, q))
                model_fit = model.fit()
                aic = model_fit.aic
                bic = model_fit.bic
                if aic < best_aic:
                    best_aic = aic
                    best_bic = bic
                    best_order = (p, d, q)
            except:
                continue

print(f'最佳模型参数 (p, d, q): {best_order}')
print(f'最佳 AIC: {best_aic}')
print(f'最佳 BIC: {best_bic}')

# 使用最佳模型进行预测
best_p, best_d, best_q = best_order
best_model = ARIMA(time_series, order=(best_p, best_d, best_q))
best_model_fit = best_model.fit()

# 进行预测
forecast_steps = 2  # 预测未来10个时间点的数据
forecast = best_model_fit.forecast(steps=forecast_steps)  # 获取预测值
forecast_index = pd.date_range(start=time_series.index[-1] + pd.Timedelta(days=1), periods=forecast_steps, freq='D')  # 生成预测日期

# 将预测结果转化为Series对象
forecast_series = pd.Series(forecast, index=forecast_index)

# 绘制预测结果
plt.figure(figsize=(10, 4))
plt.plot(time_series, label='历史数据')
plt.plot(forecast_series, label='预测数据', color='red')
plt.title('ARIMA模型预测')
plt.xlabel('日期')
plt.ylabel('值')
plt.legend()
plt.show()

标签:plt,05,series,模型,ARIMA,滑动,model,best
From: https://blog.csdn.net/weixin_53731307/article/details/141556008

相关文章

  • 前端宝典二十:高频算法之双指针、滑动窗口、二叉树
    一、前言学好算法的根基是:刷题!刷题!刷题!本文将深入探讨高频算法中的双指针、滑动窗口以及二叉树。题目均来源于https://leetcode.cn/。重点关注每种题目的解题思路和总结,通过详尽的解答,包括解答思路和每一步的代码实现,以帮助读者快速理解并掌握这些算法。二、双指针双指......
  • 【python】时间序列模型(ARIMA)
    文章目录前言一、示例二、代码实现----python全部数据的平稳性检验划分训练集平稳性检验确定p,q结果分析和模型检验模型预测前言接上一篇博客,用python完成代码编写。一、示例已知一个上市公司一段时期的开盘价,最高价,最低价,收盘价等信息,要求建立模型,预测股价。这......
  • SP10502 VIDEO - Video game combos 题解
    题目传送门前置知识AC自动机解法多模式串匹配考虑AC自动机。令\(f_{i,j}\)表示前\(i\)个字符,当前运行到AC自动机的状态\(j\)时的最大得分。状态转移方程为\(f_{i,k}=\max\limits_{k\inSon(j)}\{f_{i-1,j}+sum_{k}\}\),其中\(sum_{k}\)表示fail树上以\(k......
  • 秋招突击——8/22——算法整理——滑动窗口类型题目思维方式——查找最短包含子串、找
    文章目录引言正文基本思路查找最短包含子串考试实现代码考试反思代码===》先确定一边的指针,然后再移动另外一个指针修改找到字符串中所有字母异位词复习实现参考实现无重复最长子串个人实现总结引言今天面试字节,被老师指出来代码能力薄弱,确实如此。后续应当多加......
  • 开发指南056-定时任务
    业务场景中定时任务很常见。平台实现定时任务的原则如下:1、定时任务的定义在业务库(没必要集中到核心库,另外定时任务的服务要访问业务库)。2、定时任务的服务为独立微服务。平台的定时任务基于:    <dependency>      <groupId>org.quartz-scheduler</gr......
  • 057、Vue3+TypeScript基础,页面通讯之父页面使用$refs修改子页面暴露的成员
    01、main.js代码如下://引入createApp用于创建Vue实例import{createApp}from'vue'//引入App.vue根组件importAppfrom'./App.vue'//引入emitter用于全局事件总线//importemitterfrom'@/utils/emitter'constapp=createApp(App);//App.vue的根元素id为......
  • 056、Vue3+TypeScript基础,页面通讯之$attrs父类子类孙类互传数据和事件
    01、main.js代码如下://引入createApp用于创建Vue实例import{createApp}from'vue'//引入App.vue根组件importAppfrom'./App.vue'//引入emitter用于全局事件总线//importemitterfrom'@/utils/emitter'constapp=createApp(App);//App.vue的根元素id为......
  • 053、Vue3+TypeScript基础,页面通讯之$attrs的使用
    01、main.js代码如下://引入createApp用于创建Vue实例import{createApp}from'vue'//引入App.vue根组件importAppfrom'./App.vue'//引入emitter用于全局事件总线//importemitterfrom'@/utils/emitter'constapp=createApp(App);//App.vue的根元素id为......
  • 通过队列通信实现红外遥控、旋转编码器和MPU6050数据处理的打砖块游戏开发
     声明:项目源码参考韦东山老师百问网嵌入式专家-韦东山嵌入式专注于嵌入式课程及硬件研发(100ask.net)        在本项目中,打砖块游戏的核心逻辑在一个单独的任务中实现,同时系统还需要处理来自红外遥控、旋转编码器和MPU6050传感器的数据输入。为此,使用FreeRTOS的队列......
  • 洛谷P1605 迷宫
    原题题目描述给定一个方格的迷宫,迷宫里有处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。输入格式第一行为三个正整数,分......