CNN做时间序列预测_预测(一):时间序列分析

一、统计术语

时间序列法是一种统计分析方法,根据时间的数据序列预测未来发展趋势。

时间序列分为平稳序列和非平稳序列两大类。平稳序列是不存在趋势只存在随机性的序列,非平稳序列则是包含趋势、季节性和随机性的序列。

1、趋势:时间序列在长时间内呈现出来的长期上升或下降的变动;

2、季节性:时间序列在一年内出现的周期性波动,比如说航空业的销售淡季和销售旺季;

3、随机性:时间序列的偶然性波动。

时间序列预测的步骤是:

7dd176c92759f2c79985c6307ed4c844.png

二、平稳性检验

(一)图示法

平稳性指的是期望不变,方差恒定,协方差不随时间改变。给定这些假设前提的目的是便于后续技术上的处理。

根据时序图粗略来判断序列是否平稳,平稳时序图的特征为围绕均值不断波动,而非平稳时序图表现为在不同时间段具有不同的均值。(图a为平稳时序图,图b为非平稳时序图)

CNN做时间序列预测_预测(一):时间序列分析_第1张图片

(二)单位根检验

1、DF检验

是非平稳的,其中
为白噪声(即零均值,常方差的稳定随机序列),该序列可看成是
的参数
的序列,则当
时,则称
存有一个单位根,即有单位根的时间序列就是随机游走序列,为非平稳的。对
可进行差分处理:

(原假设

:序存在单位根 ,即参数

检验时间序列的平稳性,一般可通过检验带有截距项的一阶自回归模型:

对上式可通过进行普通最小二乘法的t检验完成(t检验的原假设:

。即若P值<0.05,则拒绝原假设,证明
不为0,序列平稳)。

2、ADF检验

因DF检验假设

为白噪声,序列为一阶自回归的模型,但实际上随机干扰项并非为白噪声序列,且序列并非为一阶自回归生成,因此用普通最小二乘法进行估计的t统计量会受到无关参数的影响,导致DF检验无效。

如果时间序列包含有明显的随时间变化的某种趋势,DF检验必须保证能够剔除这种趋势,否则时间趋势的成分会进入

,导致
非白噪声序列,进而偏离了最初的假设。

因此形成了ADF检验。

ADF检验是由下面3个模型完成:

(1)


(2)

(3)

注释:其中t为时间变量,代表序列随时间变化的趋势。

模型的检验原理同DF检验,即t检验;检验顺序为(3)、(2)、(1);三个模型全部检验通过,才能证明该序列是平稳时间序列。

三、建立平稳性时间序列

当序列不平稳时,对序列进行差分或者取对数处理。对时序数据进行差分处理,R语言的“diff”函数可确定(P值<0.05,则拒绝原假设,序列不存在单位根,经1阶差分后,序列平稳):

四、ARMA与ARIMA模型

ARMA(自回归滑动平均模型)模型是针对平稳时间序列建立的模型。

ARIMA (p,d,q)模型(差分整合移动平均自回归模型)是针对非平稳时间序列建模, 其中AR是“自回归”,p为自回归项数;MA为“滑动平均”,q为滑动平均项数,d为使之成为平稳序列所做的差分次数。 ARIMA模型是在ARMA模型的基础上多了差分项。

对于p,d,q的选择有两种方法:

方法一:是通过ACF与PACF图来确定。其中通过观察PACF在lag=p时截尾,即PACF图中的值落入宽带区域中来确定p,通过观察ACF会在lag=q时截尾,即PACF图中的值落入宽带区域中来确定q,d为将非平稳序列处理成平稳序列所需要的差分阶数。比较模型间的AIC
值的大小,选AIC值小的模型为最佳模型。(赤道信息准则AIC:AIC=2k-ln(L),其中k为模型参数个数 ,L为似然函数。一般在可供选择的模型中,通常选择AIC最小的模型。)

如下图p为3,q为3

CNN做时间序列预测_预测(一):时间序列分析_第2张图片

方法二:对时序数据的模型选择,R语言中“auto.arima”函数可自动筛选出p,d,q。

五、模型预测及检验

(一)预测

在不断尝试确定ARIMA (p,d,q)的p,d,q后,选择最佳的模型进行预测。观察测试集的数据是否落在置信区间内。

(二)残差检验

模型的检验通过该模型的残差分布来确定,合适模型的残差应满足均值为零的正态分布。可通过绘制正态分布的QQ来检验:图像近似为过原点的一条直线,则残差服从正态分布且均值为零。该步骤可通过R语言的“qqnormt”函数实现。

CNN做时间序列预测_预测(一):时间序列分析_第3张图片

模型的检验通过该模型的残差分布来确定,合适模型的残差不仅应满足均值为零的正态分布,而且任何滞后阶数的残差相关系数都为零。该步骤可通过R语言的“Box.test”函数实现。

原假设

:任何滞后阶数的残差都不相关

任何滞后阶数的残差都不相关

若P>0.05,接受原假设,即任何滞后阶数的残差都不相关。

详细代码如下:

#####读取数据
mydata<-read.csv("数据所在的位置",header=T)
####训练集
mydata1<-transportation[-c(280:286),]
####验证集
mydata2<-transportation[c(280:286),]
####日期处理
tmydata1<-ts(mydata1[,2],start=as.Date("2018-07-01"),frequency=1)
s <- as.Date("2018-07-01")
dates<-seq(from=s, by=1, length.out=279)
t<-data.frame(dates,tmydata1)
head(t)
####绘制时序图
plot(t,ylab='每天的销售量',xlab='日期',main='20180701-20190331销售量时序图',type="b")
####判断序列是否平稳
library(tseries)
library(forecast)
tsdisplay(t)
adf.test(t[,2])
####数据不平稳进行一阶差分
difft<-diff(t[,2],d=1)
plot(difft,type = 'o');abline(h = 0)
library(tseries)
library(forecast)
tsdisplay(difft)
adf.test(difft)
####模型选择
auto.arima(difft)
####预测
fit<-arima(difft,order=c(4,0,0))
f.p2<-forecast(fit,h=30)
f.p2
plot(f.p2)
lines(f.p2$fitted,col="green")
####模型检验
qqnorm(fit$residuals)
qqline(fit$residuals)
###验证任何滞后阶数的残差相关系数都为零 
Box.test(fit$residuals,type='Ljung-Box')

欢迎关注微信公众号,一起学习~

CNN做时间序列预测_预测(一):时间序列分析_第4张图片

你可能感兴趣的:(CNN做时间序列预测)