利用ARIMA模型对股票的收盘价进行预测
先导入库并设置画图参数
%matplotlib inline
import pandas as pd
#import pandas_datareader 获取各种数据集库
import datetime
import matplotlib.pylab as plt
import seaborn as sns
from matplotlib.pylab import style
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
style.use('ggplot')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
导入数据,先大致看下:
stockFile = 'data/T10yr.csv'
stock = pd.read_csv(stockFile, index_col=0, parse_dates=[0]) #读数据,时间为索引
stock.head(10)
我们选择一列收盘价close进行预测并画图看下收盘价的浮动情况
#选择对收盘价进行预测
stock_week = stock['Close'].resample('W-MON').mean() #close列重采样
stock_train = stock_week['2000':'2015']
#看下收盘价的浮动
stock_train.plot(figsize=(12,8))
plt.legend(bbox_to_anchor=(1.25, 0.5))
plt.title("Stock Close")
sns.despine()
发现数据浮动比较大,所以应该差分处理,实际应用中,一阶差分即可
#一阶差分操作
stock_diff = stock_train.diff()
stock_diff = stock_diff.dropna()
#画图
plt.figure()
plt.plot(stock_diff)
plt.title('一阶差分')
plt.show()
现在数据变得平稳了,这时需要确定ARIMA模型的p、q参数,所以画ACF和PACF图
acf = plot_acf(stock_diff, lags=20)
plt.title("ACF")
acf.show()
q选1
pacf = plot_pacf(stock_diff, lags=20)
plt.title("PACF")
pacf.show()
p选1
此时p,d,q的参数都已经确定,用训练集训练model即可
#训练model,传入训练数据,order(p,d,q),以周为单位
model = ARIMA(stock_train, order=(1, 1, 1),freq='W-MON')
result = model.fit() #fit一下
#print(result.summary())
#进行预测
#需要指定起始时间(必须是训练数据中的)和终止时间(无所谓)
pred = result.predict('20140609', '20160701',dynamic=True, typ='levels')
print (pred)
2014-06-09 2.463559
2014-06-16 2.455539
2014-06-23 2.449569
2014-06-30 2.444183
2014-07-07 2.438962
…
2016-06-06 1.923405
2016-06-13 1.918250
2016-06-20 1.913094
2016-06-27 1.907939
2016-07-04 1.902784
Freq: W-MON, Length: 109, dtype: float64
这时已经得到了预测的收盘价值,画图和真实值比较一下
#画图看下预测值和真实值的差异
plt.figure(figsize=(6, 6))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(stock_train)
发现虽然有偏差,但是大体的方向是对的。