时间序列的ARIMA预测分析
例
假设我们有这么一段数据(采样自移动公司某段时间的开户客户数目),预测接下来31天的开户客户数。
文件地址:
链接: https://pan.baidu.com/s/1RS-x1HTQLUU1IF5g3Yesdw
提取码: xbyt
在这里,我们把时间序列数据利用Cramer分解定理将其分解为以下四项:
1 2 3 4 5
| 真实数据=趋势项+周期项+信息传递项+白噪声项 趋势性:例如随时间变化的一次函数/多次函数/幂函数趋势等 周期项:周期规律 信息传递项: 白噪声项:作为残差
|
## 1.观测数据(均值,周期等)
1 2 3 4 5 6 7 8 9
| x0=xlsread('移动通知户开户数.xlsx','B2:B732'); n=1:length(x0); subplot(1,2,1); plot(n,x0); title('原始数据图像'); hold on; subplot(1,2,2); autocorr(x0); title('自相关图');
|
2. 数据预处理
如图所示我们可以看到周期大约是30或31,由此我们也可以推测该数据是一个来自每天的开户统计数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| s=31; n=31; m1=length(x0) for i=s+1:m1 y(i-s)=x0(i)-x0(i-s); end x1=diff(y) m2=length(x1) subplot(1,2,1) plot(1:m2,x1) title('') hold on subplot(1,2,2) autocorr(x1)
|
adf检验处理后的数据平稳
1 2 3 4 5 6 7 8 9 10
| [h1,p1,adf,ljz]=adftest(x1) h1 = logical 1 p1 = 1.0000e-03 adf = -47.5009 ljz = -1.9413
|
结果表示一阶31步后的数据是平稳的。
3. 白噪声检验
1 2 3 4 5 6 7 8 9 10 11 12
| yanchi=[6,12,18]; [H,pValue,Qstat,CriticalValue]=lbqtest(x1,'lags',yanchi); fprintf('%15s%15s%15s','延迟阶数','卡方统计量','p值'); fprintf('\n'); for i=1:length(yanchi) fprintf('%18f%19f%19f',yanchi(i),Qstat(i),pValue(i)); fprintf('\n'); end 延迟阶数 卡方统计量 p值 6.000000 200.496085 0.000000 12.000000 209.963846 0.000000 18.000000 235.502676 0.000000
|
p<0.1说明数据不是白噪声,可以进行aeima模型。
4. 模型检验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| x1=x1'; LOGL=zeros(6,6); PQ=zeros(6,6); for p=0:5 for q=0:5 model=arima(p,0,q); [fit,~,logL]=estimate(model,x1); LOGL(p+1,q+1)=logL; PQ(p+1,q+1)=p+q; end end LOGL=reshape(LOGL,36,1); PQ=reshape(PQ,36,1); [aic,bic]=aicbic(LOGL,PQ+1,m2); fprintf('AIC为:\n'); reshape(aic,6,6) fprintf('BIC为: \n'); reshape(bic,6,6)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| AIC为: ans = 1.0e+04 * 1.5207 1.4932 1.4859 1.4859 1.4859 1.4861 1.4980 1.4858 1.4859 1.4843 1.4843 1.4864 1.4917 1.4858 1.4850 1.4840 1.4851 1.4844 1.4892 1.4858 1.4862 1.4852 1.4839 1.4843 1.4876 1.4846 1.4862 1.4844 1.4841 1.4841 1.4873 1.4850 1.4846 1.4845 1.4836 1.4833 BIC为: ans = 1.0e+04 * 1.5211 1.4942 1.4873 1.4877 1.4882 1.4889 1.4989 1.4872 1.4878 1.4865 1.4870 1.4896 1.4931 1.4877 1.4872 1.4867 1.4883 1.4880 1.4910 1.4881 1.4889 1.4884 1.4876 1.4883 1.4899 1.4873 1.4894 1.4880 1.4882 1.4887 1.4901 1.4882 1.4883 1.4886 1.4882 1.4883
|
寻找使AIC\BIC值最小的p值和q值(p、q值越小越好)
如果数值相同可尽量选择阶数较小。
p=q=5
5. 模型估计
1 2 3 4
| p=input('输入阶数p='); q=input('输入阶数q='); model=arima(p,0,q); m=estimate(model,x1);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ARIMA(5,0,5) Model (Gaussian Distribution): Value StandardError TStatistic PValue __________ _____________ __________ __________ Constant -0.13876 5.2153 -0.026606 0.97877 AR{1} -0.62756 0.2344 -2.6773 0.0074222 AR{2} 0.63226 0.23509 2.6894 0.0071576 AR{3} 0.45155 0.16781 2.6909 0.0071264 AR{4} -0.21596 0.23391 -0.92326 0.35587 AR{5} 0.14475 0.055125 2.6259 0.0086427 MA{1} -0.16113 0.2338 -0.68919 0.4907 MA{2} -1.1618 0.073341 -15.841 1.6094e-56 MA{3} 0.080585 0.3241 0.24864 0.80364 MA{4} 0.64061 0.12254 5.2276 1.7168e-07 MA{5} -0.39824 0.17684 -2.252 0.02432 Variance 1.0281e+08 1.3326e-06 7.7147e+13 0
|
6. 模型检验
1 2 3 4
| z=iddata(x1); ml1=armax(z,[p,q]); e=resid(ml1,z); [H,pValue,Qstat,CriticalValue]=lbqtest(e.OutputData,'lags',6)
|
1 2 3 4 5 6 7 8 9
| H = logical 0 pValue = 0.9795 Qstat = 1.1455 CriticalValue = 12.5916
|
说明残差是白噪声序列。
7. 预测
1 2 3 4 5 6
| [yf,ymse]=forecast(m,n,'Y0',x1); yhat=y(end)+cumsum(yf); for j=1:n x0(m1+j)=yhat(j)+x0(m1+j-s); end xhat=x0(m1+1:end)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| xhat = 1.0e+04 * 9.4432 6.1221 5.4381 4.6014 4.6824 4.3914 3.7724 4.0716 4.1337 4.0116 3.8555 3.7977 3.8511 3.2243 3.4339 3.4500 4.0557 3.9356 3.6604 3.6947 3.2538 3.4977 3.6063 3.8183 3.5776 3.9540 3.9762 3.5320 3.8284 4.2821 4.3404
|
这就是接下来31天的预测客户数。
参考