|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
最近接触到了用ARIMA模型进行时间序列预测,其中Xtrain是288个训练数据,Xfor是289个待预测的数据,Xtrain和Xfor的具体数据见附件,其中第一列是Xtrain,第二列是Xfor。程序如下:
SourceData=[Xtrain;Xfor];
nfor=size(Xfor,1); %待预测的数据个数
step=1; %1步预测
TempData=SourceData;
%----------差分,平稳化时间序列---------
[H,PValue,TestStat,CriticalValue] = dfARDTest(TempData,[],0.05,'T');
SaveDiffData=[];
while ~H
SaveDiffData=[SaveDiffData;TempData(1,1)];%保存去掉的数
TempData=diff(TempData);%差分,平稳化时间序列
TempData2=TempData;
[H,PValue,TestStat,CriticalValue] = dfARDTest(TempData,[],0.05,'T');%adf检验,判断时间序列是否平稳化
end
%------------模型定阶或识别------------
u = iddata(TempData(1:end-nfor));%训练数据
test = [];
for p = 1:10 %自回归对应PACF,给定滞后长度上限p和q
for q = 1:10 %移动平均对应ACF
m = armax(u,[p q]);
AIC = aic(m); %armax(p,q),计算AIC
test = [test;p q AIC];
end
end
for k = 1:size(test,1) %没太理解。。。
if test(k,3) == min(test(:,3)) %选择AIC值最小的模型
p_test = test(k,1);
q_test = test(k,2);
break;
end
end
%----------------1阶预测-----------------
n=iddata(TempData);
m = armax(u,[p_test q_test]); %armax(p,q),[p_test q_test]对应AIC值最小
P1=predict(m,n,step);
PreR=P1.OutputData;
%----------------还原差分-----------------
if size(SaveDiffData,2)~=0
for index=size(SaveDiffData,1):-1:1
PreR=cumsum([SaveDiffData(index);PreR]);
end
end
tempx=PreR(size(SourceData,1)+1:size(PreR,1)); %最后计算得到的预测值
想请教各位大侠predict函数的原理是什么,我看了matlab help里的解释,还是不明白,这样编程的话结果是不是每次做一步预测的时候都用到了前一步的真实值?因为如果我把待预测的真实值Xfor全部置0的话结果就不一样了,说明predict函数在预报的时候使用到了前一步的真实值,可对于一次性预报后面289个点的情况,这289个点的值都是未知的呀,只能在每次做一步预测的时候使用前一步的预测值,要怎么编呢?matlab有没有实现这一功能的自带函数呢?如果自己编的话,是不是要设一个循环,让数据每次向前滚动一个数,并且每次都要重新用armax函数重新建模,在用predict函数对下一时刻进行预报??我试着这样编了一下,发现效率太低,请问各位大侠这样做对不对,有没有更好的办法?谢谢大家了!!! |
|