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