【Matlab】时间序列模型(ARIMA)

2024-08-28 04:04

本文主要是介绍【Matlab】时间序列模型(ARIMA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、示例
  • 二、代码实现----Matlab
    • 全部数据的平稳性检验
      • ADF检验
      • 图检验法
    • 划分训练集
      • 平稳性检验
      • 确定 p,q
      • 结果分析和模型检验
      • 模型预测


前言

接上一篇博客,用 Matlab 完成代码编写。
【学习笔记】时间序列模型(ARIMA)

一、示例

  • 已知一个上市公司一段时期的开盘价,最高价,最低价,收盘价等信息,要求建立模型,预测股价。
  • 这里只需要股票的收盘价(close),我们可以把数据提取出来,并划分为训练集和测试集
  • 本题我们把1-3月份的数据作为训练集,4-6月份的数据作为测试集

二、代码实现----Matlab

全部数据的平稳性检验

%% 数据读取
% 读取 CSV 文件
filename = 'ChinaBank.csv';
data = readtable(filename);% 读取文件中的两列
close_data = data.Close;
date_data = data.Date;% 一阶差分
close_dif1 = diff(close_data);
% 二阶差分
close_dif2 = diff(close_data, 2);% 创建一个新的图形窗口并设置其大小
figure('Position', [100, 100, 1200, 1000]); subplot(3, 1, 1);
plot(date_data,close_data); 
title('原始数据');
xlabel('日期');
ylabel('收盘价');% 绘制一阶差分数据
subplot(3, 1, 2);
plot(date_data(2:end), close_dif1);
title('一阶差分');
xlabel('日期');
ylabel('差分值');% 绘制二阶差分数据
subplot(3, 1, 3);
plot(date_data(3:end), close_dif2);
title('二阶差分');
xlabel('日期');
ylabel('差分值');

运行结果:

在这里插入图片描述

结果分析:

可以看出,一阶差分和二阶差分后,平稳性变好。

ADF检验

Matlab 的 adftest 函数

[h, pValue, stat, cValue] = adftest(y);

返回值解释

  1. h:检验结果

    h 是一个逻辑值,表示检验结果:

    • 1:拒绝原假设(即,时间序列是平稳的)。
    • 0:无法拒绝原假设(即,时间序列可能存在单位根或是非平稳的)。
  2. pValue:p 值

    pValue 是一个实数,表示检验统计量的 p 值。p 值越小,拒绝原假设的证据越强。通常,如果 p 值小于某个显著性水平(如 0.05),则拒绝原假设。

  3. stat:检验统计量

    stat 是一个实数,表示 ADF 检验的统计量。这个值用于与临界值进行比较,以决定是否拒绝原假设。

  4. cValue:临界值

    cValue 是一个向量,包含不同显著性水平(如 1%、5%、10%)下的临界值。用于与统计量 stat 进行比较。

Matlab 代码

% 进行ADF检验
[h, pValue, stat, cValue] = adftest(close_data);% 显示结果
disp(['ADF 检验结果: ', num2str(h),' ','p 值: ', num2str(pValue),' ','统计量: ', num2str(stat),' ','临界值: ', mat2str(cValue)]);

运行结果:

在这里插入图片描述

结果分析:

  • ADF 检验结果为 0,则无法拒绝原假设,表示时间序列可能是非平稳的。
  • p 值为 0.96618,大于 0.05,无法拒绝原假设。
  • 统计量为 1.485,大于临界值 -1.9416,无法拒绝原假设。

图检验法

  1. 原始数据
% 计算并绘制自相关函数(ACF)
figure('Position', [100, 100, 1200, 700]); 
subplot(2, 1, 1);
autocorr(close_data, 20);
title('自相关函数(ACF)');% 计算并绘制偏自相关函数(PACF)
subplot(2, 1, 2);
parcorr(close_data, 20);
title('偏自相关函数(PACF)');

运行结果:

在这里插入图片描述
结果分析:

ACF中,大部分的值没有落在置信区间内,所以不具有平稳性。

  1. 一次差分
% 计算并绘制自相关函数(ACF)
figure('Position', [100, 100, 1200, 700]); 
subplot(2, 1, 1);
autocorr(close_dif1, 20);
title('自相关函数(ACF)');% 计算并绘制偏自相关函数(PACF)
subplot(2, 1, 2);
parcorr(close_dif1, 20);
title('偏自相关函数(PACF)');

运行结果:

在这里插入图片描述
结果分析:

由图形可以看出,大部分的值都落在了置信区间内。

划分训练集

train = close_data(1:62);
test = close_data(63:127);

平稳性检验

ADF检验

  1. 原训练集
% 进行ADF检验
[h, pValue, stat, cValue, reg] = adftest(train);% 显示结果
disp(['ADF 检验结果: ', num2str(h),' ','p 值: ', num2str(pValue),' ','统计量: ', num2str(stat),' ','临界值: ', mat2str(cValue)]);

运行结果:

在这里插入图片描述
平稳性并不理想,所以考虑一次差分。(和python运行出来的结果不一致,此处存疑

  1. 训练集进行一次差分
train_dif1 = diff(train);
% 进行ADF检验
[h, pValue, stat, cValue, reg] = adftest(train_dif1);% 显示结果
disp(['ADF 检验结果: ', num2str(h),' ','p 值: ', num2str(pValue),' ','统计量: ', num2str(stat),' ','临界值: ', mat2str(cValue)]);

运行结果:
在这里插入图片描述
通过平稳性检验。

图检验法

  1. 原训练集
% 计算并绘制自相关函数(ACF)
figure('Position', [100, 100, 1200, 700]); 
subplot(2, 1, 1);
autocorr(train, 20);
title('自相关函数(ACF)');% 计算并绘制偏自相关函数(PACF)
subplot(2, 1, 2);
parcorr(train, 20);
title('偏自相关函数(PACF)');

运行结果:

在这里插入图片描述

平稳性并不理想,所以考虑一次差分。(和python运行出来的结果不一致,此处存疑

  1. 训练集进行一次差分
% 计算并绘制自相关函数(ACF)
figure('Position', [100, 100, 1200, 700]); 
subplot(2, 1, 1);
autocorr(train_dif1, 20);
title('自相关函数(ACF)');% 计算并绘制偏自相关函数(PACF)
subplot(2, 1, 2);
parcorr(train_dif1, 20);
title('偏自相关函数(PACF)');

运行结果:
在这里插入图片描述

通过平稳性检验。

确定 p,q

1. 相关函数法

由训练集一次差分后的 ACF 和 PACF 图可以看出,呈现不规则衰减,p 、q的值难以直接判断。

2. AIC、BIC准则

% 定义候选模型阶数范围
maxP = 8;
maxQ = 8;
n = length(train);% 初始化结果存储
aicValues = NaN(maxP, maxQ);
bicValues = NaN(maxP, maxQ);% 迭代计算所有候选模型的AIC和BIC值
for p = 0:maxPfor q = 0:maxQtryMdl = arima(p,1,q);[~,~,logL] = estimate(Mdl, train, 'Display', 'off');numParam = p + q + 1; % p个AR参数, q个MA参数, 1个差分项[aicValues(p+1, q+1),bicValues(p+1, q+1)] = aicbic(logL, numParam, n);catch% 忽略无法估计的模型continue;endend
end% 找到AIC最小值对应的(p, q)
[minAIC, idxAIC] = min(aicValues(:));
[pAIC, qAIC] = ind2sub(size(aicValues), idxAIC);
pAIC = pAIC - 1;
qAIC = qAIC - 1;% 找到BIC最小值对应的(p, q)
[minBIC, idxBIC] = min(bicValues(:));
[pBIC, qBIC] = ind2sub(size(bicValues), idxBIC);
pBIC = pBIC - 1;
qBIC = qBIC - 1;fprintf('AIC选择的模型阶数: p = %d, q = %d\n', pAIC, qAIC);
fprintf('BIC选择的模型阶数: p = %d, q = %d\n', pBIC, qBIC);

运行结果:

在这里插入图片描述
在这里插入图片描述
姑且先选择 AIC 准则的结果:p = 7,q = 6。此处存疑

结果分析和模型检验

残差序列的随机性可以通过自相关函数法来检验,即做残差的自相关函数图

model = arima(7,1,6);
md1 = estimate(model, train, 'Display', 'off');% 检查残差的自相关性
residuals = infer(md1, train);
figure;
autocorr(residuals);
title('Residuals Autocorrelation');

运行结果:

在这里插入图片描述

结果分析:从 ACF 图中可以看出残差之间独立性比较高。

模型预测

numPeriods = length(test);
[Y, YMSE] = forecast(md1, numPeriods, 'Y0', train);origin_close = close_data(1:127);
origin_date = date_data(1:127);
% 绘制预测结果与真实值的比较
figure('Position', [100, 100, 1200, 700]); 
plot(origin_date,origin_close, test_date, Y);
legend('真实值','预测值');
title('ARIMA 模型预测结果');
xlabel('时间');
ylabel('值');

运行结果:

在这里插入图片描述
向后预测了三个月的数据。

这篇关于【Matlab】时间序列模型(ARIMA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113669

相关文章

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验