Kai’blog

主博客 | 势利纷华,近之而不染者洁,不近者亦洁,君子不立危墙之下。

时间序列算法全解全析【零基础数模笔记系列】

时间序列预测分析算法

一.前言

时间序列预测分析算法利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征,听上去和回归拟合没什么区别,但两者并不一样,至于为什么,一会再说

简单来说,时序预测分析算法专门用于时序数据的预测分析,数据本身可以有一个或多个自变量,但其中至少包含有一个时间指标或者有一个类似于时间的指标,且该指标意义下相邻值的间距是固定且恒定的。

二.基本原理和重要概念

【自相关性】指时间序列不同时间点观察值的相关性,换句话说,若时间序列中过去的自身 的数据对未来的自身的数据有影响,那该时间便具有自相关性,否则便没有。

【平稳性】若一个时序数据的均值和方差不随时间的变化而变化,那便是平稳的时序数据

【季节性】若一个时序数据会重复出现的某个模式,便称其具有季节性

【随机性】所有时序数据都会受到随机性误差的影响,即随机性。

三.分类

时序算法从原理上说分为两大类,基于统计的时序数据建模方法和基于深度学习的建模方法,而基于统计的时序数据建模方法又分为传统方法和机器学习方法。

时序算法从自变量上区分,可以分为自回归预测和使用协变量进行预测,时序算法是必须要有时间或一个类似时间的自变量的,那除此之外,如果没有其他自变量,就是自回归预测,如果还有其他自变量,那就是使用协变量进行预测,这些其他的自变量就被成为协变量。

时序算法从输出结果上区分,可以分为点预测和概率预测,概率预测往往更贴合事实情况,与未来的预测本身就应该是一种概率分布。点预测的输出结果就算重新处理成概率预测,也往往难以准确反映出真实情况。只有直接的概率预测,才能给出一个恰当的预测结果。

时序算法从目标个数上区分,可以分为一元、多元、多重时序预测。一元预测很好理解,因变量只有一个,那便是一元预测。多元和多重的区分网络上语焉不详,我推测如果有多个因变量,且这些因变量并不相关,相当于只需要做多个一元预测即可,那边属于多元时序预测,而如果有多个因变量,这些因变量相关或者有着类似的本质或变化规律,那便是多重时序预测,这可能是最复杂的时序预测了。

从本质思想的角度可以分为频域分析方法和时域分析方法,如果是从频率的角度揭示规律那便是频域分析方法,如果是从序列自相关的角度解释规律那便是时序分析方法。

四,传统的统计学时序数据建模方法

1.季节性预测法(或许也叫周期因子法,说“或许”是因为大部分资料对此语焉不详)

一般而言,对于类似于航空旅客的数量变化的有季节性的时序数据,我们都用季节性预测法进行建模分析,季节性预测法有多种,核心思想是把时序数据的变动看作是(长期)趋势T、季节变动S、循环变动C、不规律变动I四大因素复合而成的。

也即,季节性预测法的目标是给出一个函数f,满足Dt=f(Tt,St,Ct,It);

又由于循环变动的识别较为复杂,应用时常常简化为Dt=f(Tt,St,It);我们这里只讲授简化版的这个模型,毕竟我们又不是真的要用这个模型,只不过是作为学习进阶模型的跳板罢了

按照变动要素是否独立,又分成了加法模型和乘法模型,若三种因素是相互独立的,则有f(Tt,St,It)=Tt+St+It;若三种因素相互关联,则有f(Tt,St,It)=Tt*St*It

其中Tt,St,It本身也是关于t变化的函数

具体求解过程,是先通过可视化分析,分析出季节性变化,然后分析出季节性变化St,从原数据集中剔除掉季节性变化S的影响,即构建去趋势序列,然后进行回归拟合,便得到了趋势项T和随机偏差项I。

如何获得“去季节序列”取决于我们选择了哪种模型,如果选择了加法模型,那么“去季节序列”就是y-St,如果选择了乘法模型,那么去季节序列就是y/St。紧接着,分析出趋势项T后,残差It也就对应着是y-St-Tt或y/(St*Tt)。

那么,如何分析出季节项St呢,其实做法相当朴素,可以通过可视化分析分析出“年数”后,季节数就等于数据数/年数,也可以直接通过可视化分析分析出季节数。然后求出各季节的均值,减去即可,具体操作看代码即可

季节性预测法的最后一步分析出趋势T有多种实现方法,季节性预测法也因此分为多种,没有严格的分类标准再加上大多数人半懂不懂乱用名词导致分类更为混乱,再次我总结出一种相当合理的分类方法,如下:

使用最朴素的求解协方差超定方程获取线性回归方程作为求解趋势T方法的季节性预测法被称为趋势分解法,使用了复杂其他回归拟合方法的季节性预测法被称作季节多元回归模型,使用了ARIMA等算法作为求解趋势T方法的算法被称作季节自回归模型。换句话说,季节性预测法总要搭配其他用于求解T的算法才能实现预测,在这个合作中,季节性预测法所扮演的角色就是简单的去除季节性变化,而不管其他部分,其他部分像是积木一样,封装好了就能嫁接上去,一般来说,季节性预测法总要搭配一个趋势预测法(下文提及)来使用

下面就是通过用求解协方差超定方程获取线性预测来求解趋势的加法模型趋势分解法

```

clc;

%D是某地6年来每年12个月的交通死亡数据

D= ...

[9007,8106,8928,9137,10017,10826,11317,10744,9713,9938,9161,8927; ...

7750,6981,8038,8422,8714,9512,10120,9823,8743,9129,8710,8680; ...

8162,7306,8124,7870,9387,9556,10093,9620,8285,8433,8160,8034; ...

7717,7461,7776,7925,8634,8945,10078,9179,8037,8488,7874,8647; ...

7792,6957,7726,8106,8890,9299,10625,9302,8314,8850,8265,8796; ...

7836,6892,7791,8129,9115,9434,10484,9827,9110,9070,8633,9240] ;

D=D.';%此时列是年,行是月,D有12行6列

subplot(2,2,1);

hold on;

for i=1:6

plot(1:12,D(:,i));

end

aver=mean(D,2);

st=zeros(12,6);

for i=1:12

for j=1:6

st(i,j)=D(i,j)-aver(i);

end

end

subplot(2,2,2);

for i=1:6

plot(1:12,st(:,i));

hold on;

end

nx=zeros(72,1);

for i=1:6

for j=1:12

k=(i-1)*12+j; %k为月份编号

nx(k)=st(j,i);

end

end

x=zeros(72,1);

for i=1:6

for j=1:12

k=(i-1)*12+j; %k为月份编号

x(k)=D(j,i);

end

end

%对消去季节项后数据nx

%进行线性拟合并预测

Y=nx;

A=zeros(72,2);

for i=1:72

A(i,1)=1;

A(i,2)=i;

end

%A分别代表常数项、编号项

coef=inv(A'*A)*A'*Y;%协方差矩阵进行最小二乘预测

py=zeros(1,84);

for i=1:84

py(i)=coef(1)+coef(2)*i;

end

subplot(2,2,3);

plot(1:72,nx,1:72,py(1:72));

xx=zeros(1,84);

for i=1:7

for j=1:12

k=(i-1)*12+j;

xx(k)=py(k)+aver(j); %预测各月数值

end

end

subplot(2,2,4);

plot(1:72,x,'*',1:84,xx);

```

看完了代码,自然能够想到该算法的缺陷之处了,季节性预测法粗暴地把季节本身看做不随时间的变化而变化的超然物外的规律,但对于某些长时间预测而言,季节本身也会随时间的变化而变化,比如二十年前某地用电高峰在冬季,而现在用电高峰出现在了夏季。此时该算法就难以给出准确的预测了。

当然也存在对季节性预测法的改进,不再是那么朴素的去除季节了,但具体做法比较复杂且改进后的算法似乎压根没有名字,大部分资料对此语焉不详,我们过后再来补充改进算法。

2平滑预测法

对于没有季节性的时序数据,一般采用平滑预测法进行建模分析,包含移动平均法指数平滑法等方法,核心思想是通过平均的方法剔除掉时间序列中的随机波动,使得曲线变得更加平滑,再结合趋势预测法进行处理。换句话说,平滑预测法其实和季节预测法类似,都是做前期处理的“半算法”。

季节性预测法去除的是季节性异动,平滑预测法去除的是随机性异动,如果一个时间序列有季节性,那么自然可以先使用季节性预测法去除季节性,然后如果处理后的时间序列仍随机性异动较大,即曲线不平滑,那么就可以再结合平滑预测法使得曲线更加平滑。

移动平均法,即MA(Moving Averages),分为简单移动平均法和加权移动平均法,具体做法顾名思义即可,设时刻t因变量的值是V(t),简单移动平均法就是F(t+1)=(V(1)+···+V(t))/t,当然也可以换成其他的平均数,如几何平均调和平均等等,都属于简单移动平均法。加权移动平均法则是考虑到,在预测下一时刻时,越古老的过去就越不重要,而越近的过去才越重要,因此,就是F(t+1)=w(n-k-1)V(n-k-1)+···+w(n+1)V(n+1),k是移动跨期。

注意到,简单移动平均法其实并没有一个“可滑动的窗口”,因此其实名不副实,更好的称呼应该是“简单平均法”,不过由于太多笨蛋误用名词了,导致我只能选择使用最广泛的版本来称呼这些专有名词,哪怕是被讹变了的版本,不过所有不准确的名词我都会在恰当的时机予以阐明,以减少误解。

因此,如果没有k这种“可滑动的窗口”,那么哪怕是采用了加权平均算法,也得算作“简单平均法”(不过这种算法全面落后于指数平滑法,所以其实也没人用),只有有了移动窗口,才能称作“移动平均法”。不过这都不重要,明白即可,具体如何辨析无关痛痒。

移动平均模型的核心思想是利用白噪声进行预测,具体怎么做这里先不说,等讲完了AR模型后再在ARIMA模型中说,毕竟要用到很多和AR模型共通思想,我认为AR模型更好理解,所以等讲完AR模型再说MA模型

移动平均法舍弃了较古老的数据,而指数平滑法则是兼容了全局数据和近期数据,既考虑到古老数据,又给予近期属于以更大的权重,同时还无需担心加权移动平均法权重难以确定成一个恰当的值的问题。

指数平均法给出F1(t)=αV(t)+(1-α)F1(t-1),α是平滑指数,属于区间[0 1],很明显Alpha越大,近期数据就越重要,反之,α越小则远期数据越重要一般而言,时间序列越稳定,则选择越小的α,时序数据变化的越剧烈,则选择越大的α以跟上数据的变化。

初始值F1(0)该如何确定呢?一般而言,如果能查不到y1以前的历史资料,就令F1(1)=y1,然后往下一直计算到F1(n),n可以是任意值,一般取3即可,然后将F1(0)设为已经算出来的每一项的平均数,即F1(0)=(F1(1)+F1(2)+···+F1(n))/n,然后再从F1(0)开始重新计算整个序列

很明显我们会困惑为什么描述平滑后曲线用的函数的名字是F1而不是F呢?这是因为F1后面的1表示的是函数的阶数,使用F1进行平滑化的方法被称作一次指数平滑法,一次指数平滑法出现直线趋势时会有明显的滞后误差,因此我们引入了二次指数平滑法。规定F2(t)=αF1(t)+(1-α)F2(t-1),也即做两次一次指数平滑

同理,也可以做三次指数平滑、N次指数平滑,不再赘述。

实际使用时,往往是针对不同的α做出多个预测,然后比较哪个预测的偏差最小(一般也是用均方差(即残差的平方的平均数)大小来比较偏差大小),然后选出最合适的α作为答案。

不过,我们同样一般不直接使用这个做法,学习这个知识只是想把它作为我们了解高级算法的垫脚石罢了。

  1. 趋势预测法

对于有趋势但没有季节性的时序数据,常常使用趋势预测法进行建模分析,包括线性趋势预测法、非线性趋势预测法和自回归趋势预测法。

所谓的“线性趋势预测法、非线性趋势预测法”其实就是传统的回归分析法,具体见我们此前的笔记《回归分析专题》,不再赘述,而自回归趋势预测法其实就是自回归模型AR。

我们接下来重点介绍AR(Autoregression)

AR是指利用时序数据在不同时期的取值之间的依存关系(即自相关性)来建立回归方程进行预测的数学模型。

自回归模型AR的核心思想,就是把当下的时序数据本身当做因变量数列,过去若干时段的数据数据当做自变量数列,分析这些因变量数列和另外一个或多个自变量数列之间的关系,建立回归方程进行预测,更通俗的说,就是用过去预测未来。

AR认为,时序数据Xt可有历史数据的加权和随机扰动(白噪声)的叠加来表示,如下:

p决定AR模型向前追溯多久,是AR模型的重要超参数。这样的一个p阶AR模型简称AR(p)模型。

其实此时还应该有一个常数项,即截距项,截距项为0被称为中心化的AR模型,不过由于AR模型尝尝被处理成中心化的,所以有时也略去表达式中的截距项。

白噪声序列的核心特点是毫无自相关性,完全无法被AR模型所预测,也不是AR模型所针对的目标。

一般而言,AR模型的操作流程如下:

  1. 先对序列进行平稳性检验,如果判定序列非平稳,则要进行平稳化处理。
  2. 再对序列进行白噪声检验,若判定序列属于白噪声,则放弃建模,否则继续下一步
  3. 计算估计模型的参数
  4. 检验模型适用性,若检验通过,便展开预测。否则重回第三步,重新调整参数。

若时序数据的均值和方差、自协方差不随时间的变化而变化,则称该时序数据具有严平稳性,如果均值和自协方差不随时间的变化伪变化,方差有所变化,则称该时序数据具有弱平稳性,一般而言满足弱平稳性即可使用AR模型。

平稳性检验,顾名思义就是检验序列是否具有平稳性,一般是通过单位根检验(即ADF-test)来实现的,ADF检验的原假设是序列不平稳,然后计算出ADF统计量和统计量对应的原假设出现的临界概率p,如果p值小于预设的显著性水平(一般是0.05),则拒绝原假设,认为时间序列具备平稳性,否则认为不具备平稳性。

我们不需要知道ADF统计量如何计算,p值和ADF的对应关系表格也不需要查,直接用matlab给出的adftest函数即可,代码如下:

```

[h, pValue, stat, cValue, reg] = adftest(data);

% 输出检验结果

if h == 0

disp('时间序列数据具有单位根,不具备平稳性。');

else

disp('时间序列数据不具有单位根,具备平稳性。');

end

disp(['ADF统计量: ', num2str(stat)]);

disp(['p值: ', num2str(pValue)]);

disp(['临界值: ', num2str(cValue)]);

```

这里输出的临界值指的是用于和ADF统计量直接比较以确定是否通过检验的数,换句话说就是那个显著性水平所对应的统计量值,不难理解吧。

若没通过ADF检验,就需要进行平稳化处理,然后才能继续使用自相关模型。常用方法有:差分、对数变换、季节调整等等,最常用的还是差分,使用了差分的AR(p)模型被称作ARI模型(p,d)

用原始数据的每一个观测值减去前一个观测值便得到了一阶差分序列。二阶差分也不难理解,就是在一阶差分序列的基础上用后一个序列减去前一个即可,更高阶数的差分序列也是同理。使用了d0阶差分后恰好使得序列通过平稳性检验便可继续下一步了,此时d0就是ARI模型的超参数d的值了(切记通过了检验就不要再画蛇添足地差分了,差分次数越少越好,选择恰好能通过的那个次数即可)。

很明显,d阶差分会使得原始序列减少d个数字,但这无伤大雅,不过要注意的是,一定要先确保原始数据已经去除了异常值、填充了缺失值,再进行差分。

在matlab中,直接使用n次diff(data)即可计算n阶差分(不直接使用diff(data,n)是为了收集过程中被舍弃的数),对于d阶差分,我们要在每次差分时舍弃的n个数据在start向量中,以便后续复原序列。比如我们预测完毕后有手头的data向量,还有包含了未来100天预测值的fu向量,只需要把answer=[start(d);data;fu]三个列向量这般连在一起,然后使用cumsum(answer)即可复原一阶,多次操作即可全部复原。

白噪声的核心是无自相关性,因此白噪声检验的核心就是对自相关性进行检验,具体手段则是计算自相关函数ACF(Autocorrelation Function)和偏自相关函数PACF(Partial Autocorrelation Function),白噪声检验既可以确定该问题是否可以用AR模型,又可以初步得到AR模型的p值,当然p值还需要靠FRE准则或者贝叶斯信息准则来进一步的最终确定。

ACF被有些笨蛋称为自相关系数,这是不对的,ACF的自变量是时间,函数值才是自相关系数,ACF本身可不是系数,同理,PACF的函数值是系数,但他本身可不是系数,这点要搞清楚,别被某些没水平的文章弄晕乎了。

ACF的参数是一串时序数据Xt={x1~xn}和滞后阶数k,函数值是x_1~x_(n-k)和x_(1+k)~x_n的皮尔逊相关系数,我们称x_1~x_(n-k)为滞后序列,称x_(1+k)~x_n为原始序列。

但其实这个“原始序列”这也是一个不准确的名词,毕竟x1~xn才是正儿八经的原始序列,x_(1+k)~x_n是去除了前k个值获得的,但没办法,人们就是这么称呼的,总之知道有这么回事不弄蒙自己就成。

ACF图就是把整个已知时序数据作为固定的参数,然后根据不同的k值得到不同的ACF函数值,最后得出的ACF图就是k值关于ACF值的图像,要注意画出一个置信区间,只有在置信区间之外的ACF值才真的代表有相关性,在置信区间之内的则认为是随机误差导致的伪相关性,如下图,蓝色区域就是置信区间。

置信区间在k值较小的地方也较小,这是因为较小的k值对应的函数值代表着两个较长序列的相关系数,自然由于随机偶然因素导致产生较强相关性的可能性就很小了,也就可以不用那么苛刻的置信区间了,哪怕是较低的相关系数也被认为是有意义的。

至于置信区间具体怎么算嘛,是这样的:

ACF图的置信区间是用来判断自相关系数是否显著不为0的。对于任何一个时间序列,它在5%的置信度下的ACF值不显著为0的置信区间是[-1.96/sqrt(T-k),+1.96/sqrt(T-k)],T是样本量,在这个区间内则只有5%的把握说明ACF函数值是显著不为0的可信值,所以显然得出了这个区间才有大把握认为是可信值。

我们前面所说的p值,其意义就在于xn的量受且只受前p个值的影响,那么为什么不是前p+1或p-1个值呢?就是因为考虑且只考虑前p个值的影响能够得出最好的预测。我们的核心问题就在于如何确定这个p值。

我们能否直接向ACF图中在置信区间之外的k值作为p值呢?不行的。

因为对于k=k0所对应的原始序列A和滞后序列B而言,诚然我们得到了他们的相关系数,知晓他们有显著的相关性,但是,假如设B也有一个滞后序列C,C和B的差距就像是B和A的差距一样,正好差k0位,那么C也会通过B间接对A产生相关性,换句话说我们已知的B和A的相关性其实是由多部分构成的,其中有A和B“纯粹”的相关性,还有C间接施加的相关性,甚至还有C的滞后矩阵D间间接施加的相关性,等等。

因此,我们得知道哪阶的原始矩阵和滞后矩阵间的具有显著的“纯粹相关性”才可以,光知道相关性可不行。因此我们引入了偏自相关函数PACF,听名字便知道,偏自相关函数就是完全去除其他因素的影响,只考虑原始序列和滞后序列间纯粹相关性的函数。

恰好,偏相关系数就可以满足我们的要求,它反映的就是纯粹的相关性,那为何如此呢?下面这位大佬给出了一份很好的解释:

总之,我们可以用原始序列和滞后序列的偏相关系数作为PACF的函数值,PACF的参数自然和ACF一样,就是时间序列和k值,我们将时间序列固定为总的那个时间序列,然后就可以针对不同k值画出PACF图了,同样需要给出置信区间,图像如下:

PACF的置信区间算法比较复杂,需要先给出某个模型,然后用最小二乘法进行你和,最后得到拟合模型的参数估计的标准差了,然后根据以下公式计算出a和b。

具体情况好多文章都有些语焉不详,我随后查到更详细的资料再做补充

我们要定义两个概念,拖尾性和截尾性,如下

【拖尾性】如果ACF或PACF图中有超过5%的函数值大于2倍标准差(即强相关性的函数值较多),或者衰减的过程比较缓慢或连续,通常都可视为拖尾。拖尾,顾名思义,就是序列缓慢衰减,“尾巴”慢慢拖着滑下来。

【截尾性】如果ACF或PACF图中在最初的阶明显大于2倍标准差,而后几乎95%的系数都落在2倍标准差的范围内(即强相关性的函数值不多),且非零系数衰减的过程很突然,通常视为k阶截尾。截尾则是突然截断了,像个悬崖。

如果我们画出的PACF图和上图类似地具有截尾性,都是PACF(k)在k大于某个值k0后便不再和0有显著区别了,即基本落在置信区间内了,那么我们便可以直接把这个边界值k0作为对p值的一个较为精确的估计值。

 

·如果ACF具有拖尾性而PACF具有截尾性则该数据很可能适合用AR模型进行预测;

·如果ACF具有截尾性而PACF具有拖尾性,则该数据很可能适合用MA模型进行预测

(悄悄加一句,此时ACF若从k0开始截尾,那么k0可以作为MA模型超参数q的估计值);

·如果ACF和PACF都具有拖尾性,那么该数据很可能更适合用ARMA模型进行预测。

·如果ACF和PACF都具有截尾性...这种情况一般不会出现,因为这通常表明这段数据很难通过白噪声检验,通常会被判定为几乎没有自相关性,不适合用任何时间序列算法来预测。

因此ACF图和PACF图极有利于我们判断该选用哪个模型以及选用某个模型是否适合。

当然这一规则不是绝对的,实际问题往往需要结合进一步的具体分析。

如果此时我们发现手头的时间序列模型确实满足上文所说的适合使用AR模型的特征,那么就可以开始使用AR模型了,并且我们还得到了p值的一个初步估计值k0。

不过我们还需要进一步的确定p值,具体方法如下*

然后我们就得出了具体用于拟合的表达式了,

再进行白噪声检验(也可以把白噪声检验放到第一步去做,以防我们费了好大劲画出ACF图和PACF图并确定p值后原始数据却没通过白噪声检验,,被判定为其实是一段白噪声......当然这种情况的可能性极小,毕竟能通过自相关检验的白噪声很少,但不怕一万就怕万一,所以担心的人可以先进行白噪声检验)

然后再把已经确定了的表达式中的参数计算出来,然后进行模型检验。

模型检验分为两个方面,一是有效性检验,即对残差进行白噪声检验,确定残差已经是白噪声了才算通过检验,二是显著性检验,对每个参数进行t检验,没通过t检验的参数一律删去(t检验水很深,但好在我们在回归专题的那篇笔记中已经讲解过t检验了,再次不再赘述)

模型建立前和建立后的白噪声检验怎么做?很简单,既然白噪声的核心特点是没有自相关性,那么只需要用同样的原理(ACF与PACF)来检验自相关性即可,白噪声理论上除了0阶ACF值、PACF值为1以外,所有正整数阶相关系数均应和0没有显著差别(其实就是统计学意义上的“等于”0,只不过统计学意义上的“等于”需要用“黑话”没有显著区别来说明)。比如下面这个ACF和PACF图对应的数据就是典型的白噪声:

白噪声检验的中的置信区间可以不必用那么麻烦的,直接把[-2/sqrt(T) 2/sqrt(T)]设为置信区间即可,毕竟白噪声检验是个粗活,不需要确定自相关程度的大小,只需要确定有没有即可,因此不需要我们此前用的那些较为复杂的置信区间边界确定法。

插一嘴,除了自相关检验法以外,还有一种常用的方法叫做Ljung-Box检验,有一个就基本够用了,所以这里就不赘述其他方法了

通过检验的模型自然就是最终结果了,可以用于预测了。

那么,参数又怎么估计出来?思想很简单,就是根据最小均方差原则或则最大似然原则计算出最优参数即可,数学过程比较麻烦但并不困难,只是麻烦而已,所以在此不再赘述,我们直接讲怎么用matlab来实现这一步。

首先,对于一串时序数据data而言,想画ACF图只需要autocorr(data)即可,想画PACF图只需要parcorr(data)即可,(甚至可以直接给出[-2/sqrt(T) 2/sqrt(T)]这种较简单的置信区间)

然后,在我们已经确定p值了之后便可以建模了,一句model = ar(data, p);即可,直接建好了模型并且完成了参数估计,如果想要看估计出来的参数到底是什么,使用model.A即可得到(model.A的第一个数是常数项的估计值,然后依次从近到远的各个自变量的回归系数估计值)。

然后便是对残差的白噪声检验了,先用residuals = resid(estimatedModel, data);提取残差,再用autocorr(residuals);parcorr(residuals);绘图分析残差的自相关性即可,没有自相关性则通过残差的白噪声检验。

最后便是应用了,打个比方,如果我们想要接下来20个时间点的预测数据,使用forecast(model, data,20);即可返回一个含有所求的20个元素的向量。(为什么这里要重复提供data呢,这可能是因为此前的data是训练模型用的数据,这里的data是带预测的数据,我们选择让data一人分饰两角自然会出现这种情况,这并不是毫无意义的重复提供,两个data用处不同)

下面是美赛2023C题第一问的ARI模型预测代码,Players是题中的人数数据提取成的向量,最后结果是20605,和高斯预测和强行回归的结果都相近,算是一个蛮不错的结果了,ARI模型可以计算置信区间,预测值上下zσ即为置信区间,z是置信水平对应的Z分数,比如95%置信水平对应1.96的Z分数,80%置信水平对应的是1.282的Z分数,σ则是残差的标准差。,比如按80%置信区间算出来的预测区间就是[5329 35880]。

```

clc;close all;

data=flip(Players);

start=data(1);

data=diff(data);

[h, pValue, stat, cValue, reg] = adftest(data);

% 输出检验结果

if h == 0

disp('时间序列数据具有单位根,不具备平稳性。');

disp(['ADF统计量: ', num2str(stat)]);

disp(['p值: ', num2str(pValue)]);

disp(['临界值: ', num2str(cValue)]);

else

disp('时间序列数据不具有单位根,具备平稳性。');

disp(['ADF统计量: ', num2str(stat)]);

disp(['p值: ', num2str(pValue)]);

disp(['临界值: ', num2str(cValue)]);

end

% subplot(2,1,1);

% autocorr(data);

% subplot(2,1,2);

% parcorr(data);

model=ar(data,2);

model.A;

e=resid(model,data);

%

% subplot(2,1,1);

% autocorr(e);

% subplot(2,1,2);

% parcorr(e);

zx=1.282*std(e);

no=1:359;

fu=forecast(model,data,60);

hold on;

restoredlongdata=[start;data;fu];

size(restoredlongdata);

answer=cumsum([start(1);data;fu])

fu=answer(360:419);

scatter( 1:419, answer);

plot(360:419,fu-zx);

plot(360:419,fu+zx);

```

总结,严格来说,季节性预测法、平滑预测法和趋势预测法不是平等的关系,虽然大部分资料都这么归类,但很明显通过我们此前详细的阐述,我们已经能够发现季节性预测法其实不是“预测法”,而只是一种对时序数据进行的数据预处理办法,而平滑预测法和趋势预测法才是真正的预测算法,两者区别在于平滑预测法用于分析白噪声序列,趋势预测法则用于分析自相关序列。

  1. ARIMA

ARIMA作为AR模型的一种,自然也只能处理平稳的时序数据,如果时序数据并不平稳,就要通过对数变换或者差分变换使序列平稳,那便不能用ARIMA算法。

AR(p)模型考虑到了过去自相关序列的影响,MA(1)模型则是考虑到了白噪声造成的的影响,差分法I(d)则用于处理数据确保数据平稳以使用前两个模型,把他们结合起来便构成了ARIMA算法,英文全称是Auto-Regressive Integrated Moving Averages ,中文全称是差分自回归移动平均模型。

很明显,股票价格、商品价格仅从逻辑角度分析便可知道它们具有强烈的自相关性,经过平稳处理后便能使用ARIMA算法。

具体过程明天再说

五.基于机器学习的统计学时序数据建模方法

  1. K近邻算法
  2. SVM
  3. 随机森林
  4. Xgboost
  5. lightgbm

六.深度学习时序数据建模方法

  1. LSTM
  2. seq2seq模型
 
posted @ 2024-02-01 15:53  Kai-G  阅读(255)  评论(0编辑  收藏  举报
Copyright © 2019-2020 拱垲. All rights reserved.