时间序列分析之ARIMA预测

news2024/9/27 17:26:03

预备知识
时间序列分析原理
时间序列分析之auto_arima自动调参

一、定义

ARIMA模型(Autoregressive Integrated Moving Average model),差分整合移动平均自回归模型,又称整合移动平均自回归模型,时间序列预测分析方法之一。
A R I M A ( p , d , q ) = { A R ( p ) , p阶自回归 M A ( q ) , q阶滑动平均 d , 平稳时的差分阶数 ARIMA(p,d,q) = \begin{cases} AR(p), & \text{p阶自回归} \\ MA(q), & \text{q阶滑动平均} \\ d,& \text{平稳时的差分阶数} \\ \end{cases} ARIMA(p,d,q)= AR(p),MA(q),d,p阶自回归q阶滑动平均平稳时的差分阶数

ARIMA(p,d,q)中,
AR是"自回归",p为自回归项数;
MA为"滑动平均",q为滑动平均项数,d为使之成为平稳序列所做的差分次数(阶数)。

"差分"一词虽未出现在ARIMA的英文名称中,却是关键步骤。

1.1 AR模型(自回归)

描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测,数学模型表达式如下:
y t = μ + ∑ i = 1 p r t y t − 1 + ϵ t y_t = \mu + \sum\limits_{i=1}^{p}r_t y_{t-1} + \epsilon_t yt=μ+i=1prtyt1+ϵt

其中是 y t y_t yt当前值, μ \mu μ是常数项,p是阶数,r是自相关系数, ​​​​​ ϵ t ​​​​​ϵ_t ​​​​​ϵt是误差,同时 ϵ t ϵ_t ϵt要符合正态分布
该模型反映了在t时刻的目标值值与前t-1~p个目标值之前存在着一个线性关系

自回归模型的限制:
自回归模型是用自身的数据来进行预测
必须具有平稳性
必须具有自相关性,如果自相关系数( φ i φ_i φi)小于0.5,则不宜采用
自回归只适用于预测与自身前期相关的现象

1.2 MA模型(移动平均)

移动平均模型关注的是自回归模型中的误差项的累加,数学模型表达式如下:
y t = μ + ϵ t + ∑ i = 1 q θ i ϵ t − i y_t = \mu + \epsilon_t + \sum\limits_{i=1}^{q}\theta_i \epsilon_{t-i} yt=μ+ϵt+i=1qθiϵti

该模型反映了在t时刻的目标值值与前t-1~p个误差值之前存在着一个线性关系

移动平均法能有效地消除预测中的随机波动

1.3 ARMA模型(自回归移动平均)

ARIMA(p,d,q)模型全称为差分自回归移动平均模型(Autoregressive Integrated Moving Average Model,简记ARIMA)

该模型描述的是自回归与移动平均的结合,具体数学模型如下:
y t = μ + ∑ i = 1 p r t y t − 1 + ϵ t + ∑ i = 1 q θ i ϵ t − i y_t = \mu + \sum\limits_{i=1}^{p}r_t y_{t-1} + \epsilon_t + \sum\limits_{i=1}^{q}\theta_i \epsilon_{t-i} yt=μ+i=1prtyt1+ϵt+i=1qθiϵti

基本原理:将数据通过差分转化为平稳数据,再将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。

1.4 自相关函数ACF(autocorrelation function)

有序的随机变量序列与其自身相比较

自相关函数反映了同一序列在不同时序的取值之间的相关性

A C F ( k ) = ∑ t = k + 1 n ( Z t − Z ‾ ) ( Z t − k − Z ‾ ) ∑ t = 1 n ( Z t − Z ‾ ) 2 ACF(k) = \sum\limits_{t=k+1}^n \frac{(Z_t-\overline Z)(Z_{t-k}-\overline Z)}{\sum\limits_{t=1}^n(Z_t-\overline Z)^2} ACF(k)=t=k+1nt=1n(ZtZ)2(ZtZ)(ZtkZ)
取值范围为[-1,1]

自相关系数度量的是同一事件在两个不同时期之间的相关程度,形象的讲就是度量自己过
去的行为对自己现在的影响。在这里可以通过自相关系数(ACF)图的最大滞后点来大致判断q 值。

1.5 偏自相关系数(PACF)(partial autocorrelation function)

P A C F ( k ) = E ( Z t − E Z t ) ( Z t − k − E Z t − k ) E ( Z t − E Z t ) 2 E ( Z t − k − E Z t − k ) 2 = c o v [ ( Z t − Z ‾ t ) ( Z t − k − Z ‾ t − k ) ] v a r ( Z t − Z ‾ t ) E ( Z t − k − Z ‾ t − k ) PACF(k) = \frac{E(Z_t - E Z_t)(Z_{t-k} - E Z_{t-k})}{\sqrt {E(Z_t - E Z_t)^2\sqrt{E(Z_{t-k} - E Z_{t-k})^2}}} = \frac{cov[(Z_t - \overline Z_t)(Z_{t-k} - \overline Z_{t-k})]}{\sqrt {var(Z_t - \overline Z_t)\sqrt{E(Z_{t-k} - \overline Z_{t-k})}}} PACF(k)=E(ZtEZt)2E(ZtkEZtk)2 E(ZtEZt)(ZtkEZtk)=var(ZtZt)E(ZtkZtk) cov[(ZtZt)(ZtkZtk)]

计算某一个要素对另一个要素的影响或相关程度时,把其他要素的影响视为常数,即暂不考虑其他要素的影响,而单独研究那两个要素之间的相互关系的密切程度时,称为偏相关

对于一个平稳AR§模型,求出滞后k自相关系数p(k)时实际上得到并不是x(t)与x(t-k)之间单纯的相关关系x(t)同时还会受到中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的影响,而这k-1个随机变量又都和x(t-k)具有相关关系,所以自相关系数p(k)里实际掺杂了其他变量对x(t)与x(t-k)的影响,剔除了中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的干扰之后x(t-k)对x(t)影响的相关程度。ACF还包含了其他变量的影响而偏自相关系数
PACF是严格这两个变量之间的相关性

1.6 拖尾与截尾

拖尾:始终有非零取值,不会在k大于某个常数后就恒等于零(或在0附近随机波动)
截尾:在大于某个常数k后快速趋于0为k阶截尾

拖尾与截尾

1.7 定阶

模型ACFPACF
AR§衰减趋于0(几何型或振荡型)p阶后截尾
MA (q)q阶后截尾衰减趋于0(几何型或振荡型)
ARMA(p,q)q阶后衰减趋于0(几何型或振荡型)p阶后衰减趋于0(几何型或振荡型)

截尾:落在置信区间内(95%的点都符合该规则)

因为AR(自回归)建立必须具有平稳性,所以在建立ARIMA模型也需要平稳性,使数据平稳性的方法可以讲数据进行差分处理,如一阶差分即t与t-1的差值,二阶差分为一阶差分基础上再进行一次差分,使数据平稳后的差分次数即为我们要定的参数d。

若PACFp阶段后截尾,则截尾的阶数即为模型所确定的参数p。
若ACFq阶段后截尾,则截尾的阶数即为模型所确定的参数q。

1.8 建模流程

将序列平稳(差分法确定d)

p和q阶数确定:ACF与PACF

ARIMA(p,d,q)
在这里插入图片描述

二、Python建模

2.1 导入相关的包

%matplotlib inline
import pandas as pd
import pandas_datareader
import datetime
import matplotlib.pylab as plt
import seaborn as sns
from matplotlib.pylab import style
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller
import numpy as np
style.use('ggplot')    
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False  

import statsmodels
statsmodels.__version__
#'0.13.5'

import warnings
warnings.filterwarnings("ignore")

2.2 导入数据

我们使用一个股票的样例数据进行分析

stock = pd.read_csv('T10yr.csv', index_col=0, parse_dates=[0])
stock
DateOpenHighLowCloseVolumeAdj Close
2000-01-036.4986.6036.4986.54806.548
2000-01-046.5306.5486.4856.48506.485
2000-01-056.5216.5996.5086.59906.599
2000-01-066.5586.5856.5406.54906.549
2000-01-076.5456.5956.5046.50406.504
2016-07-251.5841.5841.5541.57101.571
2016-07-261.5591.5871.5491.56301.563
2016-07-271.5701.5701.5111.51501.515
2016-07-281.5251.5351.4931.51101.511
2016-07-291.5251.5301.4581.45801.458

4167 rows × 6 columns

#数据选取
stock_week = stock['Close'].resample('W-MON').mean()
stock_train = stock_week['2000':'2015']

Date
2000-01-03    6.54800
2000-01-10    6.53900
2000-01-17    6.66300
2000-01-24    6.73720
2000-01-31    6.67280
               ...   
2015-11-30    2.22950
2015-12-07    2.23260
2015-12-14    2.20980
2015-12-21    2.23780
2015-12-28    2.24275
Freq: W-MON, Name: Close, Length: 835, dtype: float64

2.3 数据查看

stock_train.plot(figsize=(12,6))
plt.legend(bbox_to_anchor=(1.25, 0.5))
plt.title("Stock Close")
sns.despine()

在这里插入图片描述
从数据走势上我们大概可以看出,是有下降的趋势的,我们用单位根来检验一下,为了方便我们写一个函数直接输出相关的数据和图

def test_stationarity(timeseries):
    
    #滑动均值和方差
    rolmean = timeseries.rolling(1).mean()
    rolstd = timeseries.rolling(1).std()

    #绘制滑动统计量
    plt.figure(figsize=(24, 8))   
    orig = plt.plot(timeseries, color='blue',label='data')
    
    plt.legend(loc='best')
    plt.title('数据展示')
    plt.show(block=False)
    
    #adf检验
    print('Results of Dickey-Fuller Test:')
    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] = value
    print(dfoutput)
test_stationarity(stock_train)

在这里插入图片描述

Results of Dickey-Fuller Test:
Test Statistic -2.196095
p-value 0.207666
#Lags Used 1.000000
Number of Observations Used 833.000000
Critical Value (1%) -3.438225
Critical Value (5%) -2.865016
Critical Value (10%) -2.568621
dtype: float64

P值为0.207666> 0.05,所以数据存在单位根

2.4 差分

根据上面说的,当存在单位根,即数据不平稳时需要进行差分处理。

stock_diff = stock_train.diff()
stock_diff = stock_diff.dropna()
test_stationarity(stock_diff)

直接套用上面定义的函数进行查看
在这里插入图片描述

Results of Dickey-Fuller Test:
Test Statistic -23.506019
p-value 0.000000
#Lags Used 0.000000
Number of Observations Used 833.000000
Critical Value (1%) -3.438225
Critical Value (5%) -2.865016
Critical Value (10%) -2.568621
dtype: float64

p-value=0.000000 ,明显是小于0.05的,所以可以拒绝存在单位根,序列已经平稳

2.5 ACF和PACF

acf = plot_acf(stock_diff, lags=20)
plt.title("ACF")
acf.show()

pacf = plot_pacf(stock_diff, lags=20)
plt.title("PACF")
pacf.show()

在这里插入图片描述
在这里插入图片描述
我们根据ACF和PACF的图大概可以判定p =2 ,q = 2

2.6 自动训练定阶

根据之前auto_arima介绍

from pmdarima import auto_arima

stepwise_fit = auto_arima(stock_train, 
                          start_p = 1, 
                          start_q = 1,
                          max_p = 3, 
                          max_q = 3, 
                          m = 52,
                          start_P = 0, 
                          seasonal = True,
                          d = None, 
                          D = 1, 
                          trace = True,
                          error_action ='ignore',   # we don't want to know if an order does not work
                          suppress_warnings = True,  # we don't want convergence warnings
                          stepwise = True,
                         n_jobs = -1)           # set to stepwise
  
# To print the summary
stepwise_fit.summary()

Best model: ARIMA(2,0,1)(2,1,0)[52] intercept
Total fit time: 2262.306 seconds

2.7 预测

m = 52

#Model Estimation

# Fit the model
arima2 = sm.tsa.SARIMAX(stock_train, order=(2,0,1), seasonal_order=(2,1,0,m))
model_results = arima2.fit()

#残差分析 正态分布 QQ图线性
model_results.plot_diagnostics(figsize=(15, 12));

在这里插入图片描述

pred = model_results.predict(start=0,end=1000)
print (pred)

plt.figure(figsize=(24, 8))   
orig = plt.plot(stock_train, color='blue',label='Original')
predict = plt.plot(pred[m+1:], color='red',label='Predict')
plt.legend(loc='best')
plt.title('Original&Predict')
plt.show(block=False)

在这里插入图片描述

2.8 残差分布

ERROR_RATE=(stock_train-pred[m+1:])/stock_train
plt.figure(figsize=(12,4))   
plt.scatter(ERROR_RATE.index,ERROR_RATE,color='r')
plt.grid(True)
plt.figure(figsize=(12, 4))
plt.hist(ERROR_RATE, bins=20)
plt.grid(True)
plt.show()

在这里插入图片描述

# Load specific evaluation tools
from sklearn.metrics import mean_squared_error
from statsmodels.tools.eval_measures import rmse
  
# Calculate root mean squared error
print(rmse(stock_train, pred[:m]))
  
# Calculate mean squared error
print(mean_squared_error(stock_train, pred[:m]))

1.5157632571102173
2.297538251605375

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言设计与实现 -- Channel

稍微需要注意一点的用法 类型断言 type dog struct {Name stringColor string }func main() {allChan : make(chan any, 10)allChan <- dog{Name: "lxy", Color: "yellow"}// 如果你这么写代码的话&#xff0c;你虽然拿到了一条狗&#xff0c;但是你…

Map遍历方法及效率

在大学的时候记得学过通过迭代器进行Map的遍历&#xff0c;但是从参加工作后&#xff0c;基本都是通过for循环遍历&#xff0c;没用过迭代器&#xff0c;于是去了解了Map的几种遍历方法并通过运行测试各自的速度。 注意&#xff1a;这里只讲通过遍历同时能过获取key和value的遍…

Imaging组件格式转换,Imaging图像转换

Imaging组件格式转换,Imaging图像转换 Imaging是一个.NET组件&#xff0c;它提供了一种加载、编辑和保存图片的简单方法。图像处理允许文件格式转换和图像转换(调整大小、裁剪或旋转以及翻转)。 使用GemBox.Imageing&#xff0c;您将获得一个快速可靠的组件&#xff0c;它易于使…

聊聊帮助别人这件事--爱摸鱼的美工(10)

聊聊帮助别人这件事 曾经我是一个不懂拒绝的人 有时帮助别人是本性的善良 有时内心也感觉是被迫而已 不快乐为什么还要做&#xff1f; 后来&#xff0c;我减少了无用社交 后来&#xff0c;我脸皮厚了学会了拒绝 才发现&#xff0c;恰如其分的帮助 让自己和别人都舒服 才发现&am…

【微服务】Nacos配置管理

文章目录统一配置管理在nacos中添加配置文件从微服务拉取配置配置热更新方式一方式二配置共享配置共享的优先级Nacos集群搭建集群结构图搭建集群统一配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 当微服务部署的实例越来越多&#xff0c;达到数十、…

慎用BeanUtils,性能真的拉跨

1 背景 之前在专栏中讲过“不推荐使用属性拷贝工具”&#xff0c;推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。 不推荐的主要理由是&#xff1a; 有些属性拷贝工具性能有点差 有些属性拷贝工具有“BUG” 使用属性拷贝工具容易存在一些隐患&#…

xxx.nginx转发+OpenResty(nginx升级版)_web服务器+lua

看上图&#xff0c;点开图发现图片空白不是网卡了&#xff0c;是内容有点多&#xff0c;缩小图片&#xff08;放大指定位置&#xff09;后食用。&#x1f601;内容分为三部分&#xff1a;nginx转发OpenResty(nginx升级版)_web服务器lua测试1.nginx转发1.1.搭建nginx 略&#xf…

【B样条曲线:计算系数】

对这篇文章的翻译&#xff0c;仅学习。 B样条曲线&#xff1a;计算系数 尽管de Boor的算法是计算b样条曲线上对应于给定u的点的标准方法&#xff0c;但我们在许多情况下确实需要这些系数(例如&#xff0c;曲线插值和逼近)。我们将举例说明一种简单的方法。 给定一条由n1个控制…

【PyQt】PyQt的缺陷及意外退出的可能原因

1 背景 最近在软件项目中比较深入的用到了 Qt GraphicsView Framework。PyQt 作为 Qt 的非官方Python绑定库&#xff08;Qt的官方Python绑定库是PySide&#xff09;总是出现很多意外崩溃/Bug&#xff0c;并且很难调试和追踪。 2 问题 软件项目中需要自定义 QGraphicsItem &a…

初识Cocos Creator

1.1 Cocos 不同时期与产品刚接触Cocos家族的时候&#xff0c;会有很多个Cocos的版本与分支&#xff0c;比如Cocos2d, Cocos2d-x, Cocos Creator 1.x, Cocos Creator 2.x, Cocos Cretor3D, Cocos Creator 3.x, CocosDashboard, 等我们先把Cocos 的主要产品脉络梳理一遍。对啦&am…

人体reid数据集

mars数据集 参考&#xff1a;https://blog.csdn.net/qq_34132310/article/details/83869605 整个Mars数据的大小大概有6.3G。 bbox_train文件夹中&#xff0c;有625个子文件夹&#xff08;代表着625个行人id&#xff09;&#xff0c;共包含了8298个小段轨迹&#xff08;track…

联合证券|战略新兴产业火了,高增长低估值股曝光

导读&#xff1a;2022年&#xff0c;A股商场值得记载的前史性大事件不断。这一年&#xff0c;A股商场上市公司数量正式打破5000家&#xff0c;战略新兴产业上市公司数量打破2500家&#xff0c;占比初次打破50%大关。这一年&#xff0c;A股商场顶住杂乱的外部环境因素&#xff0…

Pytorch介绍与基本使用

前言Pytorch是torch的python版本&#xff0c;是由Facebook开源的神经网络框架&#xff0c;专门针对 GPU 加速的深度神经网络&#xff08;DNN&#xff09;编程&#xff0c;根据我在网上的了解&#xff0c;相比于Tensorflow&#xff0c;Pytorch简介易用。一、为什么选择Pytorch简…

在VBA里使用range(cells(),cells()) ,一个容易出错的点:需要注意 range() 和cells() 前都指定好sheet名!

1 问题 在VBA里使用range(cells(),cells()) 发现处了下面这个状况 当前sheet就是sh1时&#xff0c;代码正常运行当前sheet不是sh1时&#xff0c;有一行代码报错 arr3 sh1.Range(Cells(4, 3), Cells(16, 8))为什么会这样呢&#xff1f;Sub test1001()Dim sh1 As ObjectSet s…

足球视频AI(二)——球员与球的目标检测

一、基础概念 1.1 识别目标&#xff1a; 1&#xff09;固定机位的视频中球员逐帧识别 2&#xff09;固定机位的视频中球逐帧识别 3&#xff09;位置换算与记录 1.2 实现思路 1&#xff0c;利用OpenCV的相邻帧差异识别移动物体 2&#xff0c;利用YOLO7的机器学习识别对象&…

LNPS递送辅料,DOPE,4004-05-1,二油酰磷脂酰乙醇胺

LNPS递送辅料&#xff0c;DOPE&#xff0c;4004-05-1&#xff0c;二油酰磷脂酰乙醇胺 中文名称 &#xff1a;1,2-二油酰-sn-甘油-3-磷酸乙醇胺 中文别称 &#xff1a;二油酰磷脂酰乙醇胺 英 文 名 &#xff1a;DOPE 英文别称 &#xff1a;1,2-Dioleoyl-sn-glycero-3-phospho…

数据仓库介绍

数据仓库数据仓库的概念数据仓库的主要特征数据仓库的主流开发语言-sql结构化数据sql语句数据仓库的概念 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。 数据仓库的目的是构建面向分析的集…

一、MyBatis-Plus简介

文章目录一、MyBatis-Plus简介1、简介2、特性3、支持数据库4、框架结构5、代码及文档地址【尚硅谷】MyBatisPlus教程-讲师&#xff1a;杨博超 失败&#xff0c;是正因你在距成功一步之遥的时候停住了脚步。 一、MyBatis-Plus简介 1、简介 MyBatis-Plus&#xff08;简称 MP&am…

吴恩达【神经网络和深度学习】Week2——神经网络基础

文章目录1、Logistic Regression as a Neural Network1.1、Binary Classification1.1.1、Introduction1.1.2、Notations1.2、Logistic Regression1.3、Logistic Regression Cost Function1.4、Gradient Descent1.5、Derivatives&#xff08;导数&#xff09;1.6、More derivati…

基于支持向量回归(SVR)和PROSAIL模拟光谱数据的叶面积指数反演

前言本博客利用PROSAIL模型模拟出MODIS的光谱数据和LAI&#xff0c;然后采用支持向量回归&#xff08;SVR&#xff09;方法建立NDVI与LAI 的回归模型&#xff0c;用于LAI的反演。训练和测试数据的拟合效果还是比较好的&#xff0c;这表明SVR在模拟的光谱数据与LAI回归方面的可行…