时间序列定阶matlab,时间序模型判断及定阶

初次接触matlab及时间序列还请给位前辈多多指教!

我写的代码如下,可以正常运行。主要功能是平稳性检验及平稳化处理,求自相关函数、偏相关函数。AIC准则定阶。

现在的问题是在AIC定阶时我不知道结果是什么,怀疑是数据预处理没有完成,还望各位前辈多多指教。代码如下(有点长);

clc,clear;

%function()

%+++++++++++++++++++++++++++实验数据+++++++++++++++++++++++++++++++

shiyan01=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18;

-0.7 -0.7 -1.7 -1.7 -2.1 -3.1 -3.6 -4.6 -5.3 -5.7 -6.5 -6.0 -6.1 -6.4 -6.7 -6.8 -6.9 -7.1];

tshiyan01=1:0.5:18;   %内插期数

shiyan02=[1 10 19 24 27 35 41 46 54 61 69 76;

5.38 5.15 6.69 8.30 8.12 11.05 13.04 11.9 16.26 17.56 18.61 18.03];

tshiyan02=1:3:76;    %内插期数

%+++++++++++++++++++++++++++应力数据+++++++++++++++++++++++++++++

yl0201=[1         13         16         20         22         24         26         31         34         36         43         45         49         53         57         61         65         66         70         71         72         73         77         78         79         85         94         101         104         114         120         129         136         139         148         155         161 ;

0.00000000         -4.16848320         -6.94561600         0.34752440         -0.34750120         5.91107000         6.25898880         12.17715800         22.28833280         -7.98665800         9.04317440         101.04583680         127.31974400         121.27260600         127.67566680         141.93160280         163.02686400         172.70756280         173.42532440         174.50214080         176.65640000         178.45225400         180.60804440         180.60804440         180.96742400         207.62589440         181.68625280         323.99977400         194.28077880         197.52396480         205.09870680         211.23813440         210.87680600         204.37686200         215.57588480         217.38426680         214.49113400 ];

tyl=1:3:161;   %内插期数

%+++++++++++++++++++++++++++数据赋值+++++++++++++++++++++++++++++++++++

shuju=yl0201;

qs=tyl;

%++++++++++++++++++++++++++插值处理+++++++++++++++++++++++++++++++++++++

q=shuju(1,:);

d=shuju(2,:);

cz=interp1(q,d,qs,'cubic');%%三次插值

figure(6);

subplot(2,1,1)

plot(q,d,'g'),title('原始数据');

subplot(2,1,2)

plot(qs,cz,'r'),title('内插后数据');

M=length(cz);

%+++++++++++++++++++++++平稳化处理及检验++++++++++++++++++++++++++++++++++

jy=cz;

jy=jy';jy=jy(:)';

l=length(jy);

[xsort,ind]=sort(jy);

Rt(ind)=1:l;

t=1:l;

Qs=1-6/(l.*(l^2-1)).*sum((t-Rt).^2);

T=Qs.*sqrt(l-2)/sqrt(1-Qs^2);

ta=tinv(0.975,l-2);

fprintf('平稳性检验结果;\n');

fprintf('   统计量T      下QS    统计量T的临界值ta \n');

fprintf('==================================================\n');

fprintf('%11.6f%11.6f%11.6f  %11.6f\n\n',T,Qs,ta);

if abs(T)>ta    %若数据不平稳进行平稳化处理

figure(1);

plot(qs,cz,'r'),title('原始数据');

fprintf('\n数据是非平稳数据,需要平稳化处理。\n')

p1=input('请选择曲线拟合阶次:');

xishu=polyfit(qs,cz,p1 );    %计算拟合曲线系数

nhqx=polyval(xishu,qs,p1);  %拟合曲线

pw=cz-nhqx;           %求残差

%+++++++++++++++++++++++对平稳后的时间序列进行平稳性检验+++++++++++++

cc=pw;    %以防在进行平稳检验是对数列有改变

cc=cc';cc=cc(:)';

l=length(cc);

[xsort,ind]=sort(cc);

Rt(ind)=1:l;

t=1:l;

Qs=1-6/(l.*(l^2-1)).*sum((t-Rt).^2);

T=Qs.*sqrt(l-2)/sqrt(1-Qs^2);

ta=tinv(0.975,l-2);

fprintf('平稳性检验结果;\n');

fprintf('   统计量T      下QS    统计量T的临界值ta \n');

fprintf('==================================================\n');

fprintf('%11.6f%11.6f%11.6f  %11.6f\n\n',T,Qs,ta);

if abs(T)>ta

fprintf('数据仍不平稳,需从新做平稳化处理\n');

else

fprintf('数据平稳。\n');

end

else

pw=cz;

fprintf('\n数据时平稳数据。\n');

end

figure(7);

plot(qs,pw,'g'),title('平稳处理后数据');

cancha=pw(1:M-5);

jmqs=qs(1:M-5);

l1=length(cancha);

%+++++++++++++++++++++++++++++++++求自相关函数+++++++++++++++++++++++++++++

zxghs=autocorr(cancha,[],2,2);  %残差数据为三十期

%autocorr()函数是时间序列自相关函数

%sm : 一个时间序列数据

%[]: 表示计算这个时间序列数据的自相关函数的延迟.

%2: 表示自相关函数在>2的所有延迟的自相关系数看作为0

%2: 表示在什么范围内时间序列的数据被看作是0

%++++++++++++++++++++++++++++++++++求偏相关函数++++++++++++++++++++++++++++

pxghs=parcorr(cancha,[],2,2);

%++++++++根据自相关函数和偏相关函数的拖尾截尾情况选择模型++++++++++++++++++++++

p1=length(zxghs);

p2=[1:1:p1];

figure(2);

plot(p2,zxghs,'r',p2,pxghs,'g'),legend('自相关函数','偏相关函数'),title('模型判断');

%+++++++++++++++++++++采用FPE定阶准则定阶++++++++++++++++++++++++++++++++++

N=length(cancha);

%++++++++++++++++++++++++++++AIC准则定阶+++++++++++++++++++++++++++++++++++

e=5;    %AIC准则定阶的最高阶

t=0;

for i=0:e

for j=0:e

spec=garchset('R',i,'M',j,'Display','off');

[coeffX,errorsX,LLFX]=garchfit(spec,cancha);

num=garchcount(coeffX);

[aic,bic]=aicbic(LLFX,num,10000);

t=t+1;

a(t)=aic;

b(t)=bic;

fprintf('R=%d.M=%d.AIC=%f.BIC=%f\n',i,j,aic,bic);

end

end

d=1:1:(e+1)^2;

figure(222);

plot(d,a,'r',d,b,'g'),legend('AIC','BIC'),title('AIC准则阶次判断');

fprintf('请依据AIC、BIC值选择(p、q)\n')

p=input('AR模型阶次:');

q=input('MA模型阶次:');

spec=garchset('R',p,'M',q,'Display','off');

[coeffX,errorsX,LLFX]=garchfit(spec,cancha);%计算拟合参数

%e=zeros(1,l1);

e(1)=0;

z=0;

%cancha(0)=0;

%y(1)=cancha(1);

%++++++++++++++++++++++++MA模型++++++++++++++++++++++++++++++++++

if p==0

if q>0

if q==1

for j=q+1:l1          %%%q为参与建模的期数

e(j)=cancha(j)-coeffX.MA*e(j-1);

MA(j)=e(j)-coeffX.MA*e(j-1);

end

end

if q==2

e(1:q)=0;

for j=q+1:l1          %%%q为参与建模的期数

e(j)=cancha(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2);

MA(j)=e(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2);

end

end

if q==3

e(1:q)=0;

for j=q+1:l1          %%%q为参与建模的期数

e(j)=cancha(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2)-coeffX.MA(3)*e(j-3);

MA(j)=e(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2)-coeffX.MA(3)*e(j-3);

end

end

if q==4

e(1:q)=0;

for j=q+1:l1          %%%q为参与建模的期数

e(j)=cancha(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2)-coeffX.MA(3)*e(j-3)-coeffX.MA(4)*e(j-4);

MA(j)=e(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2)-coeffX.MA(3)*e(j-3)-coeffX.MA(4)*e(j-4);

end

end

end

end

%++++++++++++++++++++++++AR模型++++++++++++++++++++++++++++++++++

if q==0

if p>0

for j=p+1:l1          %%%a:q中a=2,q为参与建模的期数

%y(j)=polyval(coeffX.MA,e(j-q:j-1),q)

for i=1:p

z=coeffX.AR(i)*cancha(j-i)+z;

end

AR(j)=z;

e(j)=cancha(j)-z;%计算残差

end

end

end

%++++++++++++++++++++++++ARMA模型++++++++++++++++++++++++++++++++++

if q>0

if p>0

%for j=2:l1          %%%a:q中a=2,q为参与建模的期数

%y(j)=coeffX.AR*cancha(j-1)-coeffX.MA*e(j-1);

%  e(j)=cancha(j)-polyval(coeffX.AR,cancha(j-p:j-1),p)-polyval(coeffX.MA,e(j-q:j-1),q);%计算残差

% end

%++++++++++++++++AR模型部分++++++++++++++++++++++++++++++++++

for j=p+1:l1          %%%a:q中a=2,q为参与建模的期数

%y(j)=polyval(coeffX.MA,e(j-q:j-1),q)

for i=1:p

AR(j)=coeffX.AR(i)*cancha(j-i);

end

%y(j)=z(j);

e(j)=cancha(j)-AR(j);%计算残差

end

%+++++++++++++++++++MA模型部分+++++++++++++++++++++++++++

if q==1

for j=q+1:l1          %%

e(j)=cancha(j)-coeffX.MA*e(j-1);

MA(j)=e(j)-coeffX.MA*e(j-1);

end

end

if q==2

e(1:q)=0;

for j=q+1:l1          %%%

e(j)=cancha(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2);

MA(j)=e(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2);

end

end

if q==3

e(1:q)=0;

for j=q+1:l1          %%%

e(j)=cancha(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2)-coeffX.MA(3)*e(j-3);

MA(j)=e(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2)-coeffX.MA(3)*e(j-3);

end

end

if q==4

e(1:q)=0;

for j=q+1:l1          %%%

e(j)=cancha(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2)-coeffX.MA(3)*e(j-3)-coeffX.MA(4)*e(j-4);

MA(j)=e(j)-coeffX.MA(1)*e(j-1)-coeffX.MA(2)*e(j-2)-coeffX.MA(3)*e(j-3)-coeffX.MA(4)*e(j-4);

end

end

%++++++++++++++++++++++++++++++合成+++++++++++++++++++++++++++++++

if p>q

a=q;

else

a=p;

end

for j=a:l1

ARMA(j)=AR(j)+MA(j)-e(j);

end

end

end

figure(11);

plot(jmqs,e,'b'),title('建模后残差');

%++++++++++++++++++++++++++++++++五步预报++++++++++++++++++++++++++++++++++

[sigmaForecast,x_Forecast]=garchpred(coeffX,cancha,5);%预报,进行5步预报值,其中第一个返回标准差,第二个返回预报值

ybqs=qs(M-4:M);

nhqx1=polyval(xishu,ybqs,p1);

ybz=x_Forecast+nhqx1;

ybz

ybc=cz(M-4:M)-ybz;

ybc

figure(55);

subplot(2,1,1)

plot(ybqs,cz(M-4:M),'g',qs(M-4:M),ybz,'r'),title('多步预报值与插值数据'),legend('后五期插值','预报值');

subplot(2,1,2)

plot(ybqs,ybc,'r'),title('预报误差');

zdwc=max(abs(ybc));%求预测最大误差

zwc=sqrt(sum(ybc.*ybc)/5);%求预测中误差

fprintf('最大预报误差为:%11.2f\n',zdwc);

fprintf('预  报中误差为:%11.2f\n\n',zwc);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值