因为网上很多的资料都不全或者不能解决我的问题,所以专门记录完整的步骤。
一、时间序列预测
时间序列预测法其实是一种回归预测方法,属于定量预测,其基本原理是:一方面承认事物发展的延续性,运用过去的时间序列数据进行统计分析,推测出事物的发展趋势;另一方面充分考虑到由于偶然因素影响而产生的随机性,为了消除随机波动产生的影响,利用历史数据进行统计分析,并对数据进行适当处理,进行趋势预测。
二、判断序列是否可以使用时间序列预测
首先从时间的角度可以把一个序列基本分为3类:
1.纯随机序列(白噪声序列),这时候可以停止分析,因为就像预测下一次硬币哪一面朝上一样毫无规律。
2.平稳非白噪声序列,它们的均值和方差是常数,对于这类序列,有成熟的模型来拟合这个序列在未来的发展状况,如AR,MA,ARMA等(具体模型算法及实现在后面)
3.非平稳序列,一般做法是把他们转化为平稳的序列,在按照平稳序列的算法进行拟合。如果经过差分后平稳,则应使用ARIMA模型进行拟合。下面需要知道你的序列属于哪一种(平稳性检验)
(1)单位根检验
函数:adftest(A)
结果为0,则序列为非平稳
(2)Daniel检验
对于显著性水平A,计算时间序列的秩相关系数q,若T大于二分a数,则认为序列非平稳。
函数:RT = tiedrank(a);
n = length(a);t = 1:n;
q = 1-6/(n*(n2-1))*sum((t-Rt).2)
T = Qs*sqrt(n-2)/sqrt(1-q^2);
t_0 = tinv(0.975,n-2)
三、选择模型
平稳的序列自相关图和偏自相关图不是拖尾就是截尾。
截尾就是在某阶之后,系数都为 0 。
拖尾就是有一个衰减的趋势,但是不都为 0 。
如果自相关是拖尾,偏相关截尾,则用 AR 算法
如果自相关截尾,偏相关拖尾,则用 MA 算法
如果自相关和偏相关都是拖尾,则用 ARMA 算法, ARIMA 是 ARMA 算法的扩展版,用法类似 。
四、介绍ARIMA模型
1.目前最常用的拟合平稳序列的模型为ARMA(Autoregressive moving average)模型,全称是自回归移动平均模型,他又可以分为AR模型,MA模型和ARMA模型三大类。
(1)自回归AR§模型
自回归模型描述的是当前值与历史值之间的关系。
(2)移动平均MA(q)模型
移动平均模型描述的是自回归部分的误差累计。
(3)ARMA(p,q)模型
ARMA(p,q)模型中包含了p个自回归项和q个移动平均项,ARMA(p,q)模型可以表示为:
当q=0时,是AR§模型
当p=0时,是MA(q)模型
(4)一般分析步骤:
(5)如果数据非平稳,需要转化为平稳序列,可采用差分方法
函数:diff(x)
并结合自相关和偏相关图分析
函数:
figure(1)
autocorr(x)
figure(2)
parcorr(x)
(6)matlab的arima函数
完整代码:
%% 时间序列预测
%输入原始数据
A = [970279
1259308
1127571
1163959
1169540
1076938
991350
953275
951508
904434
889381
864015
836236
]';
%判断是否平稳,使用ADF检验
h = adftest(A)
%B = dtrend(A)
B = diff(A)
H = adftest(B)
figure(1)
autocorr(B)
figure(2)
parcorr(B)
x = A;
w = B;
n = 2;
s = 1;
m1 = length(A); %原始的数据的个数
for i = s+1:m1
y(i-s) = x(i) - x(i-s);%进行周期差分变换
end
ToEstMd = arima('ARLags',1,'MALags',1:1,'Constant',0);%指定模型的结构
[EstMd,EstParamCov,LogL,info] = estimate(ToEstMd,w');%模型拟合
w_Forecast = forecast(EstMd,n,'Y0',w');
yhat = y(end) + cumsum(w_Forecast); %一阶差分的还原值
for j = 1:n
x(m1 + j) = yhat(j) + x(m1+j-s); %x的预测值
end
x(1:end)