Python数据分析实战:利用ARIMA模型洞察股市规律

news2024/9/22 23:16:48

在这里插入图片描述

在股市中,数据的波动与变化风云莫测,难以捉摸。然而,借助科学的分析方法和工具,我们或许能够找到一些数据规律。今天,我们聊聊如何使用Python编程语言,结合ARIMA模型来洞察股市的变幻,为我们的投资决策提供有力支持。

ARIMA模型是经典的时间序列分析模型,它通过对历史数据的拟合和预测,揭示数据背后的动态依存关系。在股市数据分析中,ARIMA模型能够帮助我们理解股票价格、成交量等指标的变动趋势,预测未来的走势,从而做出更明智的投资决策。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UMIC3b56-1721297882300)(https://i-blog.csdnimg.cn/direct/d84203b30e284286a0921280a7557c8c.jpeg#pic_center)]

一、分析思路


首先,调用财经接口包,获取股票数据,为了使用ARIMA模型研究开盘价的趋势,这里只关注date和open列,将date列转换为Pandas的datetime对象,并将它设置为索引。

然后,我们将对开盘价序列进行平稳性检验,接着进行差分运算,以确定ARIMA模型的阶数。

最后,我们将拟合ARIMA模型,并预测接下来一周的开盘价。

二、数据获取


TuShare是一个免费、开源的python财经数据接口包,主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。

考虑到Python pandas包在金融量化分析中体现出的优势,TuShare返回的绝大部分的数据格式都是DataFrame类型。本文数据来源于“中国卫星”股市交易数据,其中date 、 open 、high 、low 、close 、volumn、code各字段分别为股票日期、开盘价、最高价、最低价、收盘价、股票价格、股票编码。

#获取股票数据  
import tushare as ts  
#事先安装:!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tushare  
data = ts.get_k_data('600118', '2023-06-01','2024-05-31', ktype='D') #中国卫星600118  
# D--日线;W--周线;M--月线  
  
data.head()  
#导出数据  
data.to_csv('stock_ren.csv')

三、导入数据


导入端口下载的股票数据。

# 首先,我们需要读取上传的CSV文件以查看其内容。  
import pandas as pd  
# 读取上传的CSV文件  
file_path = 'stock_ren.csv'  
stock_data = pd.read_csv(file_path)  
  
# 显示文件的前几行,以了解数据的结构和内容  
stock_data.head()

首先,我们将日期转换为datetime对象,并设置它为索引。



`# 将日期转换为datetime对象,并设置它为索引`

`stock_data['date'] = pd.to_datetime(stock_data['date'])`

`stock_data.set_index('date', inplace=True)`

`   `

`# 确认日期已正确设置为索引`

`stock_data.head()`


四、趋势分析


日期已成功转换为datetime对象,并设置为了索引。我们绘制时序图,通过时序图判断该股票开盘价的趋势。

plt.rcParams['font.sans-serif'] = ['simhei'] #用来正常显示中文标签  
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号  
stock_data['open'].plot()  
plt.title("中国卫星开盘价趋势图") #添加图标题  
plt.xticks(rotation=45) #横坐标旋转45度  
plt.xlabel('日期') #添加图的标签(x轴,y轴)  
plt.ylabel('开盘价')

五、平稳性检验


接下来对开盘价序列进行平稳性检验,平稳性检验通常是使用单位根检验,例如ADF检验。如果序列是非平稳的,我们将需要对其进行差分,直到它变得平稳,因为ARIMA模型要求输入序列必须是平稳的。

from statsmodels.tsa.stattools import adfuller
# 提取开盘价序列
open_price = stock_data['open']
# 执行ADF检验
result = adfuller(open_price)
adf_statistic = result[0]
p_value = result[1]
critical_values = result[4]



execution_result = f'ADF Statistic: {adf_statistic}, p-value: {p_value}, Critical Values: {critical_values}'
execution_result

"ADF Statistic: -2.0175512509905835,

p-value: 0.27893090334519033,

Critical Values: {‘1%’: -3.45, ‘5%’: -2.87, ‘10%’: -2.57}"

由于p-值大于0.05,我们不能拒绝序列存在单位根的原假设,这意味着开盘价序列是非平稳的。因此,我们需要对序列进行差分,直到它变得平稳。接下来对开盘价序列再进行一阶差分,并再次进行ADF检验来检查其平稳性。

六、差分运算


由于上面得出的结果是非平稳的,这里在进行一次差分,使其得到平稳的序列结果。

from statsmodels.tsa.stattools import adfuller
# 提取开盘价序列
open_price = stock_data['open']
# 执行ADF检验
result = adfuller(open_price)
adf_statistic = result[0]
p_value = result[1]
critical_values = result[4]



execution_result = f'ADF Statistic: {adf_statistic}, p-value: {p_value}, Critical Values: {critical_values}'
execution_result

`   `

`execution_result_diff = f'ADF Statistic (1st diff): {adf_statistic_diff}, p-value (1st diff): {p_value_diff}, Critical Values (1st diff): {critical_values_diff}'   execution_result_diff

"ADF Statistic (1st diff): -18.355654520506,

p-value (1st diff): 2.232193149282452e-30,

Critical Values(1st diff): {‘1%’: -3.45, ‘5%’: -2.87, ‘10%’: -2.57}"

一阶差分后的序列的p-值远小于0.05,因此我们可以拒绝存在单位根的原假设,这意味着差分后的序列是平稳的。我们现在可以继续使用差分后的序列来定阶ARIMA模型。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AKhXejG7-1721297882303)(https://i-blog.csdnimg.cn/direct/70f4511633c1452a8e298aaa68a6884b.png)]
七、模型定阶


ARIMA模型需要三个参数:p自回归项的阶数,d差分次数,和q移动平均项的阶数,这里已知d=1,因为我们进行了1次差分,为了确定p和q,可以使用**ACF(自相关函数)PACF(偏自相关函数)**图。

下面绘制ACF和PACF图,以确定ARIMA模型的参数。

from statsmodels.graphics.tsaplots import plot_acf, plot_pacf  
import matplotlib.pyplot as plt  
  
# 设置图形的大小  
plt.figure()  
# 绘制ACF图  
plt.subplot(211)  
plot_acf(open_price_diff, lags=20, ax=plt.gca())  
# 绘制PACF图  
plt.subplot(212)  
plot_pacf(open_price_diff, lags=20, ax=plt.gca())  
  
# 显示图形  
plt.tight_layout()  
plt.show()

ACF(自相关函数)和PACF(偏自相关函数)图绘制完成,这些图帮助我们确定ARIMA模型的参数。在ACF图中,自相关函数在几阶滞后后会下降到置信区间内,这有助于判断MA项的阶数q,在PACF图中,偏自相关函数在几阶滞后后会下降到置信区间内,这有助于判断AR项的阶数p。

八、模型拟合


根据这些图,我们可以大致估计p和q的值,通常,我们会寻找图形中第一个显著的滞后,即第一个超出置信区间的峰值,由图可以拟合的模型是ARIMA(1,1,1)

from statsmodels.tsa.arima.model import ARIMA  
import numpy as np  
  
# 拟合ARIMA(1,1,1)模型  
model = ARIMA(open_price, order=(1, 1, 1))  
model_fit = model.fit()  
  
# 显示拟合模型的摘要信息  
model_fit.summary()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DfNStyLP-1721297882306)(https://i-blog.csdnimg.cn/direct/80119bd3da814439b7f5ae19586b88e1.png)]

ARIMA(1,1,1)模型的拟合结果已显示。模型的系数和统计检验结果如下:

  • AR项系数为-0.2496,标准误差为0.338,z值为-0.739,p值为0.460;

  • MA项系数为0.0999,标准误差为0.343,z值为0.292,p值为0.771;

  • 方差为0.3738,标准误差为0.018。

模型的AIC值为634.438,BIC值为645.916。Ljung-Box Q检验的p值为1.00,Jarque-Bera检验的p值为0.00,表明模型残差是白噪声。但是,模型的系数的p值相对较高,表明这些系数可能不太显著。

九、模型预测


为了预测接下来一周的开盘价,我们可以使用这个模型来进行数据预测,使用当前的ARIMA(1,1,1)模型来预测接下来一周的开盘价。根据ARIMA(1,1,1)模型,我们预测接下来一周的开盘价如下:

# 预测接下来一周的开盘价  
forecast_steps = 7  
forecast = model_fit.forecast(steps=forecast_steps)  
forecast_values = model_fit.forecast(steps=forecast_steps).values  
  
# 将预测结果转换为DataFrame  
forecast_index = pd.date_range(start=stock_data.index[-1], periods=forecast_steps + 1, closed='right')  
forecast_df = pd.DataFrame(data={'Predicted Open': forecast_values}, index=forecast_index)  
  
# 显示预测结果  
forecast_df

绘制原始开盘价数据和预测开盘价数据的折线图,用于对比预测值的差异。

# 绘制原始开盘价数据和预测开盘价数据的折线图
plt.figure()
# 绘制原始开盘价数据
plt.plot(stock_data.index, stock_data['open'], label='Original Open Price',)
# 绘制预测开盘价数据
plt.plot(forecast_df.index, forecast_df['Predicted Open'], label='Predicted Open Price', color='red', marker='x')


# 添加图例

plt.legend()
# 添加标题和轴标签
plt.title('Original vs Predicted Open Price')
plt.xlabel('Date')
plt.ylabel('Open Price')

# 显示图表
plt.show()

`   `

`# 添加图例`

`plt.legend()   # 添加标题和轴标签   plt.title('Original vs Predicted Open Price')   plt.xlabel('Date')   plt.ylabel('Open Price')      # 显示图表   plt.show()

上图展示了原始开盘价数据和预测开盘价数据的对比,从图中可以看出,预测值与原始数据大致吻合。经过上面的实战演练,我们不难发现,ARIMA模型在股市数据分析中确实具有强大的应用潜力,掌握这种分析工具可以帮助我们更好的发现股市规律。

由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人不骗中国人。

                                     **(扫码立即免费领取)**

全套Python学习资料分享:

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频全套

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0jyjox8A-1721297882309)(https://i-blog.csdnimg.cn/direct/be8cae709a724a8498fef488a8496061.jpeg#pic_center)]

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

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

相关文章

查看仓库文件的改变(git-status , git-diff)

当你在进行项目开发的时候,想看一下自己改了什么,使用cmd进入项目的路径 输入命令回车,前面带有modified,说明后面这个文件被修改了前面带有deleted, 说明这个文件被删除了这是Untracked files, 这部分文…

昇思25天学习打卡营第15天|两个分类实验

打卡 目录 打卡 实验1:K近邻算法实现红酒聚类 数据准备 模型构建--计算距离 计算演示 模型预测 实验2:基于MobileNetv2的垃圾分类 任务说明 数据集 参数配置(训练/验证/推理) 数据预处理 MobileNetV2模型搭建 Mobile…

React安装(学习版)

1. 安装Node.js和npm 首先,确保你的电脑上已经安装了Node.js和npm(Node Package Manager)。你可以从 Node.js官网 下载安装包并按照提示进行安装。安装完成后,可以在命令行终端中验证Node.js和npm是否正确安装: node …

前端开发日记——在MacBook上配置Vue环境

前言 大家好,我是来自CSDN的寄术区博主PleaSure乐事。今天是开始学习vue的第一天,我使用的编译器是vscode,浏览器使用的是谷歌浏览器,后续会下载webstorm进行使用,当前学习阶段使用vscode也是可以的,不用担…

达梦数据库的系统视图v$arch_file

达梦数据库的系统视图v$arch_file 在达梦数据库中,V$ARCH_FILE 是一个动态性能视图,用于显示当前数据库的归档日志文件信息。这个视图可以帮助数据库管理员监控和管理归档日志文件,确保数据库的备份和恢复过程顺利进行。 查询本地归档日志信…

算法第十天:leetcode203.移除链表元素

一、203.移除链表元素题目描述 203.移除链表元素的链接如下所示,您可复制下面链接网址进入力扣学习,看题解之前一定要先做一遍哦! https://leetcode.cn/problems/remove-linked-list-elements/description/https://leetcode.cn/problems/rem…

WsgiDAV:强大的 WebDAV 解决方案

一、软件介绍 WsgiDAV 是一款卓越的开源 WebDAV 服务器和客户端库,由 Python 精心编写而成。它为用户搭建了一座通过 HTTP/HTTPS 协议访问和管理远程文件系统的便捷桥梁。 WsgiDAV 的核心是一个严格遵循 WebDAV 标准的中间件,能够与任何 WSGI 兼容的 W…

fastJSON 解决kafka消息斜杠转义问题

Bug: kafka发送消息时的JSON转义异常 问题描述: 问题描述:kafka消息发送出去但是消费者执行相关逻辑的时候报错. 场景:当时实习的时候需要模拟数据做一个实时经纬度传输的接口,使用kafka实时发送消息将数据同步到数据库中 问题分析: fastjson使用不当可能导致转义异常**,kafka…

【系统架构设计】操作系统(一)

操作系统(一) 操作系统的类型和结构操作系统基本原理进程管理进程三态模型挂起状态进程互斥 / 进程同步前趋图进程调度死锁 存储管理设备管理文件管理作业管理 操作系统原理的关键在于“一个观点、两条线索”:一个观点是以资源管理的观点来定…

Rust Result 与可恢复的错误

Result 与可恢复的错误 大部分错误并没有严重到需要程序完全停止执行。有时,一个函数会因为一个容易理解并做出反应的原因失败。例如,如果因为打开一个并不存在的文件而失败,此时我们可能想要创建这个文件,而不是终止进程。 回忆…

Python进阶(4)--正则表达式

正则表达式 在Python中,正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。 在这之前,还记得之前我们是通过什么方法分割…

动手做Agent:产品经理与程序员的相爱想杀

引言 以前在大厂做产品经理的时候,很多次我恨不得想要撸起袖子自己 coding。现在自己独立开始做,才知道动手开发的确比想象中困难,尽管我勉强也可以看得懂代码,真是“眼看百遍不如动手一遍”。 就像周末我立下豪言给小幼兽 DIY …

机器学习第四十八周周报 IAGNN

文章目录 week48 IAGNN摘要Abstract0. 前言1. 题目2. Abstract3. 网络结构3.1 问题定义3.2 IAGNN 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.4 实验结果 5. 结论6.代码复现小结参考文献 week48 IAGNN 摘要 本周阅读了题为Interaction-Aware Graph Neural Networks…

SpringCloud------Sentinel(微服务保护)

目录 雪崩问题 处理方式!!!技术选型 Sentinel 启动命令使用步骤引入依赖配置控制台地址 访问微服务触发监控 限流规则------故障预防流控模式流控效果 FeignClient整合Sentinel线程隔离-------故障处理线程池隔离和信号量隔离​编辑 两种方式优缺点设置方式 熔断降级-----…

【C++初阶】多态

重写子类时不要求必须有 virtual 关键字 虚函数允许派生类重写这个函数,并确保即使是通过基类指针调用该函数,也能调用到派生类的版本 虚函数关键字 virtual 只在声明时加上,在类外实现时不用加 虚函数只需在类声明中加上 virtual 关键字&a…

COD论文学习 ZoomNext

现有方法的不足之处 高内在相似性:伪装物体与背景之间的高内在相似性使得检测变得困难,现有方法难以准确区分二者。多样化的规模和模糊的外观:伪装物体在规模和外观上多样化,且可能严重遮挡,导致现有方法难以处理。不…

景联文科技构建高质量心理学系知识图谱,助力大模型成为心理学科专家

心理大模型正处于快速发展阶段,在临床应用、教育、研究等多个领域展现出巨大潜力。 心理学系知识图谱能够丰富心理大模型的认知能力,使其在处理心理学相关问题时更加精确、可靠和有洞察力。这对于提高心理健康服务的质量和效率、促进科学研究以及优化教育…

vue项目build以后整合到springboot项目里面---------gxl

很多时候我们需要用到vue的组件,但是全栈的背景下懒得去搞前后端分离,很多权限校验后台都写好了,没必要再去做接口或者前端写一遍了,因此我们需要把打包后的项目整合到项目里面。 整合也很简单,照常vue项目开发&#…

Seaborn库学习之heatmap()函数

Seaborn库学习之heatmap(函数) 一、简介 seaborn.heatmap是Seaborn库中用于绘制热图(Heatmap)的函数。热图是一种数据可视化技术,通过颜色的变化来展示数据矩阵中的数值大小。这种图表非常适合展示数值数据的分布和关系,尤其是在…

什么是MIMO?(通俗易懂)

MIMO,一句话解释:多输入多输出(Multi Input Multi output) 用图说话,图①-图④,分别代表: ① SISO:单输入单输出 ( Single Input Single Output ) ② SIMO:单输入多输出…