热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

时间序列模型ARMA/ARIMA(二)

文章目录时序特点时序模型的前提时序模型的自相关图和偏自相关图时列模型训练&检验&预测模型评价时序特点一系列相同时间间隔的数据点只有一列数据,没有变量与变量之间的关系线


文章目录

      • 时序特点
      • 时序模型的前提
      • 时序模型的自相关图和偏自相关图
      • 时列模型训练&检验&预测
      • 模型评价


时序特点


  • 一系列相同时间间隔的数据点

  • 只有一列数据,没有变量与变量之间的关系

    线性回归中,有自变量和因变量

  • 数据在时间上有相关性,即前后相关

    线性回归中,数据点间相互独立

  • 用历史数据预测未来数据


时序模型的前提


  • 平稳性

    • 数学上,时序的期望和方差基本上不随时间变动。

    • 时序图上,数据点围绕一个常数上下波动。

    • 统计学上,p-value 是否小于显著水平,比如 0.01。

      # ts:时序
      from statsmodels.tsa.stattools import adfuller
      adf = adfuller( ts )
      print(adf)
      #返回的第一个数据是单位根统计量,第二个是p-value
      # 若 p-value<0.01&#xff0c;则拒绝原假设&#xff0c;i.e. 原时序平稳
      # 原假设&#xff1a;时序存在单位根&#xff0c;i.e. 时序不平稳

    • 若原时序不平稳&#xff0c;要作一阶差分或更高阶差分去除原时序的趋势。

      # 一阶差分
      ts_diff &#61; ts.diff(1)[1:] #作差分的同时去掉第一个NaN值

  • 白噪声检验

    • &#xff08;只有&#xff09;在时序平稳后&#xff0c;检验时序是否在时间上相关。

      from statsmodels.stats.diagnostic import acorr_ljungbox
      noise &#61; acorr_ljungbox( ts, lags&#61;1 )
      # lags&#xff0c;设置时序滞后的阶数
      # 设置多少阶&#xff0c;结果会显示多少阶对应的统计量和p-value
      print( noise )
      # 返回的元组里的第一个数据是统计量&#xff0c;第二个是p-value
      # 若 p-value<0.01&#xff0c;则拒绝原假设&#xff0c;i.e. 原时序在时间上相关
      # 原假设&#xff1a;时序是随机序列


时序模型的自相关图和偏自相关图


  • 用来估计模型的阶数 p,q

    from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    fig &#61; plt.figure(figsize&#61;(20,5))
    ax1 &#61; fig.add_subplot(211)
    plot_acf( ts, lags&#61;30, ax&#61;ax1 )
    ax2 &#61; fig.add_subplot(212)
    plot_pacf( ts, lags&#61;30, ax&#61;ax2 )
    # 以上lags可以自行选择


时列模型训练&检验&预测


  • 若原时序平稳&#xff0c;则直接使用 ARMA(p,q) 模型
  • 若原时序不平稳&#xff0c;而通过作差分后平稳&#xff0c;则使用 ARIMA(p,d,q)模型

  1. 寻找模型的最佳阶数(p,q)&#xff1a;

    最佳的 p,q&#xff1a;模型的 aic or bic 最小时。

    # 以原时序平稳且非白噪声为例&#xff0c;直接用 ARMA
    from statsmodels.tsa.arima_model import ARMA, ARIMA
    ts_train &#61; ts[ ts.index<&#61;&#39;2020-04-30&#39; ]
    # 根据自相关图和偏自相关图设置最大的 p,q
    pmax, qmax &#61; 5, 5
    Mid &#61; []
    arma_pq &#61; None
    # 迭代寻找最佳 p,q
    for i in range(pmax&#43;1):for j in range(qmax&#43;1):arma_pq &#61; ARMA(ts_train, (i,j)).fit()Mid[&#39;({},{})&#39;.format(i,j)] &#61; [arma_pq.aic, arma_pq.bic]
    # 根据 aic,bic 同时最小找到最佳 p,q
    p,q &#61; eval(sorted(Mid.items(), key &#61; lambda i:i[1])[0][0])

  2. 训练模型

    # 使用上述找到的最佳 p,q
    arma &#61; ARMA(ts_train, (p,q)).fit()

  3. 模型检验

    # 检验模型是否很好的捕捉了原时序的趋势
    resid &#61; arma.resid # 获取残差
    # 方法一&#xff1a;画残差的相关图&#xff0c;观察是否基本上都处于置信区间内
    plot_acf(resid,lags&#61;40)
    # 方法二&#xff1a;使用 DW 检验残差是否自相关&#xff08;DW接近2&#xff0c;则不存在相关性&#xff09;
    from statsmodels.stats.stattools import durbin_watson
    durbin_watson(resid.values)
    # 方法三&#xff1a;使用 ljungbox 检验残差是否是白噪声&#xff08;残差无自相关性&#xff09;
    acorr_ljungbox( resid, lags&#61;1 )

  4. 模型预测

    # 当模型很好的捕捉了原时序的趋势时# 1、样本内预测&#xff1a;start/end&#xff0c;都是训练集里出现过的日期
    pred_in &#61; arma.predict(start&#61;&#39;20200101&#39;, end&#61;&#39;20200430&#39;)
    ts_test_in &#61; ts[ (ts.index >&#61; &#39;2020-01-01&#39;)&(ts.index <&#61; &#39;2020-04-30&#39;) ] fig &#61; plt.figure(figsize&#61;(20,7))
    ax1 &#61; fig.add_subplot(211)
    ax1.plot(ts_test_in, label&#61;&#39;in-sample test&#39;)
    ax1.plot(pred_in, label&#61;&#39;in-sample prediction&#39;)
    plt.title(&#39;in-sample comparison&#39;)
    plt.legend()# 2、样本外预测&#xff1a;start/end&#xff0c;int&#xff0c;须一部分在训练集内&#xff0c;一部分不在
    pred_out &#61; arma.predict(start&#61;len(ts_train)-30, end&#61;len(ts_train)&#43;30)
    ts_test_out &#61; np.append( np.array(ts_train)[-30:], np.array(ts[ts.index>&#39;2020-04-30&#39;])[:30] )ax2 &#61; fig.add_subplot(212)
    ax2.plot(ts_test_out, label&#61;&#39;out-sample test&#39;)
    ax2.plot(pred_out, label&#61;&#39;out-sample prediction&#39;)
    plt.title(&#39;out-sample comparison&#39;)
    plt.legend()plt.show()


模型评价

1、模型在样本内的预测可以达到一个不错的效果。

2、但是&#xff0c;模型在样本外的预测是一个周期性的 sin 波形&#xff08;试了几种数据都一样&#xff0c;不知道怎么回事&#xff09;。

3、欢迎来评论&#xff01;


推荐阅读
  • 本文详细介绍了虚拟专用网(Virtual Private Network, VPN)的概念及其通过公共网络(如互联网)构建临时且安全连接的技术特点。文章探讨了不同类型的隧道协议,包括第二层和第三层隧道协议,并提供了针对IPSec、GRE以及MPLS VPN的具体配置指导。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 开发笔记:2020 BJDCTF Re encode
    开发笔记:2020 BJDCTF Re encode ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
author-avatar
缅追逐暗夜的流星
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有