基于ARIMA回归模型的股票价格预测

一、ARIMA回归模型

ARIMA回归模型是一种用于时间序列数据预测的统计模型。

ARIMA 是 AutoRegressive Integrated Moving Average 的缩写,中文意思是“自回归差分移动平均模型”。它是一种结合了自回归(AR)、差分(I)和移动平均(MA)三种方法的模型。

自回归(AR):指的是模型会考虑过去的值对当前值的影响。
差分(I):指的是对数据进行处理,使其平稳,即消除数据中的趋势和季节性。
移动平均(MA):指的是模型会考虑过去的误差对当前值的影响。

算法步骤

Step1:读取数据
Step2:数据预处理
Step3: 确定模型参数
Step4: 训练模型
Step5: 检验模型

ARIMA模型的优点:

预测能力:可以预测未来的趋势,帮助做出决策(短期较为准确,长期预测误差较大)。
理解数据:通过分析历史数据,可以更好地理解数据的模式和结构。
提高效率:在某些情况下,可以减少不必要的资源浪费。

二、数据的来源

本文的数据来源于某股市的交易数据,其中包含字段分别为交易日期、开盘价、最高价、最低价、收盘价、昨日收盘价、成交量、成交金额、振幅、涨跌幅、涨跌额、换手率。

 三、程序部分

Step1:读取数据

%matplotlib inline 
import pandas as pd #数据处理,数据分析
import datetime #导入日期和时间
import matplotlib.pylab as plt #可视化展示  
from matplotlib.pylab import style #画图风格
from statsmodels.tsa.arima_model import ARIMA   #差分自回归移动平均模型
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf   #ACF图,PACF图

#去掉不必要的警告
import warnings
warnings.filterwarnings("ignore")



stock = pd.read_csv('sh_******.csv', index_col=0, parse_dates=[0],encoding='utf-8')  #把日期作为索引列
stock

 前5行数据:

Step2:数据预处理

2.1数据重采样

#对“收盘价”列进行数据重新采样(时间序列的频率从每天变成每周一),然后取每周的平均值

stock_week = stock['收盘价'].resample('W-MON').mean()
stock_week

stock_train = stock_week['2017':'2022']
#选择2017年到2022年的数据作为训练集数据

 2.2画图展示股票收盘价

from matplotlib.font_manager import FontProperties #设置绘图时的中文字体
myfont=FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf'# 设置中文
plt.figure(figsize=(12,8),dpi=600)   #设置图形和清晰度的大小
stock_train.plot() #画图
plt.title('股票收盘价',fontproperties=myfont)   #设置标题
plt.xlabel('时间',fontproperties=myfont)  #设置X轴标签
plt.ylabel('股票收盘价',fontproperties=myfont)  #设置y轴标签

#显著性水平在0.05以下表示时间序列平稳
from statsmodels.tsa.stattools import adfuller 
dftest = adfuller(stock_train)
dftest[1]

 Step3:确定模型参数

stock_diff_1 = stock_train.diff()  #df.diff()一阶差分
stock_diff_1

stock_diff = stock_diff_1.dropna()#dropna()滤除缺失数据
stock_diff

plt.figure(dpi=600)
plt.plot(stock_diff)
plt.show()

#再次adf检验
from statsmodels.tsa.stattools import adfuller #再次adf检验
dftest = adfuller(stock_diff)
dftest[1]

#绘制acf图
plt.figure(dpi=600)
acf = plot_acf(stock_diff, lags=20)
plt.title("ACF")
plt.xlabel("阶数",fontproperties=myfont)
plt.ylabel("自相关系数",fontproperties=myfont)
acf.show()

#绘制PACF图
plt.figure(dpi=600)
pacf = plot_pacf(stock_diff, lags=20)
plt.title("PACF")
plt.xlabel("阶数",fontproperties=myfont)
plt.ylabel("偏自相关系数",fontproperties=myfont)
pacf.show()#展示

#通过AIC准则确定p,q
import statsmodels.api as sm
res = sm.tsa.arma_order_select_ic(stock_diff,max_ar = 5,max_ma = 5,ic = ['aic']) 
res.aic_min_order

Step4: 训练模型

forcast_steps=50 # 请注意:步长超过30后,运行时间会超过 1 分钟。步长超过50后,运行时间会超过 3 分钟
model = sm.tsa.ARIMA(stock_train, order = (forcast_steps,1,forcast_steps),freq='W-MON')
model = model.fit()
pred_1 = model.forecast(steps=forcast_steps)
pred_1[-10:]
forcast_end_day = str(pred_1.index[-1].year)+'-'+str(pred_1.index[-1].month)+'-'+str(pred_1.index[-1].day+1)
forcast_end_day
stock_val = stock_week['2000-1-1':forcast_end_day]
stock_val
plt.figure(dpi=600)
plt.plot(stock_val)
plt.plot(pred_1) 

 

stock_train2 = stock_week
forcast_steps=50 # 请注意:步长超过30后,运行时间会超过 1 分钟。步长超过50后,运行时间会超过 3 分钟
model2 = sm.tsa.ARIMA(stock_train2, order = (forcast_steps,1,forcast_steps),freq='W-MON')
model2 = model2.fit()
pred_2 = model2.forecast(steps=forcast_steps)
pred_2[-10:]
plt.figure(dpi=600)
plt.plot(stock_train2)
plt.plot(pred_2) 


Step5: 检验模型

stock_actual = stock_week['20140609':'20160627']
print(stock_actual)
print(pred_1)
error_1=pow(stock_actual-pred_1,2)
MSE1=error_1.sum()/len(pred_1)
print(MSE1)

print(pred_2)
error_2=pow(stock_actual-pred_2,2)
MSE2=error_2.sum()/len(pred_2)
print(MSE2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值