在深度学习中,有很多模型可以做,比如RNN,LSTM等等有时间序列特征的模型。但是它们所需的训练数据比较大,比如之前在Matorcup大数据比赛的A题我使用了LSTM预测,训练数据有9个G。对于比较小的样本集,使用传统方法进行预测效果较好。
关注点:趋势、季节变化、序列相关性(自相关性):随机噪声
时间序列分析的核心就是挖掘该时间序列中的自相关性
平稳性:经由样本时间序列得到的拟合曲线,未来一段时间内仍能顺着现有形态的“惯性”延续下去
平稳性要求序列的均值和方差不发生明显变化
(1)一个随机时间序列可以通过一个自回归移动平均模型来表示,即该序列可以由其自身的过去或滞后值以及随机扰动项来解释。
(2)如果该序列是平稳的,即它的行为并不会随着时间的推移而变化,那么我们就可以通过该序列过去的行为来预测未来。
**严平稳:**分布不随时间的改变而改变
期望始终为0,方差为1
**宽平稳:**期望与相关系数(依赖性)不变
未来某时刻的t值Xt就要依赖于它的过去信息,所以需要依赖性。
序列的统计特性不随时间的平移而变化,即均值和协方差不随时间的平移而变化
建模比赛中一般要求宽平稳
当序列不平稳时:使用差分法
AR(自回归模型)
- 描述当前值与历史值之间关系,用变量自身的历史数据对自身进行预测
- 必须满足平稳性的要求
- 必须具有自相关性,如果自相关系数小于0.5,不宜采用
- n阶自回归公式:
Y是预测对象的观测值,Z为误差。作为预测对象Yt受到自身变化的影响
MA(移动平均模型)
- 关注自回归模型中的误差项的累加
- 能有效消除预测中的随机波动
- q阶滑动平均
序列当前时刻的时序值是过去q阶白噪声的线性组合
ARMA(自回归移动平均模型)
- 自回归与移动平均的结合
- 任何一个 ARMA 模型都是一个线性差分方程
称时间序列Yt为服从(p,q)阶自回归滑动平均混合模型
ARIMA(差分整合移动平均自回归模型)
- ARIMA(p,d,q)中,AR是“自回归”,p为自回归项数;MA为滑动平均,q为滑动平均项数,d为使之成为平稳序列所做差分次数(阶数)。
原理:将非平稳时间序列转化为平稳时间序列,仅对因变量的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型
自相关函数ACF
自回归有序的随机变量序列与其自身相比较,自相关函数反映了同一序列在不同时序的取值之间的相关性
其中k代表滞后期数,如果k=2,则代表yt和yt-2
偏自相关函数PACF
偏自相关函数PACF描述的是在给定中间观测值的条件下,时间序列观测值预期过去的观测值之间的线性相关性。
ACF 与 PACF 的差异
- ACF衡量了Xt与Xt-k之间的关系,但相关系数掺杂了其他变量对Xt 与Xt-k的影响。
- 计算某一个要素对另一个要素的影响或相关程度时,把其他要素的影响视为常数,即暂不考虑其他要素的影响,而单独研究那两个要素之间的相互关系的密切程度时,称为偏相关。即为单纯测量Xt与Xt-k的关系,引进了PACF的概念。
拖尾和截尾
拖尾指序列以指数率单调递减或震荡衰减,而截尾指序列从某个时点变得非常小:
模式识别(根据ACF和PACF选择模型)
平稳性检验
-
(1)什么是平稳序列?
如果时间序列在某一常数附件波动且波动范围有限,即具有常数均值和常数方差,并且延迟k期的序列变量的自协方差和自相关系数是相等的,则称该序列为平稳序列。 -
(2)检验平稳性
方法一:图检验
时序图检验:在某一常数附近波动且波动范围有限。
自相关图检验:平稳序列具有短期相关性,但随着延迟期数k的增加,自相关系数会快速衰减趋向于零。
方法二:单位根检验
不存在单位根即是平稳序列。
白噪声检验(纯随机性检验)
- (1)用途
建模之前,检验数据是否满足白噪声检验,非白噪声才能进一步建模。
建模后,检验残差是否满足白噪声检验,通过检验,建模才成立。 - (2)什么是纯随机序列
如果一个序列是纯随机序列,那么序列值之间没有任何关系,则自相关系数为零(理论)或接近于零 (实际)。 - (3)检验纯随机性
方法一:图检验
自相关图检验:自相关系数为零或接近于零
QQ图检验:大部分点在直线上,则数据符合正态分布
方法二:DW检验或LB统计量检验
餐厅销量预测
框架
一、导入数据
二、原始序列的检验
三、一阶差分序列的检验
四、定阶(参数调优)
五、建模与预测
导入数据
读取xls文件使用的函数:xlsread
%% 1.导入数据
close all
clear all
%load Data_EquityIdx
len = 1200;%预测步长
data=xlsread('arima_data.xls');
plot(data)
平稳性检验
adftest函数:1:平稳,0:不平稳
kpsstest函数:0:平稳,1:不平稳
%% 2.平稳性检验
% 原数据
y_h_adf = adftest(data)
y_h_kpss = kpsstest(data)
% 一阶差分,结果平稳。如果依旧不平稳的话,再次求差分,直至通过检验
Yd1 = diff(data);
yd1_h_adf = adftest(Yd1)
yd1_h_kpss = kpsstest(Yd1)
Y = diff(data);
结果:
y_h_adf =
logical
0
y_h_kpss =
logical
1
做完一阶差分后的平稳性检验
yd1_h_adf =
logical
1
yd1_h_kpss =
logical
0
所以阶数为1阶,所以 ARIMA(p,d,q)中的d = 1
此案例省略白噪声检验,显然销量与时间有关系。
模型定阶
模型阶数的确定方法主要包括两种:(1)ACF和PACF法。(2)基于准则的确定法
- (1)ACF和PACF法
所谓ACF即自相关函数,PACF为偏自相关函数。
% ACF和PACF法,确定阶数
figure
autocorr(Y)
figure
parcorr(Y)
可以看出自相关截尾,偏自相关拖尾
人工识图判断阶数:观察几阶过后落入置信区间
AR阶数可以取1阶或者二阶,MA阶数可以取0阶
那么ARIMA(p,d,q) = ARIMA(0,1,1)
对于我们关注的ARMA(p,q),通俗地说,PACF最后一个在蓝线外(即阈值外)的Lag值就是p值;ACF最后一个在蓝线外(即阈值外)的Lag值就是q值。
- (2)基于准则的确定法
如果方法(1)不理想,可以用方法(2),这个方法不用纠结,可以直接给出推荐结果。
首先需要确定AR和MA阶数的上限,然后调用函数
[AR阶数,MA阶数] = ARMA_Order_Select(序列,最大AR阶数,最大MA阶数,差分阶数)
% 通过AIC,BIC等准则暴力选定阶数
max_ar = 2; %最大不超过样本数/10
max_ma = 2;
[AR_Order,MA_Order] = ARMA_Order_Select(Y,max_ar,max_ma,1);
计算结果为0和2
残差检验
为了确保确定的阶数合适,还需要进行残差检验。残差即原始信号减掉模型拟合出的信号后的残余信号。如果残差是随机正态分布的、不自相关的,这说明残差是一段白噪声信号,也就说明有用的信号已经都被提取到ARMA模型中了。
残差(residual)是模型的拟合值(fitted value)与实际观测值之差。
残差应该看起来像白噪声。
关于残差的重要假设:
1.残差无自相关性:自相关图应该是截尾的
2.残差均值为0:直方图关于0对称
此外,对于计算预测置信区间来说需要用到的性质:
1.残差方差恒定
2.残差为正态分布
D-W检验
德宾-沃森检验,简称D-W检验,是目前检验自相关性最常用的方法,但它只适用于检验一阶自相关性。 因为自相关系数ρ的值介于-1和1之间,所以 0≤DW≤4。
DW=O < => ρ=1 存在正自相关性
DW=4 <=> ρ=-1 存在负自相关性
DW=2 <=> ρ=0 不存在(一阶)自相关性
代码:
printf(‘D-W检验的结果为:',sm.stats.durbin_watson(resid.values))
D-W检验的结果为: 1.95
解读:不存在一阶自相关
%% 4.残差检验
Mdl = arima(AR_Order, 1, MA_Order); %第二个变量值为1,即一阶差分
EstMdl = estimate(Mdl,data);
[res,~,logL] = infer(EstMdl,data); %res即残差
stdr = res/sqrt(EstMdl.Variance);
figure('Name','残差检验')
subplot(2,3,1)
plot(stdr)
title('Standardized Residuals')
subplot(2,3,2)
histogram(stdr,10)
title('Standardized Residuals')
subplot(2,3,3)
autocorr(stdr)
subplot(2,3,4)
parcorr(stdr)
subplot(2,3,5)
qqplot(stdr)
% Durbin-Watson 统计是计量经济学分析中最常用的自相关度量
diffRes0 = diff(res);
SSE0 = res'*res;
DW0 = (diffRes0'*diffRes0)/SSE0 % Durbin-Watson statistic,该值接近2,则可以认为序列不存在一阶相关性。
DW0 =
1.9592
Standardized Residuals是查看残差是否接近正态分布,理想的残差要接近正态分布;
ACF和PACF检验残差的自相关和偏自相关,理想的结果应该在图中不存在超出蓝线的点;
最后一张QQ图是检验残差是否接近正太分布的,理想的结果中蓝点应该靠近红线。
预测
设定步长:step = 5,预测5天
黑线为未来值的预测,红线为95%置信区间上下限。也就是说未来真实值有95%的概率落在这个范围内
%% 5.预测
step = 5;
[forData,YMSE] = forecast(EstMdl,step,'Y0',data); %matlab2019写为[forData,YMSE] = forecast(EstMdl,step,data);
lower = forData - 1.96*sqrt(YMSE); %95置信区间下限
upper = forData + 1.96*sqrt(YMSE); %95置信区间上限
figure()
plot(data,'Color',[.7,.7,.7]);
hold on
h1 = plot(length(data):length(data)+step,[data(end);lower],'r:','LineWidth',2);
plot(length(data):length(data)+step,[data(end);upper],'r:','LineWidth',2)
h2 = plot(length(data):length(data)+step,[data(end);forData],'k','LineWidth',2);
legend([h1 h2],'95% 置信区间','预测值',...
'Location','NorthWest')
title('Forecast')
hold off