时间序列----ARIMA 对苹果进行股价分析

import yfinance as yf
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
import matplotlib.pyplot as plt

# 加载数据
apple_stock = yf.download('AAPL', start='2023-01-01', end='2024-01-01')

# 确保数据按日期排序
# 假设apple_stock是你从yfinance下载的DataFrame
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')  # 'D'代表每日频率
apple_stock.index = pd.DatetimeIndex(apple_stock.index).normalize()  # 规范化索引以去除时间,保留日期
apple_stock = apple_stock.reindex(dates, method='ffill')  # 重新索引以填充缺失的日期,并向前填充数据

# 现在apple_stock有了一个明确的频率,可以再次尝试ARIMA模型

# 使用收盘价
closing_prices = apple_stock['Close']
[*********************100%%**********************]  1 of 1 completed
"""
参数优化对于ARIMA模型的性能至关重要。
理想的参数(p, d, q)能够最准确地捕捉到时间序列数据的特性,从而提高预测的准确性。
一种自动化寻找最佳ARIMA模型参数的方法是使用pmdarima库中的auto_arima函数。
这个函数通过遍历不同的参数组合,选择出最佳的模型
"""
# 使用.ffill()和.bfill()方法替代fillna(method='ffill')和fillna(method='bfill')
closing_prices = closing_prices.ffill()  # 向前填充,填充缺失值
closing_prices = closing_prices.bfill()  # 向后填充,确保数据集开头的NaN值被处理

# 现在可以安全地继续进行模型训练和分析
from pmdarima import auto_arima
model = auto_arima(closing_prices, start_p=0, start_q=0,
                   max_p=5, max_q=5, m=1,
                   start_P=0, seasonal=False,
                   d=None, D=0, trace=True,
                   error_action='ignore',  
                   suppress_warnings=True, 
                   stepwise=True)
print(model)
Performing stepwise search to minimize aic
 ARIMA(0,1,0)(0,0,0)[0] intercept   : AIC=1446.881, Time=0.02 sec
 ARIMA(1,1,0)(0,0,0)[0] intercept   : AIC=1448.420, Time=0.03 sec
 ARIMA(0,1,1)(0,0,0)[0] intercept   : AIC=1448.447, Time=0.15 sec
 ARIMA(0,1,0)(0,0,0)[0]             : AIC=1448.913, Time=0.01 sec
 ARIMA(1,1,1)(0,0,0)[0] intercept   : AIC=1450.074, Time=0.52 sec

Best model:  ARIMA(0,1,0)(0,0,0)[0] intercept
Total fit time: 0.741 seconds
 ARIMA(0,1,0)(0,0,0)[0] intercept

这个结果来自于auto_arima函数在尝试不同的ARIMA模型配置以最小化AIC(赤池信息量准则)值时产生的输出。AIC是评估统计模型相对质量的一种方式,用于模型选择。它考虑了模型的复杂度(参数数量)和模型对数据的拟合程度。较低的AIC值表示一个可能更优的模型。

输出解释

ARIMA(0,1,0)(0,0,0)[0] intercept: 这表示一个ARIMA模型,其中自回归(AR)部分的阶数为0,差分(I)部分的阶数为1,移动平均(MA)部分的阶数为0。这里的intercept表明模型包含截距项。AIC值为1446.881,这是此次搜索中的最低值。

其他ARIMA模型: 接下来列出了其他几种模型配置及其AIC值。例如,ARIMA(1,1,0)和ARIMA(0,1,1)都试图通过添加一个AR或一个MA项来改进模型,但AIC值更高,表示这些模型没有ARIMA(0,1,0)好。

Best model: 这一行指出了最佳模型是ARIMA(0,1,0)模型,包含截距项。

Total fit time: 指示auto_arima运行的总时间,本例中约为0.275秒。

结论

auto_arima根据AIC选择了ARIMA(0,1,0)模型作为最佳模型。这意味着,在尝试的模型中,仅对序列进行一次差分(使其平稳)就足够了,而无需进一步的AR或MA项来解释数据中的自相关性。简单来说,这个模型预测未来的值仅仅是基于当前值与上一值之间的差分,而不依赖于更复杂的自回归或移动平均结构。



# 为了示例简单,我们这里不做参数优化,直接选择(1,1,1)作为ARIMA模型的参数
# 实际使用时,应通过ACF、PACF图或自动化方法选择最佳参数
# model = ARIMA(closing_prices, order=(1, 1, 1))

model = ARIMA(closing_prices, order=(0, 1, 0))
model_fit = model.fit()

# 进行预测
forecast = model_fit.forecast(steps=5)  # 预测未来5天的价格
print(forecast)

# 绘制实际收盘价和预测值
plt.figure(figsize=(10, 6))
closing_prices.plot(label='Actual', legend=True)
forecast.plot(label='Forecast', legend=True, color='red')
plt.title('Apple Inc. (AAPL) Closing Price and Forecast')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.grid(True)
plt.show()

2024-01-01    192.529999
2024-01-02    192.529999
2024-01-03    192.529999
2024-01-04    192.529999
2024-01-05    192.529999
Freq: D, Name: predicted_mean, dtype: float64

在这里插入图片描述

1 平稳性(Stationarity)检验

视觉检查
首先,通过绘制时间序列图来进行视觉检查:

import matplotlib.pyplot as plt

closing_prices.plot()
plt.title('Closing Price Time Series')
plt.xlabel('Date')
plt.ylabel('Closing Price')
plt.show()

在这里插入图片描述

如果图中显示出明显的趋势或季节性波动,那么数据很可能是非平稳的。

ADF检验(Augmented Dickey-Fuller Test)

然后,使用ADF检验来统计地测试时间序列的平稳性:

from statsmodels.tsa.stattools import adfuller

result = adfuller(closing_prices)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value in result[4].items():
    print('\t%s: %.3f' % (key, value))
ADF Statistic: -2.544397
p-value: 0.105042
Critical Values:
	1%: -3.448
	5%: -2.870
	10%: -2.571

ADF统计量:-2.544397。这是测试结果的主要统计量,用于与临界值比较。
p值:0.105042。p值用于判断统计显著性。在这里,p值大于常用的显著性水平(如0.05),这意味着我们不能拒绝原假设,原假设认为时间序列具有单位根,即非平稳。
临界值:对于不同的显著性水平(1%,5%,和10%),分别有-3.448、-2.870和-2.571。ADF统计量需要比这些临界值更负,才能认为时间序列是平稳的。
结论
由于ADF统计量(-2.544397)高于任何显著性水平下的临界值,并且p值(0.105042)大于0.05,我们无法拒绝原假设。因此,根据ADF检验的结果,我们有理由相信该时间序列是非平稳的。
下一步

由于时间序列非平稳,进行ARIMA建模前需要先使序列平稳。常见的方法是对时间序列进行差分,即从当前观察值中减去前一观察值。差分操作通常能够帮助消除趋势和季节性,使时间序列变得平稳。

# 对时间序列进行一阶差分
closing_prices_diff = closing_prices.diff().dropna()

# 再次进行ADF检验
result_diff = adfuller(closing_prices_diff)
print('ADF Statistic: %f' % result_diff[0])
print('p-value: %f' % result_diff[1])

ADF Statistic: -18.334804
p-value: 0.000000

这个结果表明,经过一次差分后,时间序列变得平稳。因此,你可以使用这个差分后的序列来建立ARIMA模型。

下一步
既然时间序列已经是平稳的,你现在可以开始确定ARIMA模型的参数(p, d, q):

p: AR(自回归)项的阶数,可以通过观察PACF(偏自相关图)来估计。
d: 差分阶数,根据我们的差分操作,你已经知道d=1。
q: MA(移动平均)项的阶数,可以通过观察ACF(自相关图)来估计。

注意,进行差分后,ARIMA模型中的d参数至少为1,因为你已经进行了一次差分。

2 自相关性(Autocorrelation)检查

ACF图和PACF图
自相关图(ACF)和偏自相关图(PACF)可以帮助你确定ARIMA模型中的AR(p)和MA(q)参数。

ACF图:ACF图可以帮助你确定MA部分的阶数(q参数)。寻找ACF图中超出置信区间的滞后期数量,这可以作为q参数的一个估计。

PACF图:PACF图可以帮助你确定AR部分的阶数(p参数)。同样地,查找PACF图中超出置信区间的滞后期数量,以估计p参数。

from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 绘制ACF图
plot_acf(closing_prices_diff)
plt.title('ACF of 1st Differenced Series')
plt.show()
"""
在ACF图中:

x轴表示滞后数,即当前值与之前值之间的时间间隔。
y轴表示自相关系数,衡量当前值与过去值之间的相关程度。
图中的蓝色条形图表示每个滞后数的自相关系数。
蓝色阴影区域代表置信区间,默认情况下通常设置为95%。如果某个滞后数的条形图超出了这个区域,表示该滞后数的自相关性是统计显著的。
解读ACF图
如果ACF图在某几个滞后数后迅速下降到0,并在置信区间内,这可能表明时间序列没有自相关性,或者需要较低阶数的MA模型。
如果ACF图的条形图在多个滞后数上都超出置信区间,这可能表明时间序列具有较强的自相关性,需要较高阶数的MA模型。
"""

# 绘制PACF图
plot_pacf(closing_prices_diff)
plt.title('PACF of 1st Differenced Series')
plt.show()

在这里插入图片描述

绘制PACF图

plot_pacf(closing_prices_diff)
plt.title(‘PACF of 1st Differenced Series’)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 34
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值