数学建模:ARMA时间序列预测

这篇具有很好参考价值的文章主要介绍了数学建模:ARMA时间序列预测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛

ARMA预测

时间序列是按时间顺序的一组数字序列
时间序列的特点:

  • 现实的、真实的一组数据,时间序列背后是某一现象的变化规律,时间序列预测就是学习之前的规律来预测后面的值

算法流程

  1. 判断时间序列数据是否平稳,若非平稳需要做差分处理
  2. 判断适合时间序列的模型,以及进行模型定阶
  3. 参数估计,产生模型
  4. 利用模型进行预测,评估预测结果
  5. 可选:绘制预测图像

代码实现(1)

预测指定的 L 个数据。

function [ret_predict] = mfunc_ARMA_L(trainData,L)
    % ARMA预测
    % params: 
    %       trainData: 训练原始数据 Shape: (1,n)
    %       L:         预测数据个数 
    % returns:
    %       predict:   预测的值 Shape:(1,L)

    % 判断时间序列数据是否平稳 1代表平稳,0代表不平稳
    is_stable = adftest(trainData);
    if is_stable == 1
        disp("时间序列数据平稳.");
    else
        disp("时间序列数据不平稳,正在进行差分处理!");
        diff_trainData = diff(trainData); % 进行差分处理
        disp("差分处理完成!");
    end
    % 利用自相关图和偏相关图判断模型类型和阶次
    figure(1)
    autocorr(diff_trainData) %绘制自相关函数 -> MA
    [ACF,Lags,Bounds]=autocorr(trainData);
    figure(2)
    parcorr(diff_trainData) %绘制偏相关函数 -> AR
    % 自相关和偏相关函数难以判断时可以用AIC准则求出最好阶数
    %确定阶数的上限
    lim=round(length(trainData)/10); %数据总长度的1/10
    if lim>=10
        lim=10;%如果数据太长了,就限定阶数
    end
    id_trainData=iddata(trainData');
    %
    saveData=[];
    for p=1:lim
        for q=1:lim
            num=armax(id_trainData,[p,q]);  %armax对应FPE最小
            AIC=aic(num);   %AIC可以衡量阶数好不好
            saveData=[saveData;p q AIC];   
            hotMatrix(p,q)=AIC;
        end
    end
    %AIC越小越好
    % 绘制阶数热力图
    figure(3)
    for i=1:lim
        y_index(1,i)={['AR' ,num2str(i)]};
        x_index(1,i)={['MA' ,num2str(i)]};
    end
    H = heatmap(x_index,y_index, hotMatrix, 'FontSize',12, 'FontName','宋体');
    H.Title = 'AIC定阶热力图'; 
    %AIC越小越好

    % 利用阶数得到模型
    min_index=find(saveData(:,3)==min(saveData(:,3)));
    p_best=saveData(min_index,1);  %p的最优阶数
    q_best=saveData(min_index,2);  %q的最优阶数

    model = armax(id_trainData,[p_best,q_best]);
    
    % 利用模型预测,对划分的测试集测试
    % L=length(testData); 参数中给出 
    pre_data=[diff_trainData';zeros(L,1)];
    pre_data1=iddata(pre_data);  % 做成时间序列预测
    pre_data2=predict(model,pre_data1,L);

    pre_data3=get(pre_data2);%得到结构体
    pre_data4=pre_data3.OutputData{1,1}(length(diff_trainData)+1:length(diff_trainData)+L);%从结构体里面得到数据

    %显示全部
    data1=[diff_trainData';pre_data4];%全部的差分值
    if is_stable==0 %非平稳时进行差分还原
       data_pre1=cumsum([trainData(1);data1]);%还原差分值
    else
        data_pre1=data1;
    end

    % 最终预测
    data_pre2=data_pre1(length(trainData)+1:end);%最终预测值
    figure(4)
    plot(1:length(trainData),trainData,'--','LineWidth',1)
    hold on
    plot(length(trainData)+1:length(trainData)+L,data_pre2,'--','LineWidth',1.5)
    hold on
    xlabel('time')
    ylabel('price')
    legend('真实值','预测值')
    ret_predict = data_pre2; % 返回值
end

代码实现(2)

输入一个 test测试真实值,检查预测值与真实值的相似度。文章来源地址https://www.toymoban.com/news/detail-681327.html

function [ret_predict] = mfunc_ARMA(trainData,testData)
    % ARMA预测
    % params: 
    %       trainData: 训练原始数据 Shape: (1,n)
    %       testData:  测试比较数据 Shape(1,L)
    % returns:
    %       predict:   预测的值 Shape:(1,L)

    % 判断时间序列数据是否平稳 1代表平稳,0代表不平稳
    is_stable = adftest(trainData);
    if is_stable == 1
        disp("时间序列数据平稳.");
    else
        disp("时间序列数据不平稳,正在进行差分处理!");
        diff_trainData = diff(trainData); % 进行差分处理
        disp("差分处理完成!");
    end
    % 利用自相关图和偏相关图判断模型类型和阶次
    figure(1)
    autocorr(diff_trainData) %绘制自相关函数 -> MA
    [ACF,Lags,Bounds]=autocorr(trainData);
    figure(2)
    parcorr(diff_trainData) %绘制偏相关函数 -> AR
    % 自相关和偏相关函数难以判断时可以用AIC准则求出最好阶数
    %确定阶数的上限
    lim=round(length(trainData)/10); %数据总长度的1/10
    if lim>=10
        lim=10;%如果数据太长了,就限定阶数
    end
    id_trainData=iddata(trainData');
    %
    saveData=[];
    for p=1:lim
        for q=1:lim
            num=armax(id_trainData,[p,q]);  %armax对应FPE最小
            AIC=aic(num);   %AIC可以衡量阶数好不好
            saveData=[saveData;p q AIC];   
            hotMatrix(p,q)=AIC;
        end
    end
    %AIC越小越好
    % 绘制阶数热力图
    figure(3)
    for i=1:lim
        y_index(1,i)={['AR' ,num2str(i)]};
        x_index(1,i)={['MA' ,num2str(i)]};
    end
    H = heatmap(x_index,y_index, hotMatrix, 'FontSize',12, 'FontName','宋体');
    H.Title = 'AIC定阶热力图'; 
    %AIC越小越好

    % 利用阶数得到模型
    min_index=find(saveData(:,3)==min(saveData(:,3)));
    p_best=saveData(min_index,1);  %p的最优阶数
    q_best=saveData(min_index,2);  %q的最优阶数

    model = armax(id_trainData,[p_best,q_best]);
    
    % 利用模型预测,对划分的测试集测试
    L=length(testData); 
    pre_data=[diff_trainData';zeros(L,1)];
    pre_data1=iddata(pre_data);  % 做成时间序列预测
    pre_data2=predict(model,pre_data1,L);

    pre_data3=get(pre_data2);%得到结构体
    pre_data4=pre_data3.OutputData{1,1}(length(diff_trainData)+1:length(diff_trainData)+L);%从结构体里面得到数据

    %显示全部
    data1=[diff_trainData';pre_data4];%全部的差分值
    if is_stable==0 %非平稳时进行差分还原
       data_pre1=cumsum([trainData(1);data1]);%还原差分值
    else
        data_pre1=data1;
    end

    % 最终预测
    data_pre2=data_pre1(length(trainData)+1:end);%最终预测值
    figure(4)
    subplot(2,1,1)
    plot(1:length(trainData),trainData,'--','LineWidth',1)
    hold on
    plot(length(trainData)+1:length(trainData)+L,testData,'--','LineWidth',1.5)
    hold on
    plot(length(trainData)+1:length(trainData)+L,data_pre2,'--','LineWidth',1.5)
    hold on
    xlabel('time')
    ylabel('price')
    legend('真实值','测试数据真实值','预测值')
    ret_predict = data_pre2; % 返回值

    wucha=sum(abs(data_pre2'-testData)./testData)./length(data_pre2);
    title_str=['ARMA法','  预测相对误差为:',num2str(wucha)];
    title(title_str)
    subplot(2,1,2)
    plot(1:L,testData,'--o','LineWidth',1.5)
    hold on
    plot(1:L,data_pre2,'--*','LineWidth',1.5)
    hold on
    xlabel('time')
    ylabel('price')
    legend('真实值','预测值')
    title_str=['ARMA法','  预测相对误差为:',num2str(wucha)];
    title(title_str)
end

到了这里,关于数学建模:ARMA时间序列预测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数学建模常用模型(六):时间序列预测

    时间序列预测是数学建模中的一个重要领域,用于预测时间序列数据中未来的趋势和模式。时间序列预测可以帮助我们了解数据的演变规律,做出合理的决策和规划。 这是我自己总结的一些代码和资料(本文中的代码以及参考书籍等),放在github上供大家参考: https://githu

    2024年02月13日
    浏览(31)
  • 【数学建模】《实战数学建模:例题与讲解》第十讲-时间序列预测(含Matlab代码)

    本系列侧重于例题实战与讲解,希望能够在例题中理解相应技巧。文章开头相关基础知识只是进行简单回顾,读者可以搭配课本或其他博客了解相应章节,然后进入本文例题实战,效果更佳。 如果这篇文章对你有帮助,欢迎点赞与收藏~ 时间序列预测是一种预测方法,它通过

    2024年02月03日
    浏览(37)
  • 数学建模--时间序列预测模型的七种经典算法的Python实现

    目录 1.开篇版权提示 2.时间序列介绍  3.项目数据处理 4.项目数据划分+可视化 5.时间预测序列经典算法1:朴素法 6.时间预测序列经典算法2: 简单平均法 7.时间预测序列经典算法3:移动平均法 8.时间预测序列经典算法4:简单指数法  9.时间预测序列经典算法5:Holt线性趋势法

    2024年02月10日
    浏览(30)
  • 【数学建模】--时间序列分析

    时间序列分析概念与时间序列分解模型 定义:时间序列也称动态序列,是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分,分别是描述过去,分线规律和预测未来,本讲将主要介绍时间序列分析中常用的三种模型:季节分解指数

    2024年02月13日
    浏览(33)
  • 数学建模--时间序列分析

    目录 1.时间序列 2.平稳时间序列 差分方程 滞后因子 时序平稳性  自回归模型AR(P) 滑动平均模型 MA(q) 自回归移动平均模型ARMA(p,q) 3.matlab时序分析 garchset函数 garchfit函数 4.案例分析         时间序列分析是一种数据分析方法,它研究的对象是代表某一现象的一串随时间

    2024年02月12日
    浏览(31)
  • 【数学建模】时间序列分析

    1.使用于具有时间、数值两种要素 2.数据具有周期性可以使用时间序列分解 叠加模型【Y=T+S+C+I】 序列的季节波动变化越来越大,反映变动之间的关系发生变化 乘积序列【Y=T S C*I】 时间序列波动保持恒定,可以使用叠加模型 数据预处理——开头结尾有缺失值,直接删掉即可

    2024年02月15日
    浏览(31)
  • 数学建模:14 时间序列

    目录 步骤 基本概念 时间序列分解 叠加 / 乘积模型 使用SPSS的实例 步骤 指数平滑模型 Simple模型 线性趋势模型 布朗线性趋势模型 阻尼趋势模型 简单季节性 温特加法模型 温特乘法模型 一元时间序列分析的模型 基础概念 平稳时间序列、白噪声序列 差分方程及其特征方程 滞

    2024年02月09日
    浏览(23)
  • 数学建模学习笔记(15)时间序列分析

    时间序列的概念 :也称为动态序列,是指将某种现象的指标值按照时间顺序排列而成的数值序列。 时间序列的组成要素 :时间要素、数值要素。 时间序列的分类 : 时期时间序列 :数值要素反应现象在一定时期内的发展的结果; 时点时间序列 :数值要素反映现象在一定时

    2024年02月01日
    浏览(25)
  • 数学建模day15-时间序列分析

            时间序列也称动态序列,是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分,分别是 描述过去、分析规律和预测未来 ,本讲将主要介绍时间序列分析中常用的三种模型: 季节分解、指数平滑方法和ARIMA模型 ,并将结

    2024年01月19日
    浏览(27)
  • 数学建模——确定性时间序列分析方法

    目录 介绍 确定性时间序列分析方法 1、时间序列的常见趋势 (1)长期趋势 (2)季节变动 (3)循环变动 (4)不规则变动 常见的时间序列模型有以下几类 2、时间序列预测的具体方法 2.1 移动平均法 案例1 【符号说明】  【预测模型】 2.2 一次指数平滑预测法 (1)预测模型

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包