Python3实现基于ARIMA模型来预测茅台股票价格趋势
🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
目录
ARIMA模型简介
实战案例
加载数据
数据预处理
差分并确定参数d
做出ACF、PACF图确定参数q和p
训练模型并预测
模型效果评估
ARIMA模型简介
ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。
ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。
具体来说,ARIMA模型可以通过以下步骤进行建模:
-
数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。
-
模型选择:根据样本自相关图(ACF)和偏自相关图(PACF)选择合适的p、d、q值。
-
参数估计:使用极大似然估计或最小二乘法对模型参数进行估计。
-
模型检验:对模型的残差进行自相关性和正态性检验,如果不符合要求则需要重新选择模型或调整参数。
-
模型预测:根据已有数据和已经估计好的参数进行未来数据的预测。
ARIMA模型在金融、经济、气象、交通等领域都有广泛应用,特别是在金融领域,ARIMA模型可以用于股票价格、汇率、利率等方面的预测。
ARIMA(p,d,q)阶数确定
模型 | ACF | PACF |
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
数据预处理
由于我们要分析预测的是收盘价,所以我们取出收盘价的数据并进行重采样,以周且指定周一为单位求平均值。然后指定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()
差分并确定参数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()
通过上图我们发现,一阶差分就已经由稳定的趋势了,到了二阶波动的幅度反而更大,所以这里我们直接确定参数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)
得出的结果也是1,跟上面的方法一样。
做出ACF、PACF图确定参数q和p
# 做出ACF图确定参数q
sm.graphics.tsa.plot_acf(stock_diff_1)
plt.title('ACF')
plt.show()
# 做出PACF图并确定参数p
sm.graphics.tsa.plot_pacf(stock_diff_1)
plt.title('PACF')
plt.show()
通过观察上面两个图,我们可以确定参数 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)
这里如果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
我们将预测的结果和真实值可视化出来:
plt.figure(figsize=(12,6))
plt.xticks(rotation=45)
plt.plot(forecast,label='预测值')
plt.plot(stock_train,label='真实值')
plt.legend()
plt.show()
可以发现模型拟合的还不错,基本上与原趋势保持一致。
模型效果评估
这里我们直接调用plot_diagnostics()方法将模型的评估结果可视化展示
# 残差分析、正态分布、QQ图、相关系数
result.plot_diagnostics(figsize=(16,12))
plt.show()
上左是残差分析图,可以发现模型残差为零。
上右是直方图和正太分布图,可以发现模型是近似于正太分布的。
下左是QQ图,可以发现除了两端少数极点,大部分数据都可以用一条直线拟合。
下右是相关系数图。
最后我们也可以使用summary()函数来查看模型的效果指标。
result.summary()
相关文章:

Python3实现基于ARIMA模型来预测茅台股票价格趋势
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...

自动化测试selenium环境搭建
自动化测试工具selenium搭建 1. 自动化和selenium基本概念 1) 什么是自动化?为什么要做自动化? 自动化测试能够代替一部分的手工测试,自动化测试能够提高测试的效率。随着项目功能的增加,版本越来越多,版本的回归测试的压力也…...

SaaS系统平台,如何兼顾客户的个性化需求?
在当今数字化的商业环境中,SaaS系统已经成为企业运营的重要组成部分之一。 SaaS系统平台的好处是显而易见的,可以将业务流程数字化,从而帮助企业提高效率并节省成本。 但是,由于每个企业的业务都不尽相同,所以在选择Sa…...

QDir拼接路径解决各种斜杠问题
一般在项目中经常需要组合路径,与其他程序进行相互调用传递消息通信。 经常可能因为多加斜杠、少加斜杠等问题导致很多问题。 为了解决这些问题,我们可以使用QDir来完成路径的拼接,不直接拼接字符串。 QDir的静态方法QDir::cleanPath() 是为了规范化路径名的,在使用QDir组…...

mycat2主从配置实现读写分离
mycat2主从配置实现读写分离 在https://blog.csdn.net/zhangxue_wei/article/details/130840504基础上继续搭建 1.创建mycat数据源,可以在navcat里直接执行 1.1读数据源m1 /* mycat:createDataSource{"dbType":"mysql","idleTimeout&qu…...

如何在Centos7中安装Kubernetes
一、概述 Kubernetes([kubə’netis]),简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写,它是一个由Google 开源的全新的分布式容器集群管理系统。 二、准备 IP角色内存192.168.1.130master4G192.168.1.1…...

Stream强化
使用stream求list的对象属性的和 假设有一个Student类,其中有一个属性是score,可以通过以下代码求出List<Student>中score的和: List<Student> students new ArrayList<>(); // 添加学生对象到List中 int sum student…...

第一部分-基础篇-第一章:PSTN与VOIP(下篇)
文章目录 序言上一篇文章:1.6 电路交换与分组交换1.6.1 电路交换1.6.2 分组交换 1.7 VoIP1.8 IMS1.8.1 什么是IMS1.8.2 IMS的特点1.8.3 IMS核心网元(1 ) CSCF(2 ) MGCF(3 ) IM-MGW(5…...

《汇编语言》- 读书笔记 - 第4章-第一个程序
《汇编语言》- 读书笔记 - 第4章-第一个程序 4.1 一个源程序从写出到执行的过程4.2 源程序程序 4.11. 伪指令1.1 segment ends 声明段1.2 end 结束标记1.3 assume 关联 2. 源程序中的“程序”3. 标号4. 程序的结构5. 程序返回6. 语法错误和逻辑错误 4.3 编辑源程序4.4 编译4.5 …...

AI工具 ChatGPT-4 vs Google Bard , PostgreSQL 开发者会pick谁?
在人工智能 (AI) 进步的快节奏世界中,开发人员正在寻找最高效和突破性的解决方案来加快和提高他们的工作质量。对于 PostgreSQL 开发人员来说,选择理想的 AI 支持的工具以最专业的方式解决他们的查询至关重要。 近年来,人工智能工具的普及率…...

【网络】基础知识1
目录 网络发展 独立模式 网络互联 局域网LAN 广域网WAN 什么是协议 初识网络协议 协议分层 OSI七层模型 TCP/IP四层(或五层)模型 OSI和TCP/IP对比 网络传输流程 什么是报头 局域网通信原理 同网段的主机通讯 跨网段的主机通讯 数据包封装…...

chatgpt赋能python:Python倒序range的完整指南
Python倒序range的完整指南 Python是一种高级编程语言,很多人认为它非常容易学习和使用。其中一个非常有用的功能是range()函数,可以生成数字序列。然而,有时候我们需要以相反的顺序生成这个数字序列,这时候倒序range()函数就派上…...

工作笔记!
搭建tomcat Tomcat详细使用教程 tomcat配置用戶名和密碼 tomcat设置外网能访问_tomcat让别人通过网络访问 如何在windows开端口_windows开放端口命令 tomcat进Manager 403 Access Denied You are not authorized to view this page_tomcat报错you are not_ferry_cai 关于依…...

java设计模式之享元设计模式的前世今生
享元设计模式是什么? 享元设计模式是一种结构型设计模式,它的目的是在大规模重复使用相似对象时提高内存利用率和性能。它通过共享对象的公共部分来减少所需要的内存,从而在系统中同时存在更多的对象。 享元设计模式通过将对象分为可共享的内…...

RESTful:理解REST架构风格、RESTful API
一、REST架构风格 REST(英文Representational State Transfer)是一种基于客户端和服务器的架构风格,用于构建可伸缩、可维护的Web服务。REST的核心思想是,将Web应用程序的功能作为资源来表示,使用统一的标识符&#x…...

网络面试题:什么是 TCP/IP?
目录标题 什么是 TCP/IP?1) 网络接口层:2) 网络层:3) 传输层:4) 应用层: 2.数据包3.网络接口层4.网络层1) IP:2)地址解析协议 ARP3)子网 5 传输层1)UDP:2)TCP: 6 应用层运行在TCP协议上的协议:运行在UDP协议上的协议&…...

毫米波雷达模块在自动驾驶系统中的关键功能
随着自动驾驶技术的快速发展,毫米波雷达模块作为一项关键技术,为自动驾驶系统提供了重要的感知和决策能力。毫米波雷达模块通过实时探测和跟踪周围环境中的车辆、行人和障碍物,提供精确的距离和速度信息,帮助自动驾驶车辆做出准确…...

关于开发中对端口(port)的几点理解
一、服务端的端口是固定的,客户端的端口是随机的 客户端端口是随机的,比如访问百度,系统为浏览器分配了个端口1024。过一会重开电脑,访问了新浪,可能还是用1024端口,我不关浏览器,还要再开一个浏…...

qt 5.14.2 arm 交叉环境搭建过程
主要参考 https://blog.csdn.net/anmo_moan/article/details/126960630 https://blog.csdn.net/a648642694/article/details/89302843 1 下载编译器&设置 1.1 gcc-linaro-12.2.1-2023.01-x86_64_arm-linux-gnueabihf.tar.xz 下载编译器 1.2. /home/zsf/arm linaro 压缩包…...

apt remove purge的区别 删除包的同时删除配置文件
1、apt remove purge的区别 查看 man apt apt remove:删除软件包,不删除配置文件。这么做的目的是将来再次安装这个包时 原来的配置文件会自动加载供使用。也可以避免误删除包,配置文件还在的话,重新安装一次软件包就可以恢复到…...

电商|跨境电商如何选择API接口和ERP
随着跨境电商企业规模升级,平台提供的卖家后台系统往往无法满足有一定规模的店铺和独立站卖家。日常运营中,中大型跨境电商往往面临以下几种挑战: 多店铺、多平台订单管理难 库存数据集成难,经常缺货 物流管理难,手…...

测试人员的启蒙指南
文章目录 一. 了解测试1. 生活中的测试场景2. 什么是软件测试3. 实战练习 二. 软件测试和软件开发的区别三. 软件测试和软件调试的区别四. 软件测试的发展五. 软件测试的岗位六. 一个优秀的软件测试人员具备的素质 本篇中介绍测试人员是干什么的, 起到启蒙和了解的作用, 重点是…...

Linux工具:vim常用快捷键
1、拷贝行(一般模式下) 拷贝当前行 将光标移动到指定行,yy 移动到想要粘贴的行,p 即可把拷贝的行粘贴到该行下方 拷贝n行 将光标移动到指定行,比如拷贝5行,5yy 移动到想要粘贴的行,p 即可把拷贝的几行粘贴到该行下方…...

TA-lib第三方库安装问题
因为学习的需要,用到Talib库做写指标分析,但是百度了好久,说是去要某某网站下载对应版本的文件进行本地安装,但是把…404 Not found 然后通过查找,Ta-lib库的安装已经迁移到这里了 https://github.com/TA-Lib/ta-lib-p…...

接口测试的测试要点
接口测试的测试要点,你知道都有哪些吗? 接口测试是软件测试中的重要组成部分,它的目的是评估接口的质量和可靠性,以保证系统的正常运行。在进行接口测试时,必须要考虑到以下几个方面: 测试用例的编写 测试…...

直流电机 PID 控制系统仿真研究(Simulink实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

第三章 向量与线性方程组
引言 题型总结中推荐例题有蓝皮书的题型较为重要,只有吉米多维奇的题型次之。码字不易,如果这篇文章对您有帮助的话,希望您能点赞、评论、收藏,投币、转发、关注。您的鼓励就是我前进的动力! 知识点思维导图 补充&…...

数组题目总结 -- 花式遍历
目录 一. 反转字符串中的单词思路和代码:I. 博主的做法II. 东哥的做法III. 其他做法1补充知识点: IV. 其他做法2 二. 旋转图像思路和代码:I. 博主的做法II. 东哥的做法 三. 旋转图像(逆时针旋转90)思路和代码ÿ…...

Android 12.0开机过滤部分通知声音(莫名其妙的通知声音)
1.概述 在12.0的开发产品的时候,有时候在开机的时候会有一些通知的声音,但是由于系统模块太多,也搞不清楚到底是哪个模块发出的通知声音,所以就需要从通知的流程来屏蔽这些通知声音 2.开机过滤部分通知声音(莫名其妙的通知声音)核心代码 frameworks/base/core/java/androi…...

LeetCode-0525
102. 二叉树的层序遍历(中等) 思路:使用hash记录深度 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if(rootnull)return new ArrayList<>();Map<TreeNode,Integer> deep new HashMap&…...