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电子书

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

四、入门学习视频全套

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

五、实战案例

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


在这里插入图片描述

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值