matlab实现ARMA(自回归移动平均)模型

ARMA(自回归移动平均)模型 是时间序列预测的经典线性模型,适用于平稳序列。其核心思想是:当前值由过去值的线性组合(AR)历史随机冲击的线性组合(MA) 共同决定。


一、 ARMA 模型核心公式与理解

对于一个平稳时间序列 {Xt}\{X_t\}{Xt},ARMA(p, q) 模型表示为:

Xt=c+∑i=1pϕiXt−i+εt+∑j=1qθjεt−jX_t = c + \sum_{i=1}^{p} \phi_i X_{t-i} + \varepsilon_t + \sum_{j=1}^{q} \theta_j \varepsilon_{t-j}Xt=c+i=1∑pϕiXt−i+εt+j=1∑qθjεt−j

其中:

  • XtX_tXt :时间序列在时刻 ttt 的观测值。
  • ccc:常数项。
  • ppp :自回归阶数,ϕi\phi_iϕi 为自回归系数,衡量过去 ppp 期值对当前值的影响。
  • qqq :移动平均阶数,θj\theta_jθj 为移动平均系数,衡量过去 qqq 期随机冲击(白噪声 ε\varepsilonε)对当前值的影响。
  • εt\varepsilon_tεt:均值为0、方差恒定的白噪声序列。

直观比喻

  • AR部分:像"惯性"。例如,昨天的气温对今天有直接影响。
  • MA部分:像"记忆衰减的冲击"。例如,一场突发降雨(随机冲击)的影响会在后续几天逐渐消散。

二、MATLAB 建模实战

matlab 复制代码
%% ARMA 模型完整建模与预测流程
clear; clc; close all;

% 步骤 0: 加载或生成示例数据 (此处生成模拟数据供演示)
rng(42); % 设置随机种子确保结果可复现
T = 300; % 数据长度
y = 0.7*[0; y(1:end-1)] + randn(T,1) + 0.4*[0; randn(T-1,1)]; % 生成 ARMA(1,1) 数据
% y = your_time_series_data; % 请在此处替换为您的实际数据

% 步骤 1: 绘制时序图与自相关图,初步判断平稳性
figure;
subplot(2,2,1); plot(y); title('原始时间序列'); grid on;
subplot(2,2,2); autocorr(y, 'NumLags', 30); title('自相关函数 (ACF)');
subplot(2,2,3); parcorr(y, 'NumLags', 30); title('偏自相关函数 (PACF)');

% 步骤 2: 平稳性检验 - Augmented Dickey-Fuller 检验
[h, pValue] = adftest(y);
fprintf('ADF单位根检验结果: h = %d, p-value = %.4f\n', h, pValue);
if h == 0
    fprintf('  结论: 序列非平稳,建议进行差分处理。\n');
    % 进行一阶差分 (此时模型变为ARIMA)
    y_diff = diff(y);
    figure;
    subplot(1,2,1); plot(y_diff); title('一阶差分后序列'); grid on;
    subplot(1,2,2); autocorr(y_diff, 'NumLags', 30); title('差分后ACF');
    y = y_diff; % 后续对差分后序列建模
else
    fprintf('  结论: 序列平稳,可直接建立ARMA模型。\n');
end

% 步骤 3: 模型定阶 (确定 p 和 q)
% 方法一: 观察ACF和PACF的截尾/拖尾特征 (手动)
%   - AR(p) 模型: PACF在p阶后截尾,ACF拖尾。
%   - MA(q) 模型: ACF在q阶后截尾,PACF拖尾。
%   - ARMA(p,q) 模型: ACF和PACF均拖尾。

% 方法二: 使用信息准则自动搜索最优阶数 (推荐)
max_p = 5; % 最大AR阶数
max_q = 5; % 最大MA阶数
best_aic = Inf;
best_bic = Inf;
best_p = 0;
best_q = 0;

for p = 0:max_p
    for q = 0:max_q
        if p==0 && q==0
            continue; % 跳过ARMA(0,0)
        end
        try
            mdl = arima(p, 0, q); % (p, d, q), 此处d=0因已检验平稳
            [~, ~, logL] = estimate(mdl, y, 'Display', 'off');
            [aic, bic] = aicbic(logL, p+q+1, T); % 计算AIC和BIC
            if bic < best_bic % 通常BIC比AIC更倾向于简约模型
                best_bic = bic;
                best_aic = aic;
                best_p = p;
                best_q = q;
            end
        catch
            continue; % 跳过无法拟合的阶数组合
        end
    end
end
fprintf('基于BIC准则的最优模型阶数: ARMA(%d, %d)\n', best_p, best_q);
fprintf('对应 AIC: %.2f, BIC: %.2f\n', best_aic, best_bic);

% 步骤 4: 估计ARMA模型参数
final_mdl = arima(best_p, 0, best_q);
est_mdl = estimate(final_mdl, y, 'Display', 'full'); % 显示估计结果

% 步骤 5: 模型诊断 - 检验残差是否为白噪声
res = infer(est_mdl, y); % 获取残差序列
figure;
subplot(2,2,1); plot(res); title('模型残差序列'); grid on;
subplot(2,2,2); histogram(res, 20); title('残差分布');
subplot(2,2,3); autocorr(res, 'NumLags', 30); title('残差ACF');
subplot(2,2,4); parcorr(res, 'NumLags', 30); title('残差PACF');

% Ljung-Box Q检验 (原假设: 残差是白噪声)
[h_lb, p_lb] = lbqtest(res, 'Lags', [10, 15, 20], 'Alpha', 0.05);
if all(h_lb == 0)
    fprintf('模型诊断通过: 残差是白噪声 (p值均 > 0.05),模型拟合充分。\n');
else
    fprintf('模型诊断未通过: 残差存在自相关,建议尝试更高阶数或不同模型。\n');
end

% 步骤 6: 进行未来预测
num_steps = 20; % 预测未来20期
[forecast_y, forecast_mse] = forecast(est_mdl, num_steps, 'Y0', y);
lower_bound = forecast_y - 1.96*sqrt(forecast_mse); % 95%置信区间下界
upper_bound = forecast_y + 1.96*sqrt(forecast_mse); % 95%置信区间上界

% 可视化预测结果
figure;
t_history = 1:T;
t_forecast = (T+1):(T+num_steps);
plot(t_history, y, 'b-', 'LineWidth', 1.5); hold on;
plot(t_forecast, forecast_y, 'r--', 'LineWidth', 1.5);
fill([t_forecast, fliplr(t_forecast)], [lower_bound', fliplr(upper_bound')], 'r', 'FaceAlpha', 0.2, 'EdgeColor', 'none');
legend('历史数据', '点预测', '95%置信区间', 'Location', 'best');
title('ARMA模型样本外预测');
xlabel('时间'); ylabel('序列值'); grid on;

参考代码 时间序列预测模型ARMA模型 www.youwenfan.com/contentcsu/65067.html

三、 关键要点与进阶方向

  1. 平稳性是前提 :如果 ADF 检验拒绝原假设(h=1),则数据平稳,可直接用 ARMA。否则,必须进行差分直到平稳,此时模型变为 ARIMA(p,d,q) ,其中 d 为差分阶数。在 MATLAB 中,只需将 arima(p, 0, q) 中的第二个参数改为 d 即可。
  2. 定阶是核心 :代码中使用了 BIC 准则自动定阶,它比 AIC 更能防止过拟合。在实际分析中,应结合 ACF/PACF 图 进行交叉验证。如果 ACF 拖尾、PACF 在 p 阶后截尾,可能是 AR§;反之可能是 MA(q);两者都拖尾则是 ARMA(p,q)。
  3. 诊断不可少 :拟合后务必进行残差白噪声检验。如果残差不是白噪声(Ljung-Box 检验 p 值 < 0.05),说明模型未充分提取信息,需要尝试更高阶数或考虑其他模型。
  4. ARMA 的局限性 :ARMA 是线性模型 ,无法捕捉非线性模式(如波动聚集)。对于具有明显趋势或季节性 的数据,应使用 ARIMASARIMA 。对于更复杂的序列,可考虑 GARCH (金融波动率)、Prophet (强季节性)或 LSTM(深度学习)等模型。
相关推荐
lbb 小魔仙1 小时前
Ollama 本地部署大模型 + Python API 集成开发完整教程(2026最新版,含 GPU 加速配置)
开发语言·python
民乐团扒谱机1 小时前
【微实验】平滑轨迹的数学基石:二次贝塞尔曲线原理、插值逻辑、形态控制与MATLAB全解析
开发语言·matlab
CSCN新手听安1 小时前
【Qt】Qt窗口(七)QColorDialog颜色对话框,QFileDialog文件对话框的使用
开发语言·c++·qt
A charmer1 小时前
从 C++ 到 Objective-C:零基础平滑转学专栏【总目录】
开发语言·c++·objective-c
cookies_s_s1 小时前
C++ 内存模型与无锁编程:从底层原理到实战
linux·服务器·开发语言·c++
wuyikeer2 小时前
Java进阶——IO 流
java·开发语言·python
jieyucx2 小时前
Go 切片核心:子切片详解(下篇)
开发语言·算法·golang·切片
阿里嘎多学长2 小时前
2026-05-02 GitHub 热点项目精选
开发语言·程序员·github·代码托管
alwaysrun2 小时前
C++之字符串视图string_view
开发语言·c++·字符串·string_view·字符串视图