Python3实现基于ARIMA模型来预测茅台股票价格趋势

news2024/11/19 2:20:25

3f6a7ab0347a4af1a75e6ebadee63fc1.gif

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


52a179bf4e4d419089996afed5be5c09.png

目录

ARIMA模型简介

实战案例

加载数据

 数据预处理

差分并确定参数d

做出ACF、PACF图确定参数q和p

训练模型并预测

模型效果评估


 

ARIMA模型简介

        ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。

        ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。

具体来说,ARIMA模型可以通过以下步骤进行建模:

  1. 数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

  2. 模型选择:根据样本自相关图(ACF)和偏自相关图(PACF)选择合适的p、d、q值。

  3. 参数估计:使用极大似然估计或最小二乘法对模型参数进行估计。

  4. 模型检验:对模型的残差进行自相关性和正态性检验,如果不符合要求则需要重新选择模型或调整参数。

  5. 模型预测:根据已有数据和已经估计好的参数进行未来数据的预测。

ARIMA模型在金融、经济、气象、交通等领域都有广泛应用,特别是在金融领域,ARIMA模型可以用于股票价格、汇率、利率等方面的预测。

ARIMA(p,d,q)阶数确定

模型ACFPACF
AR(p)衰减趋于零(几何型或震荡型)p阶后截尾
MA(q)q阶后截尾衰减趋于零(几何型或震荡型)
ARMA(p,q)q阶后衰减趋于零(几何型或震荡型)p阶后衰减趋于零(几何型或震荡型)

截尾:落在置信区间内(95%的点都符合该规则)

实战案例

本次案例使用的数据集是2016年到2023-5-8日茅台股票数据,旨在预测未来数十天的股票趋势。

加载数据

首先导入本次实验用到的第三方库和股票数据集

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import statsmodels.api as sm
import warnings
warnings.filterwarnings('ignore')
sns.set(font='SimHei')
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示

# 股票数据的路径
stock_file = 'maotai_stock.csv'
# 导入数据集并将其转换为时间序列
df = pd.read_csv(stock_file, index_col='date', parse_dates=True)
df

70ba457bfaab47e4b46983d074a48964.png

 数据预处理

由于我们要分析预测的是收盘价,所以我们取出收盘价的数据并进行重采样,以周且指定周一为单位求平均值。然后指定2016-1月到2023-4月的数据作为训练数据。最后将训练数据进行可视化展示。

# 重点分析收盘价并预测,对原始数据进行重采样,以周且指定周一为单位求平均值
stock_week = df['close'].resample('W-MON').mean()
# 取出2016-1月到2023-4月的数据作为训练数据
stock_train = stock_week['2016-1':'2023-4']
# 做出折线图
stock_train.plot(figsize=(15,6))
plt.legend()
plt.title('Stock Close')
sns.despine()

d66d7524bbd64fc2bd151177520bce22.png

差分并确定参数d

这里我们对数据进行拆分的目的是保证数据的平稳性,因为通过上图我们发现原始数据波动的幅度很大,需要进行拆分操作。这里我们对数据先进行一阶拆分和二阶拆分并可视化展示。

# 将时间序列进行差分并确定参数d
# 一阶差分
stock_diff_1 = stock_train.diff()
stock_diff_1.dropna(inplace=True)
# 二阶差分
stock_diff_2 = stock_diff_1.diff()
stock_diff_2.dropna(inplace=True)

plt.figure(figsize=(12,6))
plt.subplot(2,1,1)
plt.plot(stock_diff_1)
plt.title('一阶差分')
plt.subplot(2,1,2)
plt.plot(stock_diff_2)
plt.title('二阶差分')
plt.show()

b89e496095574b009ad3a52cbbcf0ab9.png

 通过上图我们发现,一阶差分就已经由稳定的趋势了,到了二阶波动的幅度反而更大,所以这里我们直接确定参数d为1。

除了上面的方法,我们还可以使用下面的代码确定参数d:

# 将时间序列进行差分,直到其成为平稳序列
ts = df['close']
d = 0
while not sm.tsa.stattools.adfuller(ts)[1] < 0.05:
    ts = ts.diff().dropna()
    d += 1
print('参数d为:',d)

54f4525981854ebc8522ef350e00c444.png

 得出的结果也是1,跟上面的方法一样。

做出ACF、PACF图确定参数q和p

# 做出ACF图确定参数q
sm.graphics.tsa.plot_acf(stock_diff_1)
plt.title('ACF')
plt.show()

 3e134894c0ae4ee39dac03a2b27c261e.png

# 做出PACF图并确定参数p
sm.graphics.tsa.plot_pacf(stock_diff_1)
plt.title('PACF')
plt.show()

8f568e85f9b64c019c47c1c3f2246e64.png

通过观察上面两个图,我们可以确定参数 p和q都为1是最佳的。

除了观察图形,我们也可以使用下面代码进行确定参数p/q:

# 根据AIC和BIC的值来确定参数
train_result = sm.tsa.arma_order_select_ic(stock_train,ic=['aic','bic'],trend='c',max_ar=4,max_ma=4)
print('AIC',train_result.aic_min_order)
print('BIC',train_result.bic_min_order)

c3fd19227a48403f943fe3b7ffa2f84f.png

 这里如果BIC和AIC的值不一样,你两个结果都试试,看看哪个参数组合训练的模型效果最好。这里AIC和BIC的结果都是(1,1),说明p=q=1是最佳的参数结果。

训练模型并预测

 这里的order(p,d,q),将前面确定数值填进去即可,freq是为了和前面重采样保持一致。

# 拟合ARIMA模型
model = sm.tsa.ARIMA(stock_train, order=(1, 1, 1),freq='W-MON')
result = model.fit()

预测的时候需要填写起始时间和终止时间,注意起始时间必须在训练数据中出现

# 使用该模型进行预测
forecast = result.predict(start='2022-01-10', end='2023-6-01')
forecast

9074a70aca834967b201dca501fcba18.png

 我们将预测的结果和真实值可视化出来:

plt.figure(figsize=(12,6))
plt.xticks(rotation=45)
plt.plot(forecast,label='预测值')
plt.plot(stock_train,label='真实值')
plt.legend()
plt.show()

ce4a262545764b99af928827280e327b.png

 可以发现模型拟合的还不错,基本上与原趋势保持一致。

模型效果评估

这里我们直接调用plot_diagnostics()方法将模型的评估结果可视化展示

# 残差分析、正态分布、QQ图、相关系数
result.plot_diagnostics(figsize=(16,12))
plt.show()

3ee1cb469956435bb6e8e26452feafaa.png

上左是残差分析图,可以发现模型残差为零。

上右是直方图和正太分布图,可以发现模型是近似于正太分布的。

下左是QQ图,可以发现除了两端少数极点,大部分数据都可以用一条直线拟合。

下右是相关系数图。

最后我们也可以使用summary()函数来查看模型的效果指标。

result.summary()

345149dfd57743558365d35d4f934f92.png

 

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

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

相关文章

实验篇(7.2) 10. 扩充物理实验环境 ❀ 远程访问

【简介】本着先简后难原则&#xff0c;我们前面所做的实验&#xff0c;均为客户端远程访问防火墙&#xff0c;现在我们需要实现防火墙和防火墙之间的访问。在现有的实验环境中&#xff0c;加再入一台防火墙。让我们看看需要怎样操作。 网络拓扑 企业之间最常见的远程互相访问&a…

SSM框架编程技术期末复习内容

考试题型&#xff1a;简答题编程题 SSM框架编程技术期末复习 一、代码干货Mybatis实现查询用户表记录数Mybatis根据用户名对用户表进行模糊查询Mybatis使用resultMap实现用户信息查询(用户表和角色表查询)Mybatis根据用户角色id获取用户列表Mybatis获取指定用户的相关信息及其…

【Mircosft Edge】插件推荐

插件推荐 1.推荐插件1.1 油猴 tempermonkey1.2 免费音乐播放器 Listen 1 2.添加插件2.1 打开“Micrsoft Edge 外接程序”2.2 获取新的扩展2.3 搜索插件2.3.1 在Micrsoft Edge 外接程序搜索框中输入tampermonkey&#xff0c;然后点击获取按钮进行安装2.3.2 在Micrsoft Edge 外接…

Misc(2)

第N种方法解决 拿到题目后是一个exe文件&#xff0c;运行不了 为啥非要整个exe&#xff0c;看着都害怕 改后缀后打开发现是base64编码的图片 利用工具解码转png格式 Base64解码 Base64编码 UTF8 GB2312 UTF16 GBK 二进制 十六进制 解密 - The X 在线工具 (the-x.cn) 下载下来的…

MySQL:主从HASH SCAN算法可能导致从库数据错误

本文主要以hash scan全表为基础进行分析&#xff0c;而不涉及到hash scan索引&#xff0c;实际上都会遇到这个问题。本文主要描述的是update event&#xff0c;delete event也是一样的&#xff0c;测试包含8022&#xff0c;8026&#xff0c;8028均包含这个问题。 约定&#xff…

myBatis-plus之CRUD

文章目录 查询普通查询根据 ID 查询根据ID批量查询根据MAP查询 条件构造器查询构造器声明&#xff1a;QueryWrapper方法常用方法&#xff0c;以及简单使用方式实体作为条件构造器构造方法的参数lambda条件构造器 更新普通更新根据 ID 修改 条件构造器更新 删除普通删除根据 ID …

【Flutter 布局】001-Flex 布局

【Flutter 布局】001-Flex 布局 文章目录 【Flutter 布局】001-Flex 布局一、Flex1、概述简介构造函数 2、基本使用代码示例运行结果 3、方向取值范围代码示例 4、水平方向&#xff1a;主轴对齐方式取值范围代码示例运行结果 5、垂直方向&#xff1a;主轴对齐方式代码示例运行结…

【活动】如何对待工作中的失误

序言 作为一名软件开发程序员&#xff0c;我们每天都面临着无数的挑战和压力。 在这个充满竞争和变化的行业中&#xff0c;难免会犯错。 然而&#xff0c;如何正确地对待和处理这些失误&#xff0c;是必须要学会的重要技能。这不仅仅影响到我们的工作表现&#xff0c;更关乎我…

java SSM 游戏账号租售平台myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 游戏账号租售平台是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

算法刷题-链表-环形链表

找到有没有环已经很不容易了&#xff0c;还要让我找到环的入口? 142.环形链表II 力扣题目链接 题意&#xff1a; 给定一个链表&#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 为了表示给定链表中的环&#xff0c;使用整数 pos 来表示链…

算法刷题-哈希表-有效的字母异位词

有效的字母异位词 242.有效的字母异位词思路其他语言版本相关题目 数组就是简单的哈希表&#xff0c;但是数组的大小可不是无限开辟的 242.有效的字母异位词 力扣题目链接 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s…

对数据进行模糊匹配搜索(动态规划、最长公共子串、最长公共子序列)

在搜索时常常在输入一半或者输入错误时&#xff0c;搜索引擎就给出智能提示。 已知的搜索推荐主要包括以下几个方面&#xff1a; 包含&#xff1a;“清华” 和 “清华大学”相似&#xff1a;“聊天软件” 和 “通讯软件”相关&#xff1a;“明星” 和 “刘亦菲”纠错&#xff…

Uni-app学习从0到1开发一个app——(4)生命周期

文章目录 0 引入1、应用生命周期2、页面生命周期3、组件生命周期4、引用 0 引入 uin-app生命周期是以小程序的生命周期为基础实现的&#xff0c;分为应用生命周期、页面生命周期、和组件生命周期&#xff0c;其中组件生命周期就是Vue的生命周期。 官方文档可见&#xff1a;ht…

java之反射机制和注解(更新中......)

Reflect在文档中的位置&#xff1a; 文档链接&#xff1a;https://docs.oracle.com/javase/8/docs/api/index.html 用于获取类或对象的反射信息。 常用的反射机制重要的类&#xff1a; java.lang.Class&#xff1a;整个字节码&#xff0c;代表一个类型。包含了以下三块内容&a…

算法刷题-了解哈希表

哈希表 首先什么是 哈希表&#xff0c;哈希表&#xff08;英文名字为Hash table&#xff0c;国内也有一些算法书籍翻译为散列表&#xff0c;大家看到这两个名称知道都是指hash table就可以了&#xff09;。 哈希表是根据关键码的值而直接进行访问的数据结构。 这么这官方的解释…

Spring Boot 基本配置

大家好&#xff01;我是今越。简单记录一下在 Spring Boot 中的一些基本配置。 Banner 配置 配置文件 application.properties # 设置路径和名称&#xff0c;默认路径名称 resources/banner.txt spring.banner.locationclasspath:banner1.txt # 启动项目时&#xff0c;关闭 b…

语法篇JQuery基础

目录 一、初识JQuery 1.1JQuery介绍 导入方式 常用公式 1.2快速入门 二、JQuery入门 2.1文档就绪函数 2.2名称冲突 2.3JQuery选择器 表单选择器 2.4JQuery过滤器 基础过滤器(Basic Fiter) 子元素过滤器 内容过滤器 可见性过滤器 三、JQuery事件与特效 3.1JQuery…

set/map学习

我们要开始学习map和set的使用&#xff0c;虽然使用更加复杂&#xff0c;但是STL整体的设计&#xff0c;本身就具有很强的前瞻性和延续性&#xff0c;比如说迭代器等&#xff0c;我们顺着文档来看。这也是除了vector之外最重要的容器&#xff0c;当然还有unordered_map 和 unor…

g++ 编译选项

1&#xff0c;基本编译过程 g可以用于编译C代码生成可执行程序&#xff0c;从原始代码到生成可执行过程中实际经历了以下4个步骤&#xff1a; 1. 预处理&#xff1a;宏替换&#xff0c;注释消除&#xff0c;查找相关库文件等[使用-E参数]。 # 只激活预处理&#xff0c;不会自…

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)-附代码

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO) 文章目录 集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)1.哈里斯鹰优化算法2.改进哈里斯鹰优化算法2.1 正态云模型2.2 随机反向学习思想2.3 动态扰动策略 3.实验结果4.参考文献5.Matlab代码6.python代码 摘要&#xff1a; 针对基…