时间序列预测|ARIMA模型-Matlab-有数据-含注释

2023-09-05 0 384
版权说明:本站原创资源,版权归MathClub所有,若发现转载或倒卖,一律追究责任到底!
          投稿资源,则一切责任由投稿者承担!欢迎投稿,稿酬丰富。
购买须知:本网站资源和会员充值等,购买后不接受任何退款理由,请斟酌后理性购买!

ARIMA算法介绍

ARIMA 算法是用于单变量时间序列数据预测的最广泛使用方法之一,将自回归模型(AR)、移动平均模型(MA)和差分法结合,我们就得到了差分自回归移动平均模型 ARIMA(p、d、q),其中 d 是需要对数据进行差分的阶数。通过寻找历史数据之间的自相关性,来预测未来(假设未来将重复历史的走势),要求序列必须是平稳的。

优点:模型十分简单,只需要内生变量而不需要借助其他外生变量

缺点:要求时序数据是稳定的;本质上只能捕捉线性关系,不能捕捉非线性关系

建立 ARIMA 模型的基本步骤

  • 对序列绘图,进行 ADF 检验,观察序列是否平稳;对于非平稳时间序列要先进行 d 阶差分,转化为平稳时间序列;
  • 经过第一步处理,已经得到平稳时间序列。要对平稳时间序列分别求得其自相关系数(ACF)和偏自相关系数(PACF),通过对自相关图和偏自相关图的分析,得到最佳的阶数p、q;
  • 由以上得到的d、q、p ,得到 ARIMA 模型。然后开始对得到的模型进行模型检验。

ARIMA 代码


clc;clear;
% 1. 读取数据 - 请将'a.xlsx'替换为您的数据文件名,并将'data(:,2)'表示要预测的列确定
data = readmatrix('a.xlsx');
time_series_data = data(:,2);

% 2. 划分训练集和测试集 - 这里使用80%的数据作为训练集,您可以根据需要调整比例
train_size = round(length(time_series_data) * 0.8);
train_data = time_series_data(1:train_size);
test_data = time_series_data(train_size+1:end);

% 3. 初始化最小AIC和BIC以及最优参数 - 选择模型参数的范围(p、d、q的最大值)
max_p = 5;
max_d = 2;
max_q = 5;
min_aic = Inf;
min_bic = Inf;
best_p = 0;
best_d = 0;
best_q = 0;

% 4. 循环遍历不同的p, d, q值,尝试拟合ARIMA模型,并计算AIC和BIC
for p = 0:max_p
for d = 0:max_d
for q = 0:max_q
% 创建ARIMA模型
Mdl = arima(p, d, q);

% 拟合模型,并计算AIC和BIC
try
[EstMdl,~,logL] = estimate(Mdl, train_data, 'Display', 'off');
[aic, bic] = aicbic(logL, p + q + 1, length(train_data));
catch
continue;
end

% 更新最优参数
if bic < min_bic
min_aic = aic;
min_bic = bic;
best_p = p;
best_d = d;
best_q = q;
end
end
end
end

% 5. 使用最优参数创建ARIMA模型
best_mdl = arima(best_p, best_d, best_q);

% 6. 拟合模型
EstMdl = estimate(best_mdl, train_data);

% 7. 对测试集数据后的值进行预测 - 设定预测步长
num_steps = 20; % 预测测试集之后的20天数据
[forecast,forecast_RMSE] = forecast(EstMdl, num_steps, 'Y0', train_data);

% 计算 95% 置信区间
z = norminv(0.975);
forecast_CI = [forecast - z * forecast_RMSE, forecast + z * forecast_RMSE];

% 8. 输出预测结果
disp(['预测结果(', num2str(num_steps), '个步长):']);
disp(forecast);
disp(['预测置信区间(', num2str(num_steps), '个步长):']);
disp(forecast_CI);

% 9. 可视化预测结果
figure;
hold on;
plot(time_series_data, 'k', 'LineWidth', 1);hold on
plot(train_size+1:train_size+length(test_data), test_data, 'b', 'LineWidth', 1); hold on% 绘制测试集数据
plot(train_size+1:train_size+num_steps, forecast, 'r', 'LineWidth', 1);hold on

xlim([1, length(time_series_data) + num_steps]);
title('ARIMA 时间序列预测');
xlabel('时间');
ylabel('值');
legend('实际数据', '测试集数据', '预测', 'Location', 'best');

% 10. 输出模型参数
disp(['最优模型参数: p = ', num2str(best_p), ', d = ', num2str(best_d), ', q = ', num2str(best_q)]);
disp(['最小 AIC: ', num2str(min_aic)]);
disp(['最小 BIC: ', num2str(min_bic)]);

时间序列预测|ARIMA模型-Matlab-有数据-含注释

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

TechSwap Matlab 时间序列预测|ARIMA模型-Matlab-有数据-含注释 http://aigoedu.com/draft/335.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务