天天看点

ARIMA时序模型预测股价波动情况

今天来介绍一下如何使用时序ARIMA模型,预测未来一定情况的波动变化。以股票价格波动为例,我们选取某支股票每日的收盘价。

先来介绍下什么是ARIMA。ARIMA(AutoregRessive Integrated Moving Average),自回归差分移动平均模型,通过采用过去的观测结果,并考虑差分、自回归和移动平均分量来分离信号和噪声。

ARIMA,自回归差分移动平均模型,通过采用过去的观测结果,并考虑差分、自回归和移动平均分量来分离信号和噪声。

自回归模型AR

自回归模型描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测。自回归模型必须满足平稳性(平稳性要求序列的均值和方差不发生明显变化)的要求。自回归模型首先需要确定一个阶数p,表示用几期的历史值来预测当前值。p阶自回归模型的公式定义为:

ARIMA时序模型预测股价波动情况

移动平均模型MA

ARIMA时序模型预测股价波动情况

差分法

使用差分法可以使得数据更平稳,常用的方法就是一阶差分法和二阶差分法。

将自回归模型、移动平均模型和差分法结合,我们就得到了差分自回归移动平均模型ARIMA(p,d,q),其中:

p是自回归(AR)的项数,用来获取自变量,之前的p个数值当作自变量

d是差分(I)的系数,差分的意思就是后一行减前一行。d=1的意思,做一次差分。目的是为了使时间序列平稳

q是移动平均(MA)的项数,意思每一行被自身和自身之前的q-1行的平均数取代,为了使其光滑

注意:如果d=0时,ARIMA退化成ARMA模型

1. 使用akshare第三方库,获取股票信息

import akshare as ak
import talib
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
import seaborn as sns
from statsmodels.tsa.arima_model import ARIMA,ARMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from sklearn.metrics import mean_squared_error
from math import sqrt
from matplotlib.pyplot import MultipleLocator
import warnings
import matplotlib.ticker as ticker
#from matplotlib import pyplot
warnings.filterwarnings("ignore")

"""
date:交易日期
open:代表开盘价
high:当天最高价
low:当天最低价
close:当天收盘价
volume:当天成交量(元)
outstanding_share:流动股本(股)
turnover:换手率
"""
def get_codeData(code="sz002241"):
    df = ak.stock_zh_a_daily(symbol=code, start_date="20100101", end_date="20210314", adjust="qfq")
    return df
    
df = get_codeData(code="sz000789")
           

2. 利用股票的每日收盘价,作为我们的时序数据。由于原始数据太多,按照每一周来采样,更好预测,并取每一周的均值。

这里"W-MON"是从上周二统计到这周一,并打上这周一的标签。例如:

日 一 二 三 四 五 六

10   11   12   13   14   15   16

17   18   19   20   21   22   23

如果使用resample函数和参数"W_MON",那么:

date, quantity

2016-7-18, 354

意味着7-12、7-13、7-14、7-15、7-16、7-17、7-18这7天的数据结合在一起,成为7月18日周一这个时间戳的数据。

而如果使用resample函数和参数"W_SUN",那么:

date, quantity

2016-7-17, 301

意味着7-11、7-12、7-13、7-14、7-15、7-16、7-17这7天的数据结合在一起,成为7月18日周一这个时间戳的数据。

lit = ['close'] 
df = df[lit]
plt.plot(df['close'])   
plt.title('股市每日收盘价')
plt.show()

df_w = df['close'].resample('W-MON').mean()   
df_train_test = df_w['2015':'2021']   
           

 3. 划分训练集和测试集后,使用训练集来训练模型,对测试集中的数据进行测试。这里采用的是one-step的预测,即:每一次只预测下一天的情况,然后将这一天的真实数据加入history中,再同样预测下一天,最后使用MRSE来评估模型的性能

size = int(len(df_train_test) * 0.9)
train, test = df_train_test[0:size], df_train_test[size:len(df_train_test)]
print(len(train), len(test))
history = [x for x in train]
predictions = list()
# walk-forward validation
for t in range(len(test)):
    model = ARIMA(history, order=(1,1,1), missing='drop')
    model_fit = model.fit()
    output = model_fit.forecast()[0]
    predictions.append(output)
    history.append(test[t])
    print('predicted=%f, expected=%f' % (output, test[t]))

rmse = sqrt(mean_squared_error(test, predictions))
print('Test RMSE: %.3f' % rmse)

fig, ax = plt.subplots(1,1)
plt.plot(test.values, color='blue', label='Origin')
plt.plot(predictions, color='red', label='Predcition RMSE:%.3f' % rmse)
plt.title('sz000789 Price Prediction')
plt.xlabel('Time(Weeks)')
plt.ylabel('Price')
ax.xaxis.set_major_locator(ticker.MultipleLocator(base=100))
plt.xticks(range(len(test)), test.index, rotation=90)
plt.legend()
plt.show()
           

结果如下所示:模型性能RMSE 0.639

ARIMA时序模型预测股价波动情况

本文简要介绍了如何使用ARIMA模型进行预测的流程,其中对于如何选定模型参数p,d,q部分本文先暂且不表,之后会用另外的文章做详细介绍。

如果这篇文章对于你有帮助,欢迎点赞、评论和转发,是对我最大的支持!

参考资料:

1. https://blog.csdn.net/u010770993/article/details/70312504

2. http://sofasofa.io/forum_main_post.php?postid=1000324

继续阅读