介绍
本文整理记录了参与的一次小型数据分析竞赛【数据游戏】,竞争目标是预测2019年5月15日A股闭市时招商银行600036的股价。
主要思路是利用ARIMA算法做时间序列预测。
使用的数据是公开的数据集 tushare。
拿到题目和数据之后,首先结合既往经历,觉得想要预测准股价,本身是一个不可能的事情,尤其是A股。
影响股价的因素非常复杂而且不透明,以及金融投资领域具有的反身性理论,使得这次预测更多偏向于实验性质,同时对竞争结果不要有过高的期望。
预测得准,是你的运气;预测的烂,也不会影响你从中学到什么。学习第一,比赛第二吧。
鉴于以上,本次预测只使用了close的时间序列。更多的数据其实并没有什么用。
首先了解下本文的 ARIMA 建模过程:
- 获取时间序列数据 ;
- 观察数据是否为平稳时间序列;对于非平稳时间序列要先进行d阶差分运算,转化为平稳时间序列;
- 对处理得到的平稳时间序列,求它的阶数p, q
- 根据ARIMA算法建模,ARIMA(data, order=(p, d, q))
- 模型检验和调优
- 预测
初学的小伙伴们可能对这个过程并不熟悉,没关系,先背下来。
对Python不熟悉的小伙伴们, 我给大家总结了几句车轱辘话,大家先强行了解下:
- 获取时间序列数据 ;
data = pd.read_excel(‘600036.xlsx’, index=None)
train = data[‘close’]
- 观察数据是否为平稳时间序列;对于非平稳时间序列要先进行d阶差分运算,转化为平稳时间序列;
adf_data = sts.adfuller(train)
diff = train.diff(1)
- 对处理得到的平稳时间序列,求它的阶数p, q
sm.tsa.arma_order_select_ic(train, max_ar=8, max_ma=8, ic=[‘aic’, ‘bic’, ‘hqic’])
- 根据ARIMA算法建模
ARMAModel = sm.tsa.ARIMA(train, order=(4,1,2)).fit()
- 模型检验和调优
train_shift = train.shift(1)
pred_recover = predicts.add(train_shift)
np.sqrt( sum( (pred_recover -train) ** 2)/train.size )
- 预测
f = ARMAModel.forecast(3)
以上,是本文的核心代码,大家如果一时看不懂,可以跳过。
可以看看下面更详细的步骤。
导入数据并处理
# 导入必须的模块
import tushare as ts #使用的公开的数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import statsmodels.tsa.stattools as sts
import wconfig as wc #自定义打印输出控制模块,与本次竞赛无关
wc.dispy()
# 导入数据,从去年1月开始即可
data = ts.get_hist_data('600036', start='2018-01-08', end='2019-05-10').sort_index()
#data = ts.get_hist_data('600036', start='2018-04-01').sort_index().reset_index()
# 数据安全和源数据备份
#data.to_excel('600036.xlsx')
# 源数据可靠性检查。12日发现tushare的数据有错误,需要手工矫正(13日该数据恢复正常)。
print('tushare中5月10日close股价为: %.2f元,与实际不符!' % (data['close']['2019-05-10']))
data['close']['2019-05-10']=33.61
print('当日实际收盘价应为: %.2f元' % dat