ARIMA预测股票收盘最高价[尝试和提问]

ARIMA定义和原理

一、ARIMA模型的基本原理

ARIMA模型的名称由自回归(AR)、差分(I)和移动平均(MA)三个部分组成,表示为ARIMA(p,d,q)。其中,AR表示自回归,p为自回归项数;I表示差分,d为使之成为平稳序列所做的差分次数(阶数);MA表示滑动平均,q为滑动平均项数。ARIMA模型的基本思想是将非平稳时间序列转化为平稳时间序列,然后通过建立ARMA模型进行预测。

ARIMA的步骤

1.数据预处理:对原始数据进行清理和转换,使其满足建模要求。例如,处理缺失值、异常值等。(数据用的是上一篇博客的数据,前100行基本没有需要数据清洗的)

path1,path2 = "000001.XSHE.csv","000063.XSHE.csv",
time = "trade_date"
feature = "high"
length = 100

#指定最高收盘价那一列前100行的数据
mon1, mon2 = pd.read_csv(path1)[feature][:length],pd.read_csv(path2)[feature][:length]

2.平稳性检验(ADF检验):通过绘制时序图、自相关图等手段,观察时间序列数据的平稳性。如果数据不平稳,需要进行差分处理,使其平稳。主要看P值。

p值小于0.05,拒绝原假设,数据平稳 在显著性水平为 5% 的情况下,临界值为 -2.9044395987933362。由于 ADF统计量小于 5% 显著性水平下的临界值,我们可以拒绝原假设,即原始数据具有单位根,表明原始数据在统计意义上是平稳的。

# 原始数据的ADF检验
# adfuller 函数用于执行ADF检验。它返回ADF统计量、p值和临界值
result_original = adfuller(mon1)

#ADF统计量
print('ADF Statistic for original data:', result_original[0])

#p值
print('p-value:', result_original[1])

#临界值
print('Critical Values:')
for key, value in result_original[4].items():
    print(f'{key}: {value}')

# 进行一阶差分
mon1_diff = np.diff(mon1,n=1)
result_diff = adfuller(mon1_diff)
print('\nADF Statistic for differenced data:', result_diff[0])
print('p-value:', result_diff[1])
print('Critical Values:')
for key, value in result_diff[4].items():
    print(f'   {key}: {value}')

# 绘制差分后的时间序列
plt.figure(figsize=(10, 6))
plt.plot(mon1_diff)
plt.title('First Difference of Time Series')
plt.xlabel('Time')
plt.ylabel('Differenced Value')
plt.grid(True)
plt.show()

3.模型定阶:根据自相关图和偏自相关图等手段,确定ARIMA模型的阶数p、d、q。

如何确定p,d,q

通过观察时间序列的自相关函数(ACF)和偏自相关函数(PACF)来判断。
1、截尾判断:在ACF和PACF图中,自相关系数和偏自相关系数在某个阶数之后接近于零或者在某个阶数之后急剧下降,则可以判断为截尾。这表示时间序列的相关性在该阶数之后逐渐减弱,数据不再受之前的值的影响。


2、拖尾判断:在ACF和PACF图中,自相关系数和偏自相关系数在某个阶数之后仍然保持较高的值或者在某个阶数之后出现明显的周期性波动,则可以判断为拖尾。这表示时间序列的相关性在该阶数之后仍然存在,存在长期的依赖关系。

# 检查时间序列的平稳性
# 如果需要,对时间序列进行一阶差分 
mon1_diff = mon1.diff().dropna()

# 绘制自相关函数(ACF)和偏自相关函数(PACF)图
#确定移动平均阶数 ( q ):
#使用差分后的序列数据,绘制其自相关函数(ACF)图。
#ACF图上的截尾点可以帮助确定MA模型的阶数 ( q )。截尾点之前的滞后阶数反映了可以用来拟合数据的MA模型的阶数。
plot_acf(mon1_diff)

#使用一阶差分后的序列,绘制PACF图。观察PACF图的截尾点,该截尾点之前的滞后阶数可以作为AR模型的阶数 ( p )。
plot_pacf(mon1_diff,lags = 8)
plt.show()

确定d = 1,q = 1,p = 1

预测和结果

# 拟合 ARIMA 模型
model = ARIMA(mon1, order=(p, d, q))
model_fit = model.fit()

# 模型诊断
# 检查模型的残差
residuals = model_fit.resid

# 进行预测
forecast_steps = 10  # 假设预测未来10个时间点
forecast = model_fit.forecast(steps=forecast_steps)

# 原始数据的长度
original_length = len(mon1)

# 生成未来时间点的索引
forecast_index = range(original_length, original_length + len(forecast))

# 绘制原始数据
plt.figure(figsize=(10, 6))
plt.plot(range(original_length), mon1, label='Original data', color='blue')

# 绘制预测数据
plt.plot(forecast_index, forecast, label='Forecast', color='red')

#绘制实际
mon_acc = pd.read_csv(path1)[feature][original_length:(forecast_steps+original_length)]
plt.plot(forecast_index,mon_acc, label='accuracy', color='yellow')

plt.title('ARIMA Model Forecast')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()

总结

股票类数据只选取了前100行的数据,如果选取超过300行,当d=1的时候就不是平稳的时间序列数据,需要调整d的大小。总体计算下来,预测不太理想,不知道是否是股票类数据不能用ARIMA来预测,还是说我截尾的点找错了。如果有大佬能解答就太好了(非常感谢)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值