数据集来源于yahoo财经股票数据。下载方式:
import pandas_datareader.data as web
## 使用 pandas-datareader 来读取股票数据
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2017,12,31)
prices = web.DataReader('002578.SZ', 'yahoo', start, end)
prices.head()
prices.to_csv("stock-train.csv")
#读取数据
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima_model import ARIMA
%matplotlib inline
stock = pd.read_csv('stock-train.csv', index_col=0, parse_dates=[0])
stock.tail(10)
stock_week = stock['Close'].resample('W-MON').mean()
stock_train =stock_week['2010':'2017']
#数据趋势图
sns.set_style('whitegrid')
plt.figure(figsize=(12,8))
stock_train.plot()
plt.legend(bbox_to_anchor=(1.25, 0.5))
plt.title('Close Price')
sns.despine()
一阶差分
ARIMA 模型对时间序列的要求是平稳型。因此,当你得到一个非平稳的时间序列时,首先要做的即是做时间序列的差分,直到得到一个平稳时间序列。如果你对时间序列做d次差分才能得到一个平稳序列,那么可以使用ARIMA(p,d,q)模型,其中d是差分次数。
stock_diff = stock_train.diff()
stock_diff = stock_diff.dropna()plt.figure(figsize=(12,8))stock_diff.plot()
plt.title(u'一阶差分')
plt.show()
ACF & PACF
fig = plt.figure(figsize=(10,8))
ax1 = fig.add_subplot(211)
fig = plot_acf(stock_diff, lags=20, ax=ax1)
plt.title('ACF')ax2 = fig.add_subplot(212)
fig = plot_pacf(stock_diff, lags=20, ax=ax2)
plt.title('PACF')plt.show()
ACF & PACF 一阶差分之后都落到了 0轴上,表示我们只需要一阶差分就好了!
——***ARIMA***——
时间序列分析--ARIMA模型
指数平滑法对时间序列上连续的值之间的相关性没有要求。但是,如果你想使用指数平滑法计算出预测区间, 那么预测误差必须是不相关的, 且必须是服从零均值、 方差不变的正态分布。即使指数平滑法对时间序列连续数值之间相关性没有要求,在某种情况下, 我们可以通过考虑数据之间的相关性来创建更好的预测模型。 自回归移动平均模型( ARIMA)是最常用的时间序列预测模型。
ARIMA模型
全称为 自回归积分滑动平均模型(Autoregressive Integrated Moving Average Model, 简记ARIMA),ARIMA(p,d,q)模型是针对非平稳时间序列所建立的模型。根据时间序列是否平稳以及回归中所含部分的不同,可分为:
移动平均过程(MA(q))
自回归过程(AR(p))
自回归移动平均过程( ARMA(p,q) )
自回归积分滑动平均过程 ( ARIMA(p,d,q) )
stock_train = stock_train.dropna()
model = ARIMA(stock_train, order=(6,1,6), freq='W-MON')
model_fit = model.fit(disp=0,maxiter=100)
print(model_fit.summary())
用QQ 图验证是否符合正态分布
from statsmodels.graphics.api import qqplot
# 残差
resid = model_fit.resid.values
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
fig = qqplot(resid, line='q', ax=ax, fit=True)
#模型预测
pred = model_fit.predict('20171127', '20180502', dynamic=True, typ='levels')
print (pred)
#预测结果数据展示
plt.figure(figsize=(12,8))
plt.plot(pred)
plt.plot(stock_train)
推荐阅读:
机器学习篇
机器学习入门科普篇--系列一
机器学习入门科普篇--系列二
客户流失分析
全球变暖温度分析图
python学习篇
优雅的Python
让你的 Python 代码优雅又地道