学习笔记-ARIMA模型

ARIMA模型是基于时间序列的预测模型,也叫做差分整合移动平均自回归模型,又称整合移动平均自回归模型,时间序列预测分析方法之一。ARIMA(p,d,q)中,AR"自回归"p为自回归项数;MA"滑动平均"q为滑动平均项数,d为使之成为平稳序列所做的差分次数(阶数) 将预测对象随时间推移而形成的数据序列视为一个随机序列,用一定的数学模型来近似描述这个序列。这个模型一旦被识别后就可以从时间序列的过去值及现在值来预测未来值。符合问题二中利用数字经济板块指数中成交量的预测。

ARIMA模型定义

具有如下结构的模型称为差分整合移动平均自回归模型,简记为ARIMA(p,d,q)模型:

1-z=1pϕi1-LdXt=1+0=1qθiLiεt#3

其中L是滞后算子(Lag operator)

ARIMA模型含有三个参数:p,d,q

p--代表预测模型中采用的时序数据本身的滞后数(lags)

d--代表时序数据需要进行几阶差分化,才是稳定的

q--代表预测模型中采用的预测误差的滞后数(lags)

通常在时间序列分析中,采用自相关函数(ACF)、偏自相关函数(PACF)来判别ARIMA(p,d,q)模型的系数和阶数。自相关函数(ACF)描述时间序列观测值与其过去的观测值之间的线性相关性。偏自相关函数(PACF)描述在给定中间观测值的条件下时间序列观测值与其过去的观测值之间的线性相关性。若平稳序列的偏相关函数是截尾的,而自相关函数是拖尾的,可断定序列适合AR模型;若平稳序列的偏相关函数是拖尾的,而自相关函数是截尾的,则可断定序列适合MA模型;若平稳序列的偏相关函数和自相关函数均是拖尾的,则序列适合ARMA模型。

ARIMA建模流程以及流程图如图所示:

 

(1) 获得数据

(2) 判断序列的平稳性

(3) 对序列进行差分平稳化处理

(4) 对平稳的一阶差分序列进行白噪声检验

(5) 拟合与预测

(6) 结果分析

 学习笔记-ARIMA模型_第1张图片

案例:华中杯2021年量化投资问题成交量及收盘价预测

 代码实现:

%% 数据导入及预处理
Data=xlsread('训练集-成交量');
Y=Data';
data=Y(1:6240);

plot(Y) %原始数据图

figure %未差分时ACF和PACF图
autocorr(Y)
figure
parcorr(Y)
%% 差分及平滑性检验
y_h_adf = adftest(Y);
y_h_kpss = kpsstest(Y); %平滑性检验,yd1_h_adf =1,yd1_h_kpss =0,通过检验

Yd1 = diff(Y); %一阶差分
figure
plot(Yd1) %差分结果作图

yd1_h_adf = adftest(Yd1); % 一阶差分,如果依旧不平稳的话,再次求差分,直至通过检验
yd1_h_kpss = kpsstest(Yd1);
Yd1=Yd1';
Y=Y'; %Yd2转换成列向量

%% 模型参数选择
LOGL = zeros(4,4); % Initialize
PQ = zeros(4,4);
for p = 1:4
    for q = 1:4
        Mdl = arima(p,1,q);
        [~,~,logL] = estimate(Mdl,Yd1,'Display','off');
        LOGL(p,q) = logL;
        PQ(p,q) = p + q;
     end
end

LOGL = reshape(LOGL,16,1);
PQ = reshape(PQ,16,1);
[~,bic] = aicbic(LOGL,PQ+1,100);

a=reshape(bic,4,4); %reshape 重构数组

a_max=max(a(:));
[x,y]=find(a==min(a(:)));%找最佳lags值 x=2,y=1,即对应ARMA(2,1)模型

Mdl = arima(x, 1, y);  %第二个变量值为1,即一阶差分
EstMdl = estimate(Mdl,Y);
[res,~,logL] = infer(EstMdl,Y);   %res即残差

stdr = res/sqrt(EstMdl.Variance);
%% 残差检验相关图片
figure
histogram(stdr,10)
figure
autocorr(stdr)
figure
parcorr(stdr)
figure
qqplot(stdr)

diffRes0 = diff(res);  
SSE0 = res'*res;
DW0 = (diffRes0'*diffRes0)/SSE0 % Durbin-Watson statistic,该值接近2,则可以认为序列不存在一阶相关性。

%% 预测
step = 1; %预测步数为1
forData=zeros(1,6240);
for i=5328:6240
EstMdl = estimate(Mdl,Y(1:i));
[forData(i+1),YMSE] = forecast(EstMdl,step,'Y0',Y(1:i));   
lower = forData(i+1) - 1.96*sqrt(YMSE); %95置信区间下限
upper = forData(i+1) + 1.96*sqrt(YMSE); %95置信区间上限
end

%% 预测结果与原始数据对比
figure()
plot(5329:6240,Y(5329:6240))
hold on
plot(5329:6240,forData(5329:6240))
legend('原始数据','预测数据')

%% 优度函数计算,均方根百分比误差
RMSPE = sqrt(sum((format(1:end,1)-Data(1:end,1)).^2)/sum(Data(1:end,1)).^2); 

你可能感兴趣的:(机器学习,人工智能)