Author: sunhailin-Leo

E-mail:379978424@qq.com

简介

如果数据还没获取到的话请移步看第一篇文章(本篇文章默认数据已存储在 数据库 中)

步入正题

上一篇文章末尾部分在讲使用Pyflux这个库对数据进行分析预测

总结两个方面:

优点:

Pyflux模型文档"一针见血"(建立在对时序分析有一定基础的人, 能看懂部分核心公式)

缺点:

提供少量的数据分析API, 不像statsmodels提供了例如残差分析等方法进行模型验证调优的方法

本文将使用statsmodels对此前的数据进行分析。

数据前期准备

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)

复制代码

数据平稳性校验

直接上代码(差分画图看数据平稳性)

一共测试了1阶和2阶(不建议使用高阶数据, 容易数据造成破坏)

# 差分图

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')

复制代码

一阶差分结果

二阶差分结果

结论:由观察可得出一阶差分波动相对较小,较为平稳 ( 之后建模的数据使用1阶差分的结果进行建模 )

自相关图和偏自相关图

介绍一些自相关性和非自相关性:

自相关性(ACF): 自相关性是指随机误差项的各期望值之间存在着相关关系,称随机误差项之间存在自相关性(autocorrelation)或序列相关

偏自相关性(PACF): 偏自相关是剔除干扰后时间序列观察与先前时间步长时间序列观察之间关系的总结(Partial autocorrelation)

接下来选择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(偏自相关系数)参数:

自相关图显示滞后有三个阶超出了置信边界

偏相关图显示在滞后2阶时的偏自相关系数超出了置信边界(其实波动还是没有完全消除, 只是2阶的时候比较突出)

可以尝试如下p, q参数的模型, 并输出AIC,BIC,HQIC的结果

AIC:赤池信息量 akaike information criterion --> -2ln(L) + 2k

BIC:贝叶斯信息量 bayesian information criterion --> -2ln(L) + ln(n) * k

HQIC:HQ准则 --> -2ln(L) + ln(ln(n)) * k

L是在该模型下的最大似然,n是数据数量,k是模型的变量个数。

尝试结果如下:

p=2, q=0 --> -194.77200890459767 -179.81283725588074 -188.79262385129292

p=2, q=1 --> -197.01722373566554 -178.31825917476937 -189.54299241903462

p=2, q=2 --> -195.11076756537022 -172.6720100922948 -186.1416899854131

p=3, q=2 --> -201.37730533090803 -175.19875494565338 -190.91338148762475

模型选择:

在上述的结果看来选择p=2, q=2为最优办法, 虽然不一定是最适合, 但是在差分和根据自相关和偏自相关图的结果看来, 可以尝试使用(2, 2)参数进行建模

建模

建模的代码很短,就不做过多叙述,看下述代码

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验证

D-W验证是检验自相关性的方法(只适用于检测1阶自相关性, 高阶需要另辟蹊径)

# 残差D-W检验

resid_dw_result = sm.stats.durbin_watson(arma_mod22.resid.values)

# 1.9933441709003574 接近于 2 所以残差序列不存在自相关性。

print(resid_dw_result)

复制代码

结果等于1.9933441709003574

结论:残差序列不存在自相关性

理由:DW结果接近2的时候序列几乎不存在自相关性(参考文章: www.doc88.com/p-543541848… )

正态分布

# 正态校验 -> 基本符合正态分布

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')

复制代码

除了右上角的部分异常点(这几个点的数据很直观的在接下来的Q检验中显现出来)

由图得出,绝大部分数据还是符合正态分布

Q检验

# 残差序列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))

复制代码

结果:Prob(>Q)的最小值: 0.025734615668093132, 最大值: 0.9874705305611844, 均值: 0.2782013984159408

由上图可以看到最后10个数据的值几乎在0.05左右,可以对应回正态分布的那些离散点的值

根据Q校验的方法, 在95%的置信区间内, 当Prob大于0.05当前残差序列不存在自相关性, 因此滞后40个数据的模型属于基本不存在自相关性。

预测(预测从11月9日到11月14日的汇率变动)

由于此前将数据进行了1阶差分,因此预测结果的数据也是1阶差分的预测值

# 预测

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)

复制代码

注:以上预测数据均为当天的汇率的均值

总结

以上的分析、建模、校验、预测的流程只是简单的一个流程.预测模型准确性还需要不断验证, 以上的关键代码仅提供了一套可以参考的流程.

时序数据预测与分析还有待学习,针对不同类型的数据和多变量的数据有着不同的模型, 以上步骤仅供参考.

目前使用过时序预测的库有:statsmodels和pyflux, 之后考虑使用机器学习或者深度学习的方法进行预测.

python 分析外汇数据_Python爬取中国银行外汇牌价(statsmodels预测分析)--(二)相关推荐

  1. python获取游戏数据_Python 爬取 3 万条游戏评分数据,原来程序员最爱玩的游戏竟然是.........

    原标题:Python 爬取 3 万条游戏评分数据,原来程序员最爱玩的游戏竟然是...... 作者 |量化小白H 责编 | 胡巍巍 本文爬取了豆瓣游戏网站上所有可见的游戏评分数据进行分析,全文包括以下几 ...

  2. python电商数据挖掘_Python 爬取淘宝商品数据挖掘分析实战

    作者 孙方辉 本文为CDA志愿者投稿作品,转载需授权 项目内容 本案例选择>> 商品类目:沙发: 数量:共100页 4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目 ...

  3. python爬虫天气数据_Python爬取真气网天气数据

    使用工具:pycharm,Chrome driver 使用库:selenium 前言: 我们无时无刻不在呼吸着周围的空气, 可身边的空气质量怎样呢? 嗯~~~ 大多数人会沉思一会儿, 最后还是会说:不 ...

  4. python爬虫企业数据_python爬取企业名录并入库

    #!/usr/bin/env python2#-*-coding:utf-8-*- '''@version: python2.7 @author: 'zyjsuper' @license: Apach ...

  5. python爬取网页json数据_python爬取json数据库

    手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. [二. ...

  6. python爬取天气数据_Python爬取历史天气数据

    Python爬取历史天气数据 作者:梅昊铭 1. 导读 之前Mo给大家分享过杭州历年天气情况的数据集,相信有不少小伙伴好奇这些数据是怎么获取.今天Mo就来教大家如何使用Python来进行历史天气数据的 ...

  7. python爬取客流数据_Python爬取南京地铁微博发布客流数据并进行分析

    Python爬取南京地铁微博发布客流数据并进行分析 之前在网上看到了分析北京地铁客流数据的开源项目,就想试着分析一下南京地铁的客流数据,可是找了很久没有找到可以获得南京地铁客流数据的接口,就去南京地铁 ...

  8. python爬携程上出境游数据_python爬取携程旅游评价信息词云图分析

    python爬取携程旅游评价信息词云图分析 前言 前面咱们已经分析过如何爬取携程旅游的相关信息,如果没有看过的,可以先跳转看一下前面的那篇博客:python 爬虫 一键爬取携程旅游团数据 这一篇呢,咱 ...

  9. python分析b站_Python爬取并分析B站最热排行榜,我发现了这些秘密

    现在大家的生活中,已经越来越离不开B站了,2020年的第一季度,B站月活跃用户达到了1.72亿,日活跃用户也已经突破了5000万个用户.源源不断的流量让B站的up主们也是粉丝数目不断暴涨,百万粉丝的u ...

最新文章

  1. 京东大数据:南方姑娘更爱驾驭8cm以上高跟鞋
  2. 上下文菜单Context Menu
  3. linux 内核驱动 insmod mknod的作用
  4. cmake 构建路径_新手必备:win10 系统下 VSCode+CMake+Clang+GCC 环境的搭建
  5. opencv2.2版本中访问像素点的效率问题
  6. [转载] python 命名空间
  7. Java快逸报表展现demo,快逸报表展示图片—来自数据库中的图片
  8. 网络时间协议 --- 网络对时程序
  9. ES6新特性有哪些?
  10. Vue运行环境及淘宝镜像(cnpm命令)安装
  11. 关于启动报错:Field xxxMapper in com.xxx.service.impl.xxxServiceImpl required a bean of type的解决方案
  12. 163邮箱登录入口大全,你知道163邮箱登录入口怎么登录吗?
  13. OTT发展背后的融合通讯
  14. Android Studio:使用SVN进行版本控制
  15. 站长们如何优化自已的新网站
  16. DO-Conv 涨点模块
  17. 计算机数据传输9600波特率,波特率9600每秒的传输字节 传输一个字节要多久-与非网...
  18. Mansory 算法分析
  19. 【读】seq2seq—(4)LCSTS: A Large Scale Chinese Short Text Summarization Dataset
  20. android 加固服务器,Python 脚本构建Android APK 自动加固、打渠道包并上传服务器

热门文章

  1. GIT小乌龟回滚版本和merge版本
  2. 关于MATLAB控制E4438C等信号源的研究
  3. 16个免费学习网站,学习资源超丰富,每天1小时让自己变强
  4. 速翔头条系统-高仿今日头条源码|速翔头条源码|新闻源码|资讯源码|新闻资讯系统|头条系统|自媒体源码系统
  5. (亲测有效)解决shell脚本运行报错
  6. Linux Centos7 测试硬盘IO
  7. 草间弥生——我的一个梦想 A DREAM I DREAMED
  8. comsol学习中心:网格划分基础操作
  9. 【ONE·R || R与C++交互使用简单介绍 】
  10. PICO SCOPE 3000 Series 示波器 使用介绍