Python时间序列--股票预测(七)

1.数据获取

import pandas as pd
import datetime
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
#可以适用接口从雅虎获取股票数据
start=datetime.datetime(2000,1,1)
end=datetime.datetime(2015,12,31)
prices=web.DataReader('002578.SZ','yahoo',start,end)
prices.head()
#存入本地
prices.to_csv('data/yahoo.csv')
#从本地读取数据  本文用的是本地数据,未用接口数据
stock = pd.read_csv('data/yahoo.csv', index_col=0, parse_dates=[0])
stock.head(10)

2.训练数据

#下采样  日频数据太多
stock_week = stock['Close'].resample('W-MON').mean()
#训练数据
stock_train = stock_week['2000':'2015']

3.数据平稳性检测

#绘出数据折线图,查看数据是否平稳
stock_train.plot(figsize=(12,8))
plt.legend(bbox_to_anchor=(1.25, 0.5))
plt.title("Stock Close")
sns.despine()

Python时间序列--股票预测(七)_第1张图片
从图中可以很明显看出数据是不平稳的。

4.一阶差分

stock_diff = stock_train.diff()
stock_diff = stock_diff.dropna()

plt.figure()
plt.plot(stock_diff)
plt.title('一阶差分')
plt.show()

Python时间序列--股票预测(七)_第2张图片ACF&PACF确定q、p

acf = plot_acf(stock_diff, lags=20)
plt.title("ACF")
acf.show()

Python时间序列--股票预测(七)_第3张图片

pacf = plot_pacf(stock_diff, lags=20)
plt.title("PACF")
pacf.show()

Python时间序列--股票预测(七)_第4张图片

一阶差分后,ACF&PACF基本上都落在了0轴上,表明一阶差分就够用了。并且可确定pqd的的取值都为1。

5.模型训练

model = ARIMA(stock_train, order=(1, 1, 1),freq='W-MON')
model_pred = model.fit()

6.残差检测

from statsmodels.graphics.api import qqplot
#残差
resid=model_pred.resid.values
fig=plt.figure(figsize=(12,8))
fig=qqplot(resid,line='q',fit=True)

Python时间序列--股票预测(七)_第5张图片Q-Q图显示符合标准正态分布,模型可用来预测。

7.预测

pred = result.predict('20140609', '20160701',dynamic=True, typ='levels')
plt.figure(figsize=(6, 6))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(stock_train)

Python时间序列--股票预测(七)_第6张图片
股票预测一般是不能准确是预测具体的值,但可以预测走势。

你可能感兴趣的:(Python时间序列)