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

news2024/11/15 20:04:08

文章目录

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


前言

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

一、示例

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

二、代码实现----python

全部数据的平稳性检验

# 差分法
import pandas as pd
import matplotlib.pyplot as plt

# 导入数据
ChinaBank = pd.read_csv('ChinaBank.csv',index_col = 'Date',parse_dates=['Date'])
#.diff(1)做一个时间间隔
ChinaBank['diff_1'] = ChinaBank['Close'].diff(1) #1阶差分

#对一阶差分数据在划分时间间隔
ChinaBank['diff_2'] = ChinaBank['diff_1'].diff(1) #2阶差分

fig = plt.figure(figsize=(12,10))
#原数据
ax1 = fig.add_subplot(311)
ax1.plot(ChinaBank['Close'])
#1阶差分
ax2 = fig.add_subplot(312)
ax2.plot(ChinaBank['diff_1'])
#2阶差分
ax3 = fig.add_subplot(313)
ax3.plot(ChinaBank['diff_2'])
plt.show()

运行结果:

在这里插入图片描述

结果分析:

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

ADF检验

import matplotlib.pyplot as plt
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.stattools import adfuller as ADF

# 计算原始序列、一阶差分序列、二阶差分序列的单位根检验结果
ChinaBank['diff_1'] = ChinaBank['diff_1'].fillna(0)
ChinaBank['diff_2'] = ChinaBank['diff_2'].fillna(0)

timeseries_adf = ADF(ChinaBank['Close'].tolist())
timeseries_diff1_adf = ADF(ChinaBank['diff_1'].tolist())
timeseries_diff2_adf = ADF(ChinaBank['diff_2'].tolist())


# 打印单位根检验结果
print('timeseries_adf : ', timeseries_adf)
print('timeseries_diff1_adf : ', timeseries_diff1_adf)
print('timeseries_diff2_adf : ', timeseries_diff2_adf)

运行结果:

timeseries_adf :  (np.float64(0.5279198084831831), np.float64(0.9856974415734416), 9, 335, {'1%': np.float64(-3.4500219858626227), '5%': np.float64(-2.870206553997666), '10%': np.float64(-2.571387268879483)}, np.float64(-734.0738716811488))
timeseries_diff1_adf :  (np.float64(-6.17718554497899), np.float64(6.587109239761689e-08), 8, 336, {'1%': np.float64(-3.449962981927952), '5%': np.float64(-2.870180642420163), '10%': np.float64(-2.5713734527352607)}, np.float64(-735.8436797171294))
timeseries_diff2_adf :  (np.float64(-9.202545123160359), np.float64(1.9841232339614826e-15), 13, 331, {'1%': np.float64(-3.4502615951739393), '5%': np.float64(-2.8703117734117742), '10%': np.float64(-2.5714433728242714)}, np.float64(-717.2833732193096))

结果分析:

A D F ADF ADF检验的结果共有五个参数:

  • 第一个值:表示 Test Statistic,即 T 检验,表示 T 统计量,假设检验值
  • 第二个值:p-value,即 p 值,表示 T 统计量对应的概率值
  • 第三/四个值:Lags Used,即表示延迟和测试的次数
  • 第五个参数{‘1%’: xxx, ‘5%’: xxx, ‘10%’: xxx}:不同程度拒绝原假设的统计值

如何确定该序列是否平稳呢?

  • 1%、5%、10%不同程度拒绝原假设的统计值和 ADF 假设检验值比较,ADF 假设检验值同时小于1%、5%、10%即说明非常好地拒绝该假设
  • P-value 是否非常接近 0

图检验法

  1. 原始数据
fig = plt.figure(figsize=(12,7))

ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(ChinaBank['Close'], lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom') # 设置坐标轴上的数字显示的位置,top:显示在顶部  bottom:显示在底部

ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(ChinaBank['Close'], lags=20, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')

plt.show()

运行结果:

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

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

  1. 一次差分
fig = plt.figure(figsize=(12,7))

ax3 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(ChinaBank['diff_1'], lags=20, ax=ax3)
ax3.xaxis.set_ticks_position('bottom')

ax4 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(ChinaBank['diff_1'], lags=20, ax=ax4)
ax4.xaxis.set_ticks_position('bottom')

运行结果:

在这里插入图片描述

结果分析:

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

划分训练集

# 提取Close列
ChinaBank.index = pd.to_datetime(ChinaBank.index)
sub = ChinaBank.loc['2014-01':'2014-06','Close']

sub.head()

# 划分训练测试集
train = sub.loc['2014-01':'2014-03']
test = sub.loc['2014-04':'2014-06']

平稳性检验

ADF检验

# ADF检验

from statsmodels.tsa.stattools import adfuller as ADF

timeseries_adf = ADF(train.tolist())

# 打印单位根检验结果
print('timeseries_adf : ', timeseries_adf)

运行结果:

timeseries_adf :  (np.float64(-2.902677813259885), np.float64(0.04503748919120268), 0, 61, {'1%': np.float64(-3.542412746661615), '5%': np.float64(-2.910236235808284), '10%': np.float64(-2.5927445767266866)}, np.float64(-227.51423828600673))

图检验法

import statsmodels.api as sm

# 绘制
fig = plt.figure(figsize=(12,7))

ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(train, lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom') # 设置坐标轴上的数字显示的位置,top:显示在顶部  bottom:显示在底部

ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(train, lags=20, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')

plt.show()

运行结果:

在这里插入图片描述

确定 p,q

1. 相关函数法

由训练集的 ACF 和 PACF 图可以看出,ACF拖尾、PACF截尾,所以是AR(1)。

2. AIC、BIC准则

以 BIC 准则为例,确定 p,q 的取值范围为 [0,5],通过循环网格搜索所有组合的 BIC 的值

#遍历,寻找适宜的参数
import itertools
import numpy as np
import seaborn as sns

#确定pq的取值范围
p_min = 0
d_min = 0
q_min = 0
p_max = 5
d_max = 0
q_max = 5

#Initialize a DataFrame to store the results,,以BIC准则
results_bic = pd.DataFrame(index=['AR{}'.format(i) for i in range(p_min,p_max+1)],
                           columns=['MA{}'.format(i) for i in range(q_min,q_max+1)])

for p,d,q in itertools.product(range(p_min,p_max+1),
                               range(d_min,d_max+1),
                               range(q_min,q_max+1)):
    if p==0 and d==0 and q==0:
        results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = np.nan
        continue
    try:
        model = sm.tsa.ARIMA(train, order=(p, d, q))
        results = model.fit()
        results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = results.bic
    except:
        continue

results_bic

运行结果:

在这里插入图片描述

绘制热力图:

#得到结果后进行浮点型转换
results_bic = results_bic[results_bic.columns].astype(float)

#绘制热力图
fig, ax = plt.subplots(figsize=(10, 8))
ax = sns.heatmap(results_bic,
                 mask=results_bic.isnull(),
                 ax=ax,
                 annot=True,
                 fmt='.2f',
                 cmap="Purples"
                 )

ax.set_title('BIC')
plt.show()

results_bic.stack().idxmin()

运行结果:

在这里插入图片描述
在这里插入图片描述

结果分析和模型检验

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

# 模型检验

#根据以上求得
p = 1
d = 0
q = 0

model = sm.tsa.ARIMA(train, order=(p,d,q))
results = model.fit()
resid = results.resid #获取残差

#绘制
#查看测试集的时间序列与数据(只包含测试集)
fig, ax = plt.subplots(figsize=(12, 5))

ax = sm.graphics.tsa.plot_acf(resid, lags=40,ax=ax)

plt.show()

运行结果:
在这里插入图片描述
结果分析:从 ACF 图中可以看出残差之间独立性比较高。

模型预测

# 模型预测
predict_sunspots = results.predict(dynamic=False)
print(predict_sunspots)

#查看测试集的时间序列与数据(只包含测试集)
plt.figure(figsize=(12,6))
plt.plot(train)
plt.xticks(rotation=45) #旋转45度
plt.plot(predict_sunspots)
plt.show()

#绘图
fig, ax = plt.subplots(figsize=(12, 6))
ax = sub.plot(ax=ax)
#预测数据
predict_sunspots.plot(ax=ax)
plt.show()

运行结果:

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

该模型拟合效果较好,并向后预测了三个月的股票价格波动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode 数组+哈希+双指针+子串+滑动窗口

——————双指针 283. 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] …

AI大模型日报#0820:DeepMind创始人访谈、阿里多模态mPLUG-Owl3、抱抱脸SOTA小模型

导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE-4.0-8K-latest)、“智谱AI”(glm-4-0520)生成了今日要点以及每条资讯的摘要。欢迎阅…

linux文件——文件系统——学习硬件:磁盘

前言:本节将带领友友们认识计算机外设中的——磁盘。 目的是为后面学习文件系统打好基础。认识磁盘我们将从——磁盘的组成、磁盘的逻辑结构两个方面进行讲解。 下面开始我们的学习吧。 ps:本节适合所有阶段的友友们学习哦, 友友们可以在本篇…

推荐几款论文初稿ai工具,一键生成!

开题报告-科研加速秘籍:AI论文写作工具推荐! 在科研的世界里,论文写作是不可或缺的一部分。 然而,很多时候我们在开题报告的编写上就遇到了巨大的挑战。 别担心,今天我要分享这个工具来帮助你轻松应对这个问题。 通过…

(java)动态代理

1.思想分析 不能修改原有的代码: 代理:相当于中介公司 代理:转移职责 代理:做准备工作 调用对象中的方法 代理:通过接口--接口中的方法就是要代理的方法

JVM类加载机制—类加载器和双亲委派机制详解

一、概述 上篇我们介绍了JVM类加载机制—JVM类加载过程,类加载过程是类加载机制第一阶段,这一阶段主要做将类的字节码(class文件)加载JVM内存模型中,并转换为JVM内部的数据结构(如java.lang.Class实例&…

Java常用工具类之Date类和Calender类

1、 Date类中常用方法 1. Date类的常用方法 Date类的常用方法 方法 含义 new Date() 实例化Date对象,常见于获得系统当前时间 new Date(long time) 实例化Date对象,并根据具体的时间偏移量time设置时…

C语言 | Leetcode C语言题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; int getSum(int a, int b){ int c; while(b) {c(unsigned int)(a&b)<<1;a^b;bc; }return a; }

静态网页的制作步骤

静态网页是由HTML、CSS和JavaScript等前端技术构建而成的&#xff0c;它们通常用于展示静态内容&#xff0c;不涉及动态数据的处理。制作静态网页的过程涉及多个步骤&#xff0c;包括规划、设计、编码和测试等。下面是一个详细的制作静态网页的步骤&#xff0c;希望对你有帮助。…

Apache Flink内存模型

Flink 内存模型 大数据中所有开源的框架都会使用到JVM&#xff0c;不如&#xff0c;MapReduce&#xff0c;Storm&#xff0c;Spark等&#xff0c;这些计算框架处理数据过程中涉及到将大量数据存储到内存中&#xff0c;此时如果内存管理过渡依赖JVM&#xff0c;会出现java对象存…

国产GD32单片机开发入门(二)GD32单片机详解

文章目录 一.概要二.单片机型号命名规则三.GD32F103系统架构四.GD32F103C8T6单片机启动流程五.GD32F103C8T6单片机主要外设资源六.单片机开发过程中查看芯片数据手册的必要性1.单片机外设资源情况2.GD32单片机内部框图3.GD32单片机管脚图4.GD32单片机每个管脚功能5.单片机功耗数…

Mybatis--其他查询操作和数据库连接池(下下)

序 准备工作&#xff1a; mysql数据库和表的信息更新&#xff1a; DROP TABLE IF EXISTS articleinfo;CREATE TABLE articleinfo (id INT PRIMARY KEY auto_increment,title VARCHAR ( 100 ) NOT NULL,content TEXT NOT NULL,uid INT NOT NULL,delete_flag TINYINT ( 4 ) DEF…

24 messagebox 组件

messagebox 组件使用指南 Tkinter messagebox 组件用于创建弹出式消息框&#xff0c;以显示信息、警告、错误或询问用户问题。它提供了一种简单的方法来向用户展示消息&#xff0c;并等待用户响应。以下是对 messagebox 组件的详细说明和一个使用案例。 messagebox 组件方法 …

数学基础(十)

一、层次聚类 层次聚类是聚类算法的一种&#xff0c;通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中&#xff0c;不同类别的原始数据点是树的最低层&#xff0c;树的顶层是一个聚类的根节点。 常见聚类树有自下而上合并和自上而下分裂两种方法 …

【计算机网络】mini HTTP服务器框架与代码

注注注&#xff1a;本篇博文都是代码实现细节&#xff0c;但不会进行演示&#xff0c;演示看孪生篇 另外&#xff0c;由于tcp套接字部分本质都是套路&#xff0c;所以就不再进行赘述。 目录 1 请求反序列化2 读取url文件内容3 构建响应 1 请求反序列化 我们肯定会先收到请求&…

VIVO社招入职SHL测评题库题型分析:动机问卷、性格问卷、归纳推理、数字推理、语言推理

VIVO社招入职SHL测评数字推理考什么&#xff1f;例题分析 VIVO社招入职SHL测评归纳推理考什么&#xff1f;例题分析

资产架构端口应用CDNWAF站库分离负载均衡

知识点&#xff1a; 1、资产架构-端口&目录&插件接口&多站点&多应用 2、番外安全-域名&服务器本身&服务厂商&管理人员 3、考虑阻碍-站库分离&CDN&WAF&负载均衡&主机防护 详细点&#xff1a; 1、前置条件-购买使用-云服务器&a…

【AI编程秘籍】Q-learning原理大揭秘!让AI学会自己做决策!

&#x1f31f;【AI编程秘籍】Q-learning原理大揭秘&#xff01;让AI学会自己做决策&#xff01;&#x1f680; Hey小伙伴们&#xff0c;今天要给大家带来的是一个非常酷炫的项目——深入浅出Q-learning原理&#xff01;无论你是编程新手还是AI老司机&#xff0c;都能从中收获满…

进阶-7.管理工具

管理工具 1.系统数据库2常用工具2.1 mysql2.2 mysqladmin2.3 mysqlbinlog2.4 mysqlshow2.5 mysqldump2.6mysqlimport /source 1.系统数据库 2常用工具 2.1 mysql C:\Users\Tracy>mysql -uroot -p123456 test -e "select * from student"; -------------------- |…

【小沐学Rust】Rust实现TCP网络通信

文章目录 1、简介2、安装2.1 安装Rust2.2 VsCode安装Rust插件 3、快速入门3.1 命令行构建3.2 Cargo构建3.3 Cargo添加依赖 4、基本语法4.1 main 的函数4.2 代码缩进4.3 todo! 宏4.4 println! 宏4.5 变量的使用4.6 元组4.7 结构4.8 枚举4.9 函数 5、TCP通信5.1 测试一5.1.1 TCP服…