数据挖掘实战-基于SARIMA时间序列模型预测阿里巴巴股票数据趋势
🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
目录
1.项目背景
2.数据集介绍
3.技术工具
4.实验过程
5.总结
源代码
1.项目背景
近年来,随着全球金融市场的不断变化和科技进步的加速,投资者对于股票价格趋势的预测需求变得愈发迫切。在这个背景下,阿里巴巴这样的科技巨头公司的股票价格更是备受关注。阿里巴巴作为中国领先的电子商务企业,其在全球市场上的地位和影响力不断扩大,其股票价格的波动不仅关系到公司的发展前景,也涉及到投资者的资产配置和市场情绪。
然而,股票市场的波动性和复杂性使得准确预测股票价格变得非常具有挑战性。在这种情况下,时间序列分析成为了一种重要的预测方法之一。时间序列分析通过对历史数据的观察和分析,试图找出数据中的模式和规律,以便预测未来的走势。而SARIMA模型作为时间序列分析中的经典方法之一,具有较强的建模能力和预测准确性,被广泛应用于股票价格的预测研究中。
在这一背景下,本研究旨在利用SARIMA时间序列模型,对阿里巴巴股票价格进行趋势预测。通过对阿里巴巴股票价格历史数据的分析和建模,我们可以揭示其潜在的波动模式和趋势,为投资者提供科学的投资建议和决策支持。
2.数据集介绍
本实验数据集来源于Kaggle,数据集包含阿里巴巴集团控股公司(BABA)从[2020年1月1日]到[2024年5月1日]的历史股价数据。数据集包括每日开盘价、最高价、最低价和收盘价,以及调整后的收盘价和成交量。
3.技术工具
Python版本:3.9
代码编辑器:jupyter notebook
4.实验过程
导入第三方库并加载数据集
检查数据是否平稳
观测数据不是平稳的,现在选择SARIMA模型进行时间序列分析。
正如我们所看到的,股票的趋势是下降趋势。股票具有季节性。库存中存在负剩余。
求P值的差分模型
差分法可以确定P = 1。
利用自相关得到d值
用部分自相关法求q值
可以确定,D的值为3,P的值为1,Q的值是2
训练模型并打印模型总结
使用模型预测未来10天的价格趋势,并将结果可视化
红线表示基于SARIMA模型完成的预测。
5.总结
本实验利用SARIMA时间序列模型对阿里巴巴股票价格进行趋势预测,并得出以下结论:
通过对阿里巴巴股票历史数据的分析和建模,我们成功地建立了SARIMA模型,能够较好地拟合股票价格的波动情况。该模型考虑了数据的季节性、自相关和移动平均性质,具有一定的预测能力和准确性。
基于建立的SARIMA模型,我们对未来一段时间内的阿里巴巴股票价格进行了预测。预测结果显示,阿里巴巴股票价格可能呈现出一定的趋势和波动,为投资者提供了参考和决策支持。
然而,需要注意的是,股票市场的波动具有一定的不确定性,预测结果仅供参考。投资者在进行投资决策时,应综合考虑多种因素,并根据实际情况进行调整和决策。
源代码
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline df = pd.read_csv('BABA.csv')
df
# 1. 检查数据是否平稳。
from statsmodels.tsa.stattools import adfuller
def check_stationary(df):result = adfuller(df)print('ADF Statistic: %f' % result[0])print('p-vslue: %f'% result[1])if result[1] <=0.5:print('reject the null hypothesis. Data is stationary')else:print('Fail to reject the null hypothesis. Data is not stationary')
check_stationary(df['Adj Close'])
观测数据不是平稳的。现在选择SARIMA模型进行时间序列分析。
# 价格变动概览
from statsmodels.tsa.seasonal import seasonal_decompose
decompose = seasonal_decompose(df['Adj Close'], model='additive', period=30)
decompose.plot()
正如我们所看到的,股票的趋势是下降趋势。
股票具有季节性。库存中存在负剩余。
# 求P值的差分模型
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
import matplotlib.pyplot as plt
fig, axes = plt.subplots(3, 2, sharex=True)
axes[0, 0].plot(df['Adj Close']); axes[0, 0].set_title('Original Series')
plot_acf(df['Adj Close'], ax=axes[0, 1])
# 一阶差分
axes[1, 0].plot(df['Adj Close'].diff()); axes[1, 0].set_title('1st Order Differencing')
plot_acf(df['Adj Close'].diff().dropna(), ax=axes[1, 1])
# 二阶差分
axes[2, 0].plot(df['Adj Close'].diff().diff()); axes[2, 0].set_title('2nd Order Differencing')
plot_acf(df['Adj Close'].diff().diff().dropna(), ax=axes[2, 1])
plt.show
差分法显示P = 1的值
# 利用自相关得到d值
pd.plotting.autocorrelation_plot(df['Adj Close'])
plot_acf(df['Adj Close'], alpha=0.05)
from statsmodels.tsa.stattools import acf
x_acf = pd.DataFrame(acf(df['Adj Close']))
# 用部分自相关法求q值
plot_pacf(df['Adj Close'], lags=20,alpha=0.05)
D的值为3
P的值为1
Q的值是2
import statsmodels.api as sm
p , d, q = 1,3,2
model = sm.tsa.statespace.SARIMAX(df['Adj Close'], order=(p,d,q),seasonal_order=(p,d,q,3))
model = model.fit()
print(model.summary())
predictions = model.predict(start=len(df['Adj Close']),end=len(df['Adj Close'])+10)
# 预测结果可视化
plt.figure(figsize=(15,10))
plt.plot(df['Adj Close'], label='Actual')
plt.plot(predictions, color='red', label='Predicted')
plt.xlabel('Adj Close')
plt.title('Ali Baba Stock Forecaste')
plt.legend(loc='upper left')
plt.show()
资料获取,更多粉丝福利,关注下方公众号获取