matlab练习程序(ARMA模型)

ARMA称为自回归移动平均模型(Autoregressive moving average model),由自回归模型(AR)和移动平均模型(MA)混合构成。

注意这里的移动平均模型和移动平均值平滑曲线不是一个概念。

AR模型是用自身的历史数据来预测未来数据,构成如下:

MA模型则利用历史噪声来预测未来数据,构成如下:

ARMA模型综合利用两种方法,构成如下:

其中beta为AR模型的系数,alpha为MA模型的系数,Y为系统测量值,epsilon为噪声。

如果有一些数据,想要利用AR、MA或者ARMA模型来做预测,就需要估计上述alpha,beta系数和epsilon噪声。

AR模型可以用线性最小二乘求解。

MA模型因为噪声数据也是未知量,列出的方程比未知量要少,矩阵奇异,则可以用非线性最小二乘方法迭代求解。

下面给一个ARMA模型求解系数的例子,具体如何优化,则可以参考历史文章

matlab代码如下:

clear;close all;clc;

n=50;
u = 3;
e = randn(n,1);
x = zeros(n,1);

%ARMA模型
for i=3:n
    x(i) = 0.2*x(i-1) + 0.1*x(i-2) + u + e(i) - 0.3*e(i-1) + 0.4*e(i-2);
end

newu = mean(x);
options.Algorithm = 'levenberg-marquardt';
lb = [];ub = [];
par = [newu;rand(4,1);rand(n,1)];
f = @(par) func(par,x);
par= lsqnonlin(f,par,lb,ub,options);        %执行优化

%生成拟合量
newe = par(6:end);
newx = zeros(n,1);
for i=3:n
    newx(i) = par(2)*newx(i-1) + par(3)*newx(i-2)+ par(1) + newe(i) + par(4)*newe(i-1) + par(5)*newe(i-2);
end

for i=n+1:n+2                   %预测两步
    newe(i) = randn(1);
    newx(i) = par(2)*newx(i-1) + par(3)*newx(i-2)+ par(1) + newe(i) + par(4)*newe(i-1) + par(5)*newe(i-2);
end

subplot(3,1,1);
plot(x,'r-o');
hold on;
plot(newx,'g-*');
title('原始序列与估计序列')

subplot(3,1,2);
plot(e,'r-o');
hold on;
plot(newe,'g-*');
title('原始随机序列与估计随机序列')

subplot(3,1,3);
plot(autocorr(x,length(x)-1),'r-o');
hold on;
plot(parcorr(x,'Method','yule-walker','NumLags',length(x)-1),'g-*');
title('自相关与偏相关')

function re = func(par,x)

e = par(6:end);
re = zeros(length(e),1);
for i=3:length(e)
    re(i) = x(i) - (par(2)*x(i-1) + par(3)*x(i-2) + par(1) + e(i) + par(4)*e(i-1) + par(5)*e(i-2));                         %损失量
end
end

结果如下:

参考:https://stats.stackexchange.com/questions/505873/how-to-manually-fit-ma1-model-with-ols

posted @ 2022-09-03 11:56  Dsp Tian  阅读(3241)  评论(0编辑  收藏  举报