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

在这里插入图片描述

在股市中,数据的波动与变化风云莫测,难以捉摸。然而,借助科学的分析方法和工具,我们或许能够找到一些数据规律。今天,我们聊聊如何使用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.mzph.cn/bicheng/48030.shtml

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

相关文章

【TCP通信】

7.18学习记录 NetAssist.exeTCP/IP协议准备工作做好之后开始创建方案 通信架构设备管理接收事件发送事件心跳管理响应配置 VM4.0二次开发 NetAssist.exe 网络协议调试助手文件,支持UDP和TCP协议。只需要输入主机的地址和端口就能获取数据解析。要用到的协议是 TCP/…

wps office 2019 Pro Plus 集成序列号Vba安装版教程

前言 wps office 2019专业增强版含无云版是一款非常方便的办公软件,我们在日常的工作中总会碰到需要使用WPS的时候,它能为我们提供更好的文档编写帮助我们更好的去阅读PDF等多种格式的文档,使用起来非常的快捷方便。使用某银行专业增强版制作…

生活中生智慧

【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好,互相成全;反求诸己是致良知的第一步;有苦难才能超越自己,开胸怀和智慧;不浪费任何一次困苦,危机中寻找智慧,成长自己。 把困苦当作当下…

Linux——awk操作符

[rootlocalhost ~] # awk BEGIN{x2;y3;print x**y,x^y,x*y,x/y,xy,x-y,x%y} 8 8 6 0 .666667 5 -1 2 赋值运算符 条件运算符 awk 中的条件运算符只有一个,其语法如下: expression?value1:value2 这是一个三目运算符,当表达式 expre…

MySQL索引特性(上)

目录 索引的重要 案例 认识磁盘 MySQL与存储 先来研究一下磁盘 扇区 定位扇区 结论 磁盘随机访问与连续访问 MySQL与磁盘交互基本单位 建立共识 索引的理解 建立测试表 插入多条记录 局部性原理 所有的MySQL的操作(增删查改)全部都是在MySQL当中的内存中进行的&am…

【删除链表的倒数第N个节点】python刷题记录

目录 哑结点 为什么设置哑节点? 方法1(先遍历统计长度,再查找具体位置): 方法2(双指针): 链表基本用法 哑结点 在链表前面添加哑节点,指向头节点 为什么设置哑节点…

系统架构师考点--统一建模语言UML

大家好。今天我来总结一下面向对象的第二个考点–统一建模语言UML。 UML(统一建模语言)是一种可视化的建模语言,而非程序设计语言,支持从需求分析开始的软件开发的全过程。UML的结构包括构造块、规则和公共机制三个部分。其中考点主要集中在构造块部分&…

一建备考,五步形成闭环学习!

一建备考从7月份到考前是大部分人焦虑的时候,因为基础阶段结束,开始成套做真题了,第一遍做真题很多人分数都不太理想,很多同学直接失去信心,开始emo,这都是只听课不做题的结果。 现在很多同学都是这种情况…

ABAP group by 语句学习

第一个案例:原文链接:https://blog.csdn.net/lmf496891416/article/details/111317377 第一步:定义结构,此处定义了三个字段 key1 ,key2 ,col ,然后定义表 itab 参照结构 struct TYPES: BEGIN OF ty_employee,name TYPE char30,…

ASUS/华硕幻13 2022 GV301R系列 原厂win11系统 工厂文件 带F12 ASUS Recovery恢复

华硕工厂文件恢复系统 ,安装结束后带隐藏分区,一键恢复,以及机器所有驱动软件。 系统版本:windows11 原厂系统下载网址:http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意:仅支持以上型号专用…

平凯星辰黄东旭出席 2024 全球数字经济大会 · 开放原子开源数据库生态论坛

7 月 5 日,以“开源生态筑基础,数字经济铸未来”为主题的 2024 全球数字经济大会——开放原子开源数据库生态论坛在北京成功举办。平凯星辰(北京)科技有限公司联合创始人黄东旭发表了题为《TiDB 助力金融行业关键业务系统实践》的…

校验el-table中表单项

需求: 表格中每一行都有几个必填项,如用户提交时有未填的选项,将该选项标红且给出提示,类似el-form 的那种校验 el-table本身并没有校验的方法,而且每一行的输入框也是通过插槽来实现的,因此我们要自己跟…

信息安全工程师题

物理隔离技术要求两台物理机物理上并不直连,只能进行间接的信息交换。所以防火墙不能实现网络的物理隔离Web应用防火墙可以防止SQL注入、xss攻击、恶意文件上传、远程命令执行、文件包含、恶意扫描拦截等;可以发现并拦截恶意的Web代码;可防止…

基于单片机的智能医疗监护系统设计

1.简介 随着社会的发展,智能化电子设备成为了人们生活中不可或缺的一部分,尤其是在人们对于身心健康更加注重的今天,智能医疗监护系统应运而生。本套电子监护设备集体温测量、心电采集、心率监测、血氧监测于一体,带有语音播报模块…

【Java】用队列实现栈 力扣

文章目录 题目链接题目描述思路代码 题目链接 225.用队列实现栈 题目描述 思路 一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。 代码 class MyStack {Q…

Django 请求和响应

1、请求 &#xff08;1&#xff09;get请求 用户直接在浏览器输入网址&#xff0c;参数直接在url中携带 http://127.0.0.1:8000/login/?a1&b%221243%22 &#xff08;2&#xff09;post请求 在html使用post,login.html <!DOCTYPE html> <html lang"en&…

防御综合实验作业2

办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP NAT策略&#xff1a; 安全策略&#xff1a; 测试&#xff1a; 分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 是怎么转换的&#xff0c;首先分公司的用户需…

数据结构(Java):力扣牛客 二叉树面试OJ题(一)

&#x1f449; ​​​​​​目录 &#x1f448; 1、题一&#xff1a;检查两棵树是否相同 1.1 思路分析 1.2 代码 2、题二&#xff1a;另一棵树的子树 2.1 思路分析 2.2 代码 3、题三&#xff1a;翻转二叉树 3.1 思路分析 3.2 代码 4、题四&#xff1a;判断树是否对称 …

C++中的new和模版

前言 随着C的学习&#xff0c;讲了C的发展过程、流插入、流提取、函数缺省值、类与构造等等。接下来学习C很方便的 玩意&#xff0c;函数模版。函数模版就像是模具一样&#xff0c;C会自动用模版编译出合适的函数供程序员使用。以前不同类型相同操作的函数都能通过函数模版&…

js实现数组的下标为n的对象后面新增一条对象

前言&#xff1a; js实现数组的下标为n的对象后面新增一条对象 实现方法&#xff1a; arr.splice(1, 0, obj); splice 参数1: 数组里面的第几个元素&#xff0c;你希望在第几个对象后面新增参数2: 0 表示不删除任何元素参数3: 插入的新对象 let arr [{},{},{},{}] let obj…