股票价格的ARIMA预测:以茅台股价为例
【摘要】 ARIMA模型,即整合移动平均自回归模型,是最有名的时间序列预测方法之一,包括自回归模型(AR模型)、移动平均模型(MA模型)、自回归-移动平均混合模型(ARMA模型)、整合移动平均自回归模型(ARIMA)。那么,它能否用来预测股票价格呢?我们以茅台(600519.SH)为例,做个简单的展示。数据获取首先,导入几个常用的包:import numpy as npimport pandas as...
ARIMA模型,即整合移动平均自回归模型,是最有名的时间序列预测方法之一,包括自回归模型(AR模型)、移动平均模型(MA模型)、自回归-移动平均混合模型(ARMA模型)、整合移动平均自回归模型(ARIMA)。那么,它能否用来预测股票价格呢?我们以茅台(600519.SH)为例,做个简单的展示。
-
数据获取
首先,导入几个常用的包:
import numpy as np
import pandas as pd
import datetime
from matplotlib import pyplot as plt
然后,调用我们的数据接口,读取茅台的股价并进行一些简单的处理:
import data_operate as do
data = do.curfsql("select format(trade_date, '%Y-%m-%d'), close from daily where ts_code='600519.SH'")
data[0] = data[0].apply(lambda x: x.replace(',', '')[:8])
data.columns = ['trade_date', 'close']
data.index = data['trade_date'].apply(lambda x: datetime.datetime.strptime(x, '%Y%m%d'))
data.drop(columns='trade_date', inplace=True)
data = data['close']
data = data.resample('M').mean().ffill()
data
2. 数据可视与平稳性检验
先观察一下原始数据:
data.plot(figsize=(12,4))plt.title('600519.SH')
然后,对原始数据进行平稳性检验:
adfuller(data)
很明显数据是不平稳的,所以对数据进行一阶差分并再次进行平稳性检验:
data_diff1 = data.diff().dropna()
data_diff1.plot(figsize=(12,4)
adfuller(data_diff1)
数据仍然不平稳,所以再次对数据进行差分:
data_diff2 = data.diff().diff().dropna()
data_diff2.plot(figsize=(12,4))
adfuller(data_diff2)
数据终于平稳了。
有些年度数据可能具有明显的季节性,更适合用年度同比,此时,可以考虑一下:
data_diff12 = data.diff(12).dropna()
data_diff12.plot(figsize=(12,4))
adfuller(data_diff12)
3. 白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
acorr_ljungbox(data, lags=[6, 12, 24], return_df=True)
4. 定阶
先使用BIC准则进行定阶:
from statsmodels.tsa.stattools import arma_order_select_ic
arma_order_select_ic(data_diff_quarterly, max_ar=10, max_ma=10, ic='bic')
这里的max_ar和max_ma表示,最高阶数为10,主要是为了减少计算量,但有时可能因此而丢失精度,可以通过acf图和pacf图观察一下:
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(data_diff_quarterly)
plot_pacf(data_diff_quarterly)
在我们这里,阶数基本上是合理的。
5. 模型求解
from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(data, order=(5, 2, 10)).fit()
model.summary()
可以看到,大部分变量都是显著的。
6. 结果可视化
先来看残差的可视化:
fig, axs = plt.subplots(2, 2)
fig.subplots_adjust(hspace=0.3)
model.resid.plot(ax=axs[0][0])
axs[0][0].set_title('line')
model.resid.plot(kind='hist', ax=axs[0][1])
axs[0][1].set_title('hist')
sms.qqplot(model.resid, line='45', fit=True, ax=axs[1][0])
axs[1][0].set_title('qqplot')
plot_acf(model.resid, ax=axs[1][1])
axs[1][1].set_title('acf')
从残差看,厚尾效应还是比较明显的。
再来看预测结果:
preds = model.predict(0, len(data)+6)
data.plot(color='g', label='true', figsize=(12,4))
preds.plot(color='r', label='predicts')
plt.legend()
从结果上看,效果还是不错的。当然,这只是一个简单的例子,用的也是月度平均价格,是否能够,以及如何应用于实战显然还需要非常深入地研究。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)