数学建模中的ARMA模型和ARIMA模型的使用实例(含代码)

原文地址:


对于较少时间段的时间预测,因为数据量较少,所以直接使用神经网络是不现实的,这里用的比较多的是时间序列模型预测和灰色预测,这里介绍一下时间序列中ARMA模型和ARIMA模型使用的实际例子


提供的一种误差检验:

算法流程图:

python arima模型 风险预测 arima模型预测实例_预测


1. 原始数据

python arima模型 风险预测 arima模型预测实例_预测_02

这里是前九天的数据流量,一共有216个记录点

2. 寻找平稳时间序列

这里使用的是消除季节性和消除趋势以达到平稳时间序列的目的:

这里是实现差分后的图的表示:

python arima模型 风险预测 arima模型预测实例_python arima模型 风险预测_03

这里我们使用的是消除季节性之后再消除趋势之后的图像作为输入的平稳时间序列

这里不是用Matlab中金融工具箱中的平稳性检验的函数,给大家推荐一个可以直接使用的平稳性函数的检验adftest 检验序列得到的结果是1可以证明是平稳时间序列。

3. 选定差分序列之后定阶层

这里确定了ARMA模型的输入的平稳时间序列之后选择定阶层。
这里直接使用双重for循环来找合适的阶层

这里选择查看不同的aic和bic来确定

当然可以使用自相关图偏自相关图进行判断和检验
这里有Matlab自带的函数:

python arima模型 风险预测 arima模型预测实例_python arima模型 风险预测_04

4. 使用得到的ARMA模型之后反推ARIMA模型的参数估计

最后结果预测一天的示意图:

python arima模型 风险预测 arima模型预测实例_数据_05

和之前的数据做比较之后,可以看到实验的预测结果是拟合较好的


- 代码示例:

实现最佳阶层的选择:

s = 24; %周期是24
x = xixi';%初始数据的录入
n = 24; %预报的个数
m1 = length(x); %原始的数据的个数
for i = s+1:m1;
    y(i-s) = x(i) - x(i-s);%进行周期差分变换
end
w = diff(y); %消除趋势性的差分运算
m2 = length(2);
for i = 0:6
    for j = 0:6
        if i == 0 & j == 0
            continue
        elseif i == 0
            ToEstMd = arima('MALags',1:j,'Constant',0); %指定模型的结构
        elseif j == 0
            ToEstMd = arima('ARLags',1:i,'Constant',0); %指定模型的结构
        else
            ToEstMd = arima('ARLags',1:i,'MALags',1:j,'Constant',0); %指定模型的结构
        end
        k = k + 1;
        R(k) = i;
        M(k) = j;
        [EstMd,EstParamCov,LogL,info] = estimate(ToEstMd,w');%模型拟合
        numParams = sum(any(EstParamCov));%计算拟合参数的个数
        [aic(k),bic(k)] = aicbic(LogL,numParams,m2);
    end
end
fprintf('R,M,AIC,BIC的对应值如下\n%f');%显示计算结果
check  = [R',M',aic',bic']

开始用选定的阶层进行预测(p = 5 q = 2):

x = xixi';

ToEstMd = arima('ARLags',1:5,'MALags',1:2,'Constant',0);%指定模型的结构
[EstMd,EstParamCov,LogL,info] = estimate(ToEstMd,w');%模型拟合 
w_Forecast = forecast(EstMd,n,'Y0',w');
yhat = y(end) + cumsum(w_Forecast); %一阶差分的还原值
for j = 1:n
    x(m1 + j) = yhat(j) + x(m1+j-s); %x的预测值
end
x(m1+1:end)