热门标签 | 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;


推荐阅读
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • moment 国际化设置中文语言 (全局) 及使用示例 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • andr ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
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社区 版权所有