第一篇文章传送门: Python爬取中国银行外汇牌价(爬虫 + PyFlux简单预测分析)--(一)html
若是数据还没获取到的话请移步看第一篇文章(本篇文章默认数据已存储在数据库中)git
df['查询时间'] = df['查询时间'].apply(lambda x: x[:-9])
df['查询时间'] = pd.to_datetime(df['查询时间'], format="%Y-%m-%d")
df = df.groupby('查询时间')['现汇卖出价'].mean()
df = df.to_frame()
print(df)
复制代码
# 差分图
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(111)
# 里面的1表明了差分阶数
diff1 = df.diff(1)
diff1.plot(ax=ax1)
plt.show()
# fig.savefig('./picture/1.jpg')
复制代码
介绍一些自相关性和非自相关性:github
接下来选择40个滞后作自相关和偏自相关的分析数据库
# statmodels 自相关图 偏相关图
diff1 = diff1.dropna()
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(diff1, lags=40, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(diff1, lags=40, ax=ax2)
fig.show()
# fig.savefig('./picture/acf_pacf.jpg')
复制代码
接下来由看图观察定义ARMA模型的p(自相关系数), q(偏自相关系数)参数:app
能够尝试以下p, q参数的模型, 并输出AIC,BIC,HQIC的结果机器学习
尝试结果以下:post
模型选择:学习
arma_mod22 = sm.tsa.ARMA(diff1, (3, 2)).fit()
# 输出AIC,BIC和HQ准则结果
print(arma_mod22.aic, arma_mod22.bic, arma_mod22.hqic)
复制代码
# 残差(输出形式为DataFrame)
resid = arma_mod22.resid
# 残差的ACF和PACF图
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=40, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(resid, lags=40, ax=ax2)
fig.show()
# fig.savefig('./picture/resid_acf_pacf.jpg')
复制代码
# 残差D-W检验
resid_dw_result = sm.stats.durbin_watson(arma_mod22.resid.values)
# 1.9933441709003574 接近于 2 因此残差序列不存在自相关性。
print(resid_dw_result)
复制代码
# 正态校验 -> 基本符合正态分布
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
fig = sm.qqplot(resid, line='q', ax=ax, fit=True)
fig.show()
# fig.savefig('./picture/normal_distribution.jpg')
复制代码
# 残差序列Ljung-Box检验,也叫Q检验
r, q, p = sm.tsa.acf(resid.values.squeeze(), qstat=True)
data = np.c_[range(1, 41), r[1:], q, p]
table = pd.DataFrame(data, columns=['lag', "AC", "Q", "Prob(>Q)"])
temp_df = table.set_index('lag')
print(temp_df)
# Prob(>Q)的最小值: 0.025734615668093132, 最大值: 0.9874705305611844, 均值: 0.2782013984159408
prob_q_min = temp_df['Prob(>Q)'].min()
prob_q_max = temp_df['Prob(>Q)'].max()
prob_q_mean = temp_df['Prob(>Q)'].mean()
print("Prob(>Q)的最小值: {}, 最大值: {}, 均值: {}".format(prob_q_min, prob_q_max, prob_q_mean))
复制代码
# 预测
predict_data = arma_mod22.predict('2018-11-09', '2018-11-14', dynamic=True)
# 画预测图
fig, ax = plt.subplots(figsize=(12, 8))
ax = diff1.ix['2018-01-01':].plot(ax=ax)
fig = arma_mod22.plot_predict('2018-11-09', '2018-11-14', dynamic=True, ax=ax, plot_insample=False)
fig.show()
# 结果预测
last_data = df['现汇卖出价'].values[-1]
# 还原结果
predict_data_list = predict_data.values.tolist()
restore_list = []
for d in predict_data_list:
last_data = last_data + d
restore_list.append(last_data)
predict_data = pd.DataFrame(restore_list, index=predict_data.index, columns=['现汇卖出价'])
print(predict_data)
复制代码