时间序列分析1:python里用AR自回归模型分析预测时间序列
Autoregression / AR,就是用前期数据来预测后期数据的回归模型,所以叫做自回归模型。
它的逻辑简单,但对时间序列问题能够做出相当准确的预测。<原文链接这里>
文章目录
- 1)自回归函数
- 2)上例子
- 1. 首先取数&画图
- 2. 快速查看数据是否适合AR模型
- 3. 上边是很好的检测方法。但是如果我们想同时查看YtY_tYt和Yt−1Y_{t-1}Yt−1,...,Yt−nY_{t-n}Yt−n的相关性,重复n次就太繁琐了。
- 4. 最后,到此为止我们就知道如何查看时间序列数据的自相关性了。接下来看如何用对它建立模型。
- 附注:
- - 2个随机变量X和Y的pearson线性相关系数定义为:
- - 调参:可看下ARIMA为例的[链接](https://blog.csdn.net/htuhxf/article/details/106560206?spm=1001.2014.3001.5502);
1)自回归函数
y^t=b0+b1yt−1+...+bnyt−n,其中n<ty\hat{}_t = b_0 + b_1y_{t-1} + ... + b_ny_{t-n} , 其中n<ty^t=b0+b1yt−1+...+bnyt−n,其中n<t
只有在数据平稳/弱平稳的基础上,才能进行实现序列分析
正式的说,如果一个时间序列xtx_txt 的一阶矩和二阶矩(即均值和方差)具有时间不变性,则称它为弱平稳的。弱平稳性是很重要的,因为它为预测提供了基础框架。
——《金融数据分析导论:基于R语言》2.1 平稳性
2)上例子
1. 首先取数&画图
import pandas as pd
import matplotlib.pyplot as pltdf = pd.read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-min-temperatures.csv',index_col=0, parse_dates=True)
print(df.head())
df.plot()
plt.show()# 结果如下Temp
Date
1981-01-01 20.7
1981-01-02 17.9
1981-01-03 18.8
1981-01-04 14.6
1981-01-05 15.8
从上图可知温度序列是弱平稳的(weakly stationary);但是肉眼看不精确是不是平稳的,此时ADF Test/ Augmented Dickey-Fuller Test就排上用场了,其原假设H0:存在单位根/UNIT ROOT(即数据不平稳)
from statsmodels.tsa.stattools import adfuller
a = df.Temp
print(adfuller(a, # 下述参数均为默认值maxlag=None, regression='c', autolag='AIC', # 自动在[0, 1,...,maxlag]中间选择最优lag数的方法;store=False, regresults=False))# 结果如下
(-4.444804924611687, # AIC标准下得到的统计值,用于和下边 1%,5%,和10%临界值比较。但更方便的是直接用下边的p值0.00024708263003611164, # AIC标准下的p值,即原假设成立的概率20, # usedlag: AIC标准下adfuller用的lags3629, # nobs: 本次检测用到的【观测值】个数;
{'1%': -3.4321532327220154, # 1%标准下的临界值
'5%': -2.862336767636517,
'10%': -2.56719413172842},
16642.822304301197) # icbest: The maximized information criterion if autolag is not None.
由p值可以看出,原假设成立的概率极低,我们应该拒绝原假设。即数据平稳。
adfuller
函数官方文档备注:
Augmented Dickey-Fuller的原假设是存在单位根,备择假设是不存在单位根。如果p-value大于临界值,那么我们就不能拒绝有一个单位根存在。p-value是通过MacKinnon 1994年的回归曲面近似得到的,但使用的是更新的2010年表。
2. 快速查看数据是否适合AR模型
from pandas.plotting import lag_plot
lag_plot(df) # 默认lag=1
plt.show()
# 结果如图所示:
如上图所示,yt+1y_{t+1}yt+1和yty_tyt明显相关。当然我们能通过计算,得到相关系数是0.77和显著性水平0。
from scipy.stats import pearsonra = df.Temp
b = df.Temp.shift(1)print(pearsonr(a[1:], b[1:]))# 结果如下
(0.7748702165384458, 0.0)
3. 上边是很好的检测方法。但是如果我们想同时查看YtY_tYt和Yt−1Y_{t-1}Yt−1,…,Yt−nY_{t-n}Yt−n的相关性,重复n次就太繁琐了。
下面介绍一个一次性画出n多Lag的自回归系数方法:statsmodels.graphics.tsaplots.plot_acf()
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
fig, axes = plt.subplots(2,1)fig, axes = plt.subplots(2, 1)
plot_acf(df['Temp'], ax=axes[0])
plot_pacf(df['Temp'], ax=axes[1])plt.tight_layout()
plt.show()
4. 最后,到此为止我们就知道如何查看时间序列数据的自相关性了。接下来看如何用对它建立模型。
import pandas as pd
import numpy as np
from statsmodels.tsa.ar_model import AutoReg
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error as MSEdf = pd.read_csv('e:/daily-min-temperatures.csv',index_col=0, parse_dates=True)
"""把模型数据分为train和test,分别用来训练模型和对比模型预测结果"""
x = df.Temp.values
train, test = x[:-20], x[-20:] # test的个数设定为7"""训练模型得到所需参数:AR的滞后项个数p,和自回归函数的各个系数"""
p = 29 # 调参可以参看下文的链接
# 即时间序列模型中常见的p,即AR(p), ARMA(p,q), ARIMA(p,d,q)中的p。
# p的实际含义,此处得到p=29,意味着当天的温度由最近29天的温度来预测。
model_fit = AutoReg(train, lags=p).fit()
params = model_fit.paramshistory = train[-p:]
history = np.hstack(history).tolist() # 唯一的目的就是接下来通过append(test[i])实时更新history
# 也可以用history = [history[i] for i in range(len(history))] ,
# (append函数不适用于np.narray类型的history)predictions = []
for t in range(len(test)):yhat = params[0]for i in range(p):yhat += params[i+1] * history[-1-i] # history滚动提供lagspredictions.append(yhat)history.append(test[t])
print(np.mean((np.array(test) - np.array(predictions))**2)) # 得到mean_squared_error, MSE
plt.plot(test)
plt.plot(predictions, color='r')
plt.show()
附注:
- 2个随机变量X和Y的pearson线性相关系数定义为:
ρx,y=Cov(X,Y)Var(X)Var(Y)=E[(X−μx)(Y−μy)]E(X−μx)2E(Y−μy)2ρ_{x,y} = \frac{Cov(X, Y)}{\sqrt{Var(X)Var(Y)}} = \frac{E[(X-μ_x)(Y-μ_y)]}{\sqrt{E(X-μ_x)^2E(Y-μ_y)^2}}ρx,y=Var(X)Var(Y)Cov(X,Y)=E(X−μx)2E(Y−μy)2E[(X−μx)(Y−μy)]
– 具体到样本:
ρ^x,y=∑t=1T[(xt−xˉ)(yt−yˉ)]∑t=1T(xt−xˉ)2∑t=1T(yt−yˉ)2\hat{ρ}_{x,y} = \frac{\sum_{t=1}^{T} [(x_t -\bar{x})(y_t-\bar{y})]}{\sqrt{\sum_{t=1}^{T} (x_t -\bar{x})^2\sum_{t=1}^{T}(y_t-\bar{y})^2}}ρ^x,y=∑t=1T(xt−xˉ)2∑t=1T(yt−yˉ)2∑t=1T[(xt−xˉ)(yt−yˉ)]
- 调参:可看下ARIMA为例的链接;
时间序列分析1:python里用AR自回归模型分析预测时间序列相关推荐
- 数据分析学习总结笔记15:时间序列分析及Python实现
文章目录 1 引言 2 时间序列的特性 2.1 自相关 2.2 季节性 2.3 平稳性 3 时间序列建模 3.1 移动平均法 3.2 指数平滑法 3.3 双指数平滑法 3.4 三重指数平滑法 3.5 ...
- PYTHON用时变马尔可夫区制转换(MRS)自回归模型分析经济时间序列
原文链接:http://tecdat.cn/?p=22617 本文提供了一个在统计模型中使用马可夫转换模型模型的例子,来复现Kim和Nelson(1999)中提出的一些结果.它应用了Hamilton( ...
- 基于时间序列分析方法的零售业快消品销量预测研究
前言 我国快消品市场空间大.根据数据,2016 年我国包含包装食品.含酒精饮料.软饮料.日化品在内的快消品零售额为 3.2 万亿元,同比增长 5.1%,市场空间庞大.从流通渠道看,快消品的流通渠道总共 ...
- python时间序列分析航空旅人_Python深度学习教程:LSTM时间序列预测小练习—国航乘客数量预测...
Python深度学习教程:LSTM时间序列预测小练习-国航乘客数量预测 参考数据: 数据一共两列,左边是日期,右边是乘客数量 对数据做可视化:import math import numpy as n ...
- arima模型 p q d 确定_时间序列分析第07讲(ARIMA模型,季节时间序列模型,均值的估计)...
3.3 广义 ARMA 模型和 ARIMA 模型介绍 一.广义 ARMA 模型 (1)定义 我们把 ARMA 模型中关于多项式 A(z),B(z) 的最小相位条件去掉(即允许有单位圆内的根),其余定义 ...
- 时间序列分析ARMA模型原理及Python statsmodels实践(上)
目录 1. 时间序列及相关基本概念 1.1. 时间序列分解 1.2. 时间平稳序列 1.3. 自相关与自相关函数(ACF) 1.4. 白噪声及Ljung-Box检验 1.4.1. 白噪声 1.4.2. ...
- python方差分析模型的预测结果中endog表示_python时间序列分析
题记:毕业一年多天天coding,好久没写paper了.在这动荡的日子里,也希望写点东西让自己静一静.恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家分享下.在此也要特别 ...
- python 单位根检验代码_python时间序列分析
什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列,时间序列分析就是通过观察历史数据预测未来的值.在这里需要强调一点的是,时间序列分析并不是关于时间的回归,它主要是研究自身的变化规律的(这里 ...
- python实践——时间序列分析建模理论及代码实现
python进阶教程 机器学习 深度学习 长按二维码关注 进入正文 声明:本文所讲的时间序列分析并不是指pandas的时间序列处理方法,pandas时间序列处理更缺确切地说时间序列的可视化.窗口移动操 ...
最新文章
- mysql 开发模式_搭建mysql主從模式
- linux 磁盘性能监控
- 限制内存用快排原理PHP
- tensor torch 构造_详解Pytorch中的网络构造
- 关于模板函数/模板类编译成DLL
- 电脑技巧:如何彻底关闭电脑右下角闪烁弹窗广告?
- swiper动态加载数据滑动失效,ajax执行后swiper.js的效果消失问题
- 搭建空的maven多模块项目架构并且上传到远程git仓库(超详细 cmd命令版本)
- linux centos7.9图形界面版本下载_适合在任何地方使用的 Linux:15 个小型 Linux 发行版...
- php - 微信 - 缓存access_token类。
- 使用 Keras搭建一个深度卷积神经网络来识别 c验证码
- ZeroC IceGrid介绍及demo构建(使用IceBox)
- python之路 jQuery学习笔记
- 基于Python的开源人脸识别库:离线识别率高达99.38%(转)
- 飞天侠淘宝客源码8.0终结版仿卷皮模板-免费开源
- 优启通如何写入linux启动盘,优启通u盘启动盘制作工具使用教程(附下载)
- 什么是Java api
- Qt安装包下载(Windows平台)
- 密码学的安全性浅析4
- CentOS7双网卡导致无法访问外网
热门文章
- Sentinel限流--流控模式与限流效果
- mysql按升序创建索引_MySQL中如何使用索引
- bootstrap浮窗
- Python numpy列表加负号
- android弧形左右滑动空间,自定义LayoutManager 实现弧形以及滑动放大效果RecyclerView...
- HBuilderX及其插件的安装
- win10多核与linux多核,win10拖后腿,Linux下线程撕裂者处理器性能提升50%
- 欧洲杯这次“真”的来了
- sklearn之KNN算法
- Springboot开发微信小游戏后台-玩家登录流程