精华内容
下载资源
问答
  • 季节加法模型

    千次阅读 2019-06-26 13:49:09
    季节加法模型是序列中季节效应和其他效应之间是加法关系,可以表示为: 这时,各种效应信息的提取都非常容易。通常简单的周期步长差分即可将序列中的季节信息提取完毕,提取季节信息和趋势信息之后的残差序列就是...

    1.模型简介
    季节加法模型是指序列中季节效应和其他效应之间是加法关系,可以表示为:
    在这里插入图片描述
    这时,各种效应信息的提取都非常容易。通常简单的周期步长差分即可将序列中的季节信息提取完毕,提取季节信息和趋势信息之后的残差序列就是一个平稳序列,可以用ARMA模型进行拟合。
    所以简单季节模型实际上就是通过趋势差分、季节差分将序列将序列转化为平稳序列,再对其进行拟合。它的模型结构通常如下:
    在这里插入图片描述
    式中在这里插入图片描述
    2.建模过程
    (1)画出时间序列时序图,判断其是否含有季节效应。
    (2)对时间序列做d阶差分和周期步长k步差分,以消除其季节效应和趋势效应。
    (3)将上述差分序列拟合ARMA模型
    (4)对其参数进行显著性检验
    (5)对未来值进行预测,并画出其预测图。
    3.建模
    利用1962年到1991年德国工人季度失业率序列进行建模分析
    (1)画出时序图

    library(tseries)
    library(zoo)
    library(forecast)
    a=read.table("C:/Users/MrDavid/data_TS/A1.19.1.csv",sep=",",header=T)
    x=ts(a$unemployment,start=c(1962,1),frequency=4)
    plot(x,col=4,pch=8,type="o",lwd=2)
    

    在这里插入图片描述
    (2)对序列进行1阶4步差分

    x.dif=diff(diff(x),4)
    plot(x.dif,col=4,pch=8,type="o",lwd=2)
    

    在这里插入图片描述
    画出自相关,偏自相关图

    x.dif1=na.omit(x.dif)(4步差分后,x.dif中有na值,将其删除)
    acf(x.dif1,col=4,lwd=2)
    pacf(x.dif1,col=4,lwd=2)
    

    在这里插入图片描述

    在这里插入图片描述
    拟合模型:自相关图显示,差分序列仍含有一定的季节效应,所以延迟四阶之后,自相关系数又有一个反弹。由于延迟1阶到3阶延迟4阶到7阶衰减的非常迅速,所以该序列具有短期相关性。
    偏自相关图显示,除了延迟1阶和4阶的偏自相关系数显著大于2倍标准差之外,其他阶数的偏自相关系数基本都在2倍标准差范围内波动,所以拟合模型ARIMA((1,4),(1,4),0)。

    (3)拟合加法季节模ARIMA((1,4),(1,4),0)

    x.fit=arima(x,order=c(4,1,0),seasonal=list(order=c(0,1,0),period=4),transform.par=F,fixed=c(NA,0,0,NA))
    x.fit
    

    得到结果为:
    在这里插入图片描述
    进行残差的白噪声检验:

    for(i in 1:3) print(Box.test(x.fit$residual,lag=6*i))
    

    在这里插入图片描述

    对参数进行显著性检验:

    t1=0.3812/0.0864
    pt(t1,df=108,lower.tail=F)
    t2=-0.2975/0.0858
    pt(t2,df=108,lower.tail=T)
    

    在这里插入图片描述
    参数检验显著,所以模型拟合成功。

    (4)对未来2年的值进行预测

    x.fore=forecast(x.fit,h=8)
    x.fore
    

    在这里插入图片描述
    画出预测图:

    L1=x.fore$fitted-1.96*sqrt(x.fit$sigma2)
    U1=x.fore$fitted+1.96*sqrt(x.fit$sigma2)
    L2=ts(x.fore$lower[,2],start=c(1962,1),frequency=4)
    U2=ts(x.fore$upper[,2],start=c(1962,1),frequency=4)
    c1=min(x,L1,L2)
    c2=max(x,L2,U2)
    plot(x,type="p",pch=8)
    lines(x.fore$fitted,col=2,lwd=2)
    lines(x.fore$mean,col=2,lwd=2)
    lines(L1,col=4,lty=2)
    lines(U1,col=4,lty=2)
    lines(L2,col=4,lty=2)
    lines(U2,col=4,lty=2)
    

    在这里插入图片描述

    展开全文
  • 时序分析-季节因素

    千次阅读 2020-03-22 16:31:38
    目录 1时序分析的基础 1.1 简介 1.2 分类 2 分析套路 ...4.2 季节序列分析 4.1 同期平均法 4.1.1 简单季节指数法 4.1.2 趋势季节指数法 4.2 长期趋势剔除法 4.2.1 长期趋势剔除法+简单移动平...

    目录

     

    1时序分析的基础

    1.1 简介

    1.2 分类

    2 分析套路

    3 主流时序分析模型

    3.1移动平均

    3.2 指数平滑法

    3.3 组合模型

    3.4 ARIMA

    4 研究细分领域

    4.1 异常值检测

    4.2 季节序列分析

    4.1 同期平均法

    4.1.1 简单季节指数法

    4.1.2 趋势季节指数法

    4.2 长期趋势剔除法

    4.2.1 长期趋势剔除法+简单移动平均

    4.2.2 温特线性+指数平滑

    4.2.3 ARIMA模型+ 时序

    4.2.3 季节剔除

    5 Java相关包

    9 参考资料


    1时序分析的基础

    1.1 简介

    时序分析法的基本思想是事件的发展通常都具有一定的惯性,这种惯性用统计的语言来描述就是序列值之间存在一定的相互关系,而且这种相互关系具有某种统计规律。

    事件是随机的,但是规律不是,我们分析的重点就是寻找这种规律,并拟合出适当的数学模型来描述这种规律,进而利用这个拟合模型来预测序列未来的走势。

     

    1.2 分类

    平稳的意思简单理解就是整体随机变量整体不会表现出一个趋势。

    强平稳 同分布 白噪声 均值和方差都是一个常数,不同时间段的的分布是相同的,也即这些分布的均值和方差是相同的,即是一个常数

    弱平稳 随机变量依然没有一个整体的趋势。区别于强平稳的是弱平稳的其随机变量不同时间段的分布是不同的(分布的均值和方差是不同的,但是均值的分布即均值的均值,均值的方差是常数,即均值和方差是稳定的),

    变量本身是没有一个趋势的,但是其变量的均值

    1 长期趋势分析,肯定都是一个不平稳序列,所以必然是用差分的方法转化成平稳序列来分析。

    2 目前大部分的研究都是研究弱平稳。

     

    2 分析套路

    1. 考虑观察值序列的特征

    2. 根据序列的特征选择适当拟合模型

    3. 根据序列的观察数据确定模型的口径

    4. 检验模型,优化模型

    5. 利用拟合好的模型来推断序列的其他统计性质或预测序列将 来的发展。

    3 主流时序分析模型

    3.1移动平均

    略(股市中有各种移动平均线,可以结合学习感受下)

    3.2 指数平滑法

    表达式:

     

    1 问:指数平滑的理论基础?

    答:从公式可以看出:简单的全期平均法是对时间数列的过去数据一个不漏地全部加以同等利用;移动平均法则不考虑较远期的数据,并在加权移动平均法中给予近期资料更大的权重;而指数平滑法则在不舍弃历史数据的前提下,对离预测期较近的观察值赋予较大的权重,对离预测值较远的观察值赋予较小的权重,达到逐渐减弱对现在预测的影响程度的目的,所以叫做指数平滑法。

    2 问:使用场景

    应用时间序列平滑法的前提条件是:

    A) 所预测的客观事物发展属于渐进式,无跳跃性的变化;

    B) 过去和目前影响客观事物发展的因素也决定着客观事物未来的发展

    2 问:时间的第一项估计值具体指如何取值?

    答:一般分为两种情况,当样本为大样本时(n>42),F1一般以第一期的观察值代替;当样本为小样本时(n<42),F1一般取前几期的平均值代替。

     

    3 问:一次指数平滑优劣势

    答:

    优势:消除了短期影响,一定程度上能反应变动趋势;相对于普通的移动平均,不会丢弃历史数据。

    劣势:从下图可以看出,预测趋势与实际变动趋势一致,但预测值比实际值滞后(大多数都是如此,而且移动平均也是也是如此)。

    ps:解决办法 --> 多次平滑

    CASE:

    某产品过去20个月的销售数据如下

     

    从上图可以看出,预测结果和实际值的变化趋势是保持一致的,但是预测结果是滞后于实际值的。

    指数平滑模型一般有一次、二次、三次平滑等各种模型。这三种模型分别有不同的特性。

    Holt winter和各阶指数平滑之间的关系

    Holt winter线性指数平滑法其实就是二次指数平滑法的一种变形

    Holt Winter季节性指数平滑法其实就是三次平滑的一种变形

     

    [hotwinter指数平滑模型] https://www.jianshu.com/p/6fb0408b3f54

    [时间序列模型] https://my.oschina.net/hosee/blog/1550128

    [指数平滑] https://cloud.tencent.com/developer/article/1058557 推荐:本文详细分析了一次、二次、三次、winter线性和季节指数模型的各种使用场景。

    三种模型 TODO 预测到底怎么做?

    3.3 组合模型

    通常时间序列包括3个因素:

    • 趋势因素T

    • 季节性因素S

    • 不规则因素I

    常用的综合分析模型有:

    加分模型

     

    乘法模型

     

    混合模型

     

    3.4 ARIMA

    ARIMA模型 TODO

     

    4 研究细分领域

    4.1 异常值检测

    refer tangluyang

    4.2 季节序列分析

    有些时间序列呈现出一定的循环或周期性,这样的时间序列叫季节性时间序列。

     


    时间序列的变动成分可以分成四种,分别是长期趋势、循环变动(周期)、季节变动和不规则变动,分析者可以通过上篇文章的序列图对时间序列进行观察,并结合实际情况判断时间序列中包含的变动成分。

    时间序列分解是时间序列分析的传统方法,它的分析思路是将各种变动成分从时间序列中分解出来,并考量引起每种变动成分的原因。时间序列分解有很多优点:

    1、分解后的时间序列更加直观简洁,避免各种变动成分之间互相影响;

    2、可以分别测定每种变动的影响程度,从而提高预测精度。

    季节分析有两种方法:

    4.1 同期平均法

    4.1.1 简单季节指数法

    季节性的衡量:所谓季节指数就是用简单平均法计算的周期内各时期季节性影响的相对数。

     

    首先计算周期内各期平均数

     

    然后计算总平均数

     

    再计算季节指数

     

    季节指数反映了该季度与总平均值之间的一种比较稳定的关系:

    如果比值大于1,说明该季度的值常常会高于总平均值;

    如果比值小于1,说明该季度的值常常低于总平均值;

    如果序列的季节指数都近似为1,就说明该序列没有明显的季节性。

     

    从上图可以看出来,第一季度和第三季度有着明显的季节性。可以进行下一步分析,

    建立时间序列线性回归预测模型;

    结合线性回归预测模型季节指数进行预测

    如本例中修正2002年各季度预测值

      第一季度预测值=(190+1.90×25)×1.38≈328(单位)

      第二季度预测值=(190+1.90×27)×0.95≈229(单位)

      第三季度预测值=(190+1.90×29)×0.73≈179(单位)

      第三季度预测值=(190+1.90×31)×0.95≈236(单位)

    4.1.2 趋势季节指数法

    收集并整理历史统计数据(Ai);
    建立预测模型;
    利用预测模型求历史上各期的趋势值(Bi);
    求季节指数(Ci):
    Ci = Ai / Bi (实际值/趋势值)
    求季节指数的平均值(Fi);
    利用季节指数平均值修正预测值:
    yt=(a+bT)Fi

    相对于简单指数法,此方法区别在于季节指数的求法,是用实际值/趋势值,然后求出一个整体的季节指数平均值。最后修正都用这一个值去修正。

    4.2 长期趋势剔除法

    4.2.1 长期趋势剔除法+简单移动平均

     

    基本思想就是用基本周期的移动平均,消除季节季节影响。

    比如以季度为单位可以,进行四项平均;以月为单位,可以进行12项平均。

    接下来,看一个实例https://blog.csdn.net/WMN7Q/article/details/66472665

    4.2.2 温特线性+指数平滑

    正如上述所述的移动平均的一些问题,所以一般采用含有季节特征的序列分析也会采用指数平滑。

     

    式中,St为时间序列第t期的平滑值,它已剔除季节性因素,bt为时间序列第t期趋势的平滑值,L为季节长度(每年的季数或月数),It为时间序列第t期的季节平滑值,它通常在1附近,一些值大于1,一些值小于1,m为预测的超前期数,Ft+m为时间序列第t+m期的预测值。 使用温特线性和季节性指数平滑法的关键在于一组合理平滑常数组合α、β、γ的选择,从而使预测误差达到最小。需要根据时间序列的特点和预测经验预先确定几对上述常数组合,经过反复测试,计算各组常数组合的预测误差,最后选取预测误差最小的一组得出的结果。

    温特线性和季节性指数平滑法也需要选择初始平滑值SL+1和bL+1,一般取:

     

     

    4.2.3 ARIMA模型+ 时序

    ARIMA模型可以对具有季节效应的序列建模,季节ARIMA模型考虑了季节的因素,整体的思路还是先对数据进行平滑预处理,然后交由ARIMA模型进行拟合。

    4.2.3 季节剔除

    在有些应用中,季节性是次要的,我们需要把它从数据中消除,这个过程叫季节调整,其中季节性差分化是一种常见的方法。

    在之前我们介绍过差分(正规差分化),其形式为:

    我们将它推广,如果一个序列具有周期性,且周期为s,则季节性差分化为:

    5 Java相关包

    R和Python有现成的包,比较细致,有细到winter函数的实现。

    java的计算包和时间序列相关的比较少。

    JMulTi看了下官网没找到非常细致的文档,看他们的Feature,有一些季节模式的假设检验,提供了一些方法;

    jmotif 有github,但是没有太多和季节相关的介绍。

    网上自定义的java实现的季节ARIMA模型比较多。

     

    9 参考资料

    展开全文
  • 时间序列预测,非季节性ARIMA及季节性SARIMA

    万次阅读 多人点赞 2019-03-24 21:55:00
    我们将首先介绍和讨论自相关,平稳性和季节性的概念,并继续应用最常用的时间序列预测方法之一,称为ARIMA。 介绍 时间序列提供了预测未来价值的机会。基于以前的价值观,可以使用时间序列来预测经济,天气和...

    Python 3中使用ARIMA进行时间序列预测的指南

    在本教程中,我们将提供可靠的时间序列预测。我们将首先介绍和讨论自相关,平稳性和季节性的概念,并继续应用最常用的时间序列预测方法之一,称为ARIMA。

     

    介绍

    时间序列提供了预测未来价值的机会。 基于以前的价值观,可以使用时间序列来预测经济,天气和能力规划的趋势,其中仅举几例。 时间序列数据的具体属性意味着通常需要专门的统计方法。

    在本教程中,我们将针对时间序列产生可靠的预测。 我们将首先介绍和讨论自相关,平稳性和季节性的概念,并继续应用最常用的时间序列预测方法之一,称为ARIMA。

    用于建模和预测时间序列未来点的Python中的一种方法被称为SARIMAX ,其代表具有eXogenous回归的季节性自动反馈集成移动平均值 。 在这里,我们将主要关注ARIMA组件,该组件用于适应时间序列数据,以更好地了解和预测时间序列中的未来点。

    时间序列预测——ARIMA(差分自回归移动平均模型)

    ARIMA(p,d,q)中,AR是"自回归",p为自回归项数;I为差分,d为使之成为平稳序列所做的差分次数(阶数);MA为"滑动平均",q为滑动平均项数,。ACF自相关系数能决定q的取值,PACF偏自相关系数能够决定q的取值。ARIMA原理:非平稳时间序列转化为平稳时间序列然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型

    基本解释:

    自回归模型(AR)

    • 描述当前值与历史值之间的关系用变量自身的历史时间数据对自身进行预测
    • 自回归模型必须满足平稳性的要求
    • 必须具有自相关性,自相关系数小于0.5不适用
    • p阶自回归过程的公式定义:

                                                  

                                           ,y t-i 为前几天的值

    PACF,偏自相关函数(决定p值),剔除了中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的干扰之后x(t-k)对x(t)影响的相关程度。

    移动平均模型(MA)

    • 移动平均模型关注的是自回归模型中的误差项的累加,移动平均法能有效地消除预测中的随机波动
    • q阶自回归过程的公式定义:

                                                  

    ACF,自相关函数(决定q值)反映了同一序列在不同时序的取值之间的相关性。x(t)同时还会受到中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的影响而这k-1个随机变量又都和x(t-k)具有相关关系,所 以自相关系数p(k)里实际掺杂了其他变量对x(t)与x(t-k)的影响

                                               

    ARIMA(p,d,q)阶数确定:

                               

                                                                                                                           截尾:落在置信区间内(95%的点都符合该规则)

                                  

                                                                                                 acf和pacf图

    平稳性要求:平稳性就是要求经由样本时间序列所得到的拟合曲线在未来的一段期间内仍能顺着现有的形态“惯性”地延续下去

    平稳性要求序列的均值和方差不发生明显变化。

        具体分为严平稳与弱平稳:
        严平稳:严平稳表示的分布不随时间的改变而改变。
        如:白噪声(正态),无论怎么取,都是期望为0,方差为1
        弱平稳:期望与相关系数(依赖性)不变
        未来某时刻的t的值Xt就要依赖于它的过去信息,所以需要依赖性

    因为实际生活中我们拿到的数据基本都是弱平稳数据,为了保证ARIMA模型的要求,我们需要对数据进行差分,以求数据变的平稳。

    模型评估:


    AIC:赤池信息准则(AkaikeInformation Criterion,AIC)
                                                             ???=2?−2ln(?)
    BIC:贝叶斯信息准则(Bayesian Information Criterion,BIC)
                                                             ???=????−2ln(?)
                                            k为模型参数个数,n为样本数量,L为似然函数

     

    模型残差检验:

    • ARIMA模型的残差是否是平均值为0且方差为常数的正态分布
    • QQ图:线性即正态分布

    先决条件

    本指南将介绍如何在本地桌面或远程服务器上进行时间序列分析。 使用大型数据集可能是内存密集型的,所以在这两种情况下,计算机将至少需要2GB的内存来执行本指南中的一些计算。

    要充分利用本教程,熟悉时间序列和统计信息可能会有所帮助。

    对于本教程,我们将使用Jupyter Notebook来处理数据。 如果您还没有,您应该遵循我们的教程安装和设置Jupyter Notebook for Python 3 。

    第1步 - 安装软件包

    为了建立我们的时间序列预测环境,我们先进入本地编程环境或基于服务器的编程环境:

    cd environments
    
    . my_env/bin/activate

    从这里,我们为我们的项目创建一个新的目录。 我们称之为ARIMA ,然后进入目录。 如果您将项目称为不同名称,请务必在整个指南中将您的名称替换为ARIMA

    mkdir ARIMA
    cd ARIMA
    

    本教程将需要warnings , itertools , itertools , numpy , matplotlibstatsmodels库。 warningsitertools库包含在标准Python库集中,因此您不需要安装它们。

    像其他Python包一样,我们可以用pip安装这些要求。 
    我们现在可以安装pandas , statsmodels和数据绘图包matplotlib 。 它们的依赖也将被安装:

    pip install pandas numpy statsmodels matplotlib

    在这一点上,我们现在设置为开始使用已安装的软件包。

    第2步 - 导入包并加载数据

    要开始使用我们的数据,我们将启动Jupyter Notebook:

    jupyter notebook

    要创建新的笔记本文件,请从右上角的下拉菜单中选择新建 > Python 3 :

    创建一个新的Python 3笔记本

    这将打开一个笔记本。

    最好的做法是,从笔记本电脑的顶部导入需要的库:

    import warnings
    import itertools
    import pandas as pd
    import numpy as np
    import statsmodels.api as sm
    import matplotlib.pyplot as plt
    plt.style.use('fivethirtyeight')

    我们还为我们的地块定义了一个matplotlib风格 。

    我们将使用一个名为“来自美国夏威夷Mauna Loa天文台的连续空气样本的大气二氧化碳”的数据集,该数据集从1958年3月至2001年12月期间收集了二氧化碳样本。我们可以提供如下数据:

    data = sm.datasets.co2.load_pandas()
    y = data.data

    让我们稍后再进行一些数据处理。 每周数据可能很棘手,因为它是一个很短的时间,所以让我们使用每月平均值。 我们将使用resample函数进行转换。 为了简单起见,我们还可以使用fillna()函数来确保我们的时间序列中没有缺少值。

    # The 'MS' string groups the data in buckets by start of the month
    y = y['co2'].resample('MS').mean()
    
    # The term bfill means that we use the value before filling in missing values
    y = y.fillna(y.bfill())
    
    print(y)
    Outputco2
    1958-03-01  316.100000
    1958-04-01  317.200000
    1958-05-01  317.433333
    ...
    2001-11-01  369.375000
    2001-12-01  371.020000

    我们来探索这个时间序列e作为数据可视化:

    y.plot(figsize=(15, 6))
    plt.show()

    图1:二氧化碳浓度时间序列

    当我们绘制数据时,会出现一些可区分的模式。 时间序列具有明显的季节性格局,总体呈上升趋势。

    要了解有关时间序列预处理的更多信息,请参阅“ 使用Python 3进行时间序列可视化的指南 ”,其中上面的步骤将更详细地描述。

    现在我们已经转换和探索了我们的数据,接下来我们继续使用ARIMA进行时间序列预测。

    第3步 - ARIMA时间序列模型

    时间序列预测中最常用的方法之一就是被称为ARIMA模型,它代表了A utoreg R essive综合M oving A版本 。 ARIMA是可以适应时间序列数据的模型,以便更好地了解或预测系列中的未来点。

    有三个不同的整数( p , d , q )用于参数化ARIMA模型。 因此,ARIMA模型用符号ARIMA(p, d, q) 。 这三个参数共计数据集中的季节性,趋势和噪音:

    • p是模型的自回归部分。 它允许我们将过去价值观的影响纳入我们的模型。 直观地说,这将是类似的,表示如果过去3天已经变暖,明天可能会变暖。
    • d是模型的集成部分。 这包括模型中包含差异量(即从当前值减去的过去时间点的数量)以适用于时间序列的术语。 直观地说,这将类似于说如果过去三天的温度差异非常小,明天可能会有相同的温度。
    • q是模型的移动平均部分。 这允许我们将模型的误差设置为过去以前时间点观察到的误差值的线性组合。

    在处理季节性影响时,我们利用季节性 ARIMA,表示为ARIMA(p,d,q)(P,D,Q)s 。 这里, (p, d, q)是上述非季节性参数,而(P, D, Q)遵循相同的定义,但适用于时间序列的季节分量。 术语s是时间序列的周期(季度为4 ,年度为12 ,等等)。

    由于所涉及的多个调整参数,季节性ARIMA方法可能会令人望而生畏。 在下一节中,我们将介绍如何自动化识别季节性ARIMA时间序列模型的最优参数集的过程。

    第4步 - ARIMA时间序列模型的参数选择

    当考虑使用季节性ARIMA模型拟合时间序列数据时,我们的第一个目标是找到优化感兴趣度量的ARIMA(p,d,q)(P,D,Q)s的值。 实现这一目标有许多指导方针和最佳实践,但ARIMA模型的正确参数化可能是一个需要领域专长和时间的艰苦的手工过程。 其他统计编程语言(如R提供了自动化的方法来解决这个问题 ,但尚未被移植到Python中。 在本节中,我们将通过编写Python代码来编程选择ARIMA(p,d,q)(P,D,Q)s时间序列模型的最优参数值来解决此问题。

    非季节性参数:p,d,q

    季节参数:P、D、Q

    s:时间序列的周期,年周期s=12

    我们将使用“网格搜索”来迭代地探索参数的不同组合。 对于参数的每个组合,我们使用statsmodels模块的SARIMAX()函数拟合一个新的季节性ARIMA模型,并评估其整体质量。 一旦我们探索了参数的整个范围,我们的最佳参数集将是我们感兴趣的标准产生最佳性能的参数。 我们开始生成我们希望评估的各种参数组合:

    # Define the p, d and q parameters to take any value between 0 and 2
    p = d = q = range(0, 2)
    
    # Generate all different combinations of p, q and q triplets
    pdq = list(itertools.product(p, d, q))
    
    # Generate all different combinations of seasonal p, q and q triplets
    seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
    
    print('Examples of parameter combinations for Seasonal ARIMA...')
    print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1]))
    print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2]))
    print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3]))
    print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))
    Output
    Examples of parameter combinations for Seasonal ARIMA...
    SARIMAX: (0, 0, 1) x (0, 0, 1, 12)
    SARIMAX: (0, 0, 1) x (0, 1, 0, 12)
    SARIMAX: (0, 1, 0) x (0, 1, 1, 12)
    SARIMAX: (0, 1, 0) x (1, 0, 0, 12)

    我们现在可以使用上面定义的参数三元组来自动化不同组合对ARIMA模型进行培训和评估的过程。 在统计和机器学习中,这个过程被称为模型选择的网格搜索(或超参数优化)。

    在评估和比较配备不同参数的统计模型时,可以根据数据的适合性或准确预测未来数据点的能力,对每个参数进行排序。 我们将使用AIC (Akaike信息标准)值,该值通过使用statsmodels安装的ARIMA型号方便地返回。 AIC衡量模型如何适应数据,同时考虑到模型的整体复杂性。 在使用大量功能的情况下,适合数据的模型将被赋予比使用较少特征以获得相同的适合度的模型更大的AIC得分。 因此,我们有兴趣找到产生最低AIC的模型。

    下面的代码块通过参数的组合来迭代,并使用SARIMAX函数来适应相应的季节性ARIMA模型。 这里, order参数指定(p, d, q)参数,而seasonal_order参数指定季节性ARIMA模型的(P, D, Q, S)季节分量。 在安装每个SARIMAX()模型后,代码打印出其各自的AIC得分。

    warnings.filterwarnings("ignore") # specify to ignore warning messages
    
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(y,
                                                order=param,
                                                seasonal_order=param_seasonal,
                                                enforce_stationarity=False,
                                                enforce_invertibility=False)
    
                results = mod.fit()
    
                print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))
            except:
                continue

    由于某些参数组合可能导致数字错误指定,因此我们明确禁用警告消息,以避免警告消息过载。 这些错误指定也可能导致错误并引发异常,因此我们确保捕获这些异常并忽略导致这些问题的参数组合。

    上面的代码应该产生以下结果,这可能需要一些时间:

    Output
    SARIMAX(0, 0, 0)x(0, 0, 1, 12) - AIC:6787.3436240402125
    SARIMAX(0, 0, 0)x(0, 1, 1, 12) - AIC:1596.711172764114
    SARIMAX(0, 0, 0)x(1, 0, 0, 12) - AIC:1058.9388921320026
    SARIMAX(0, 0, 0)x(1, 0, 1, 12) - AIC:1056.2878315690562
    SARIMAX(0, 0, 0)x(1, 1, 0, 12) - AIC:1361.6578978064144
    SARIMAX(0, 0, 0)x(1, 1, 1, 12) - AIC:1044.7647912940095
    ...
    ...
    ...
    SARIMAX(1, 1, 1)x(1, 0, 0, 12) - AIC:576.8647112294245
    SARIMAX(1, 1, 1)x(1, 0, 1, 12) - AIC:327.9049123596742
    SARIMAX(1, 1, 1)x(1, 1, 0, 12) - AIC:444.12436865161305
    SARIMAX(1, 1, 1)x(1, 1, 1, 12) - AIC:277.7801413828764

    我们的代码的输出表明, SARIMAX(1, 1, 1)x(1, 1, 1, 12)产生最低的AIC值为277.78。 因此,我们认为这是我们考虑过的所有模型中的最佳选择。

    第5步 - 安装ARIMA时间序列模型

    使用网格搜索,我们已经确定了为我们的时间序列数据生成最佳拟合模型的参数集。 我们可以更深入地分析这个特定的模型。

    我们首先将最佳参数值插入到新的SARIMAX模型中:

    mod = sm.tsa.statespace.SARIMAX(y,
                                    order=(1, 1, 1),
                                    seasonal_order=(1, 1, 1, 12),
                                    enforce_stationarity=False,
                                    enforce_invertibility=False)
    
    results = mod.fit()
    
    print(results.summary().tables[1]) #详细输出,results.summary()可以输出全部的模型计算参数表
    Output
    ==============================================================================
                     coef    std err          z      P>|z|      [0.025      0.975]
    ------------------------------------------------------------------------------
    ar.L1          0.3182      0.092      3.443      0.001       0.137       0.499
    ma.L1         -0.6255      0.077     -8.165      0.000      -0.776      -0.475
    ar.S.L12       0.0010      0.001      1.732      0.083      -0.000       0.002
    ma.S.L12      -0.8769      0.026    -33.811      0.000      -0.928      -0.826
    sigma2         0.0972      0.004     22.634      0.000       0.089       0.106
    ==============================================================================

    由SARIMAX的输出产生的SARIMAX返回大量的信息,但是我们将注意力集中在系数表上 coef显示每个特征的重量(即重要性)以及每个特征如何影响时间序列 P>|z| 列通知我们每个特征重量的意义。 这里,每个重量的p值都低于或接近0.05 ,所以在我们的模型中保留所有权重是合理的

    在 fit 季节性ARIMA模型(以及任何其他模型)的情况下,运行模型诊断是非常重要的,以确保没有违反模型的假设 plot_diagnostics对象允许我们快速生成模型诊断并调查任何异常行为。

    results.plot_diagnostics(figsize=(15, 12))
    plt.show()

    图2:模型诊断

    我们的主要关切是确保我们的模型的残差是不相关的,并且平均分布为零。 如果季节性ARIMA模型不能满足这些特性,这是一个很好的迹象,可以进一步改善

    残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。“残差”蕴含了有关模型基本假设的重要信息。如果回归模型正确的话, 我们可以将残差看作误差的观测值。 它应符合模型的假设条件,且具有误差的一些性质。利用残差所提供的信息,来考察模型假设的合理性及数据的可靠性称为残差分析

    在这种情况下,我们的模型诊断表明,模型残差正常分布如下:

    • 在右上图中,我们看到红色KDE线与N(0,1)行(其中N(0,1) )是正态分布的标准符号,平均值0 ,标准偏差为1 ) 。 这是残留物正常分布的良好指示。

    • 左下角的qq图显示,残差(蓝点)的有序分布遵循采用N(0, 1)的标准正态分布采样的线性趋势。 同样,这是残留物正常分布的强烈指示。

    • 随着时间的推移(左上图)的残差不会显示任何明显的季节性,似乎是白噪声。 这通过右下角的自相关(即相关图)来证实,这表明时间序列残差与其本身的滞后值具有低相关性

    这些观察结果使我们得出结论,我们的模型选择了令人满意,可以帮助我们了解我们的时间序列数据和预测未来价值

    虽然我们有一个令人满意的结果,我们的季节性ARIMA模型的一些参数可以改变,以改善我们的模型拟合。 例如,我们的网格搜索只考虑了一组受限制的参数组合,所以如果我们拓宽网格搜索,我们可能会找到更好的模型

    第6步 - 验证预测

    我们已经获得了我们时间序列的模型,现在可以用来产生预测。 我们首先将预测值与时间序列的实际值进行比较,这将有助于我们了解我们的预测的准确性。 get_prediction()conf_int()属性允许我们获得时间序列预测的值和相关的置信区间。

    pred = results.get_prediction(start=pd.to_datetime('1998-01-01'), dynamic=False)#预测值
    pred_ci = pred.conf_int()#置信区间

    上述规定需要从1998年1月开始进行预测。

    dynamic=False参数确保我们每个点的预测将使用之前的所有历史观测。

    我们可以绘制二氧化碳时间序列的实际值和预测值,以评估我们做得如何。 注意我们如何在时间序列的末尾放大日期索引。

    ax = y['1990':].plot(label='observed')
    pred.predicted_mean.plot(ax=ax, label='One-step ahead Forecast', alpha=.7)
    
    ax.fill_between(pred_ci.index,
                    pred_ci.iloc[:, 0],
                    pred_ci.iloc[:, 1], color='k', alpha=.2)
    #图形填充fill fill_between,参考网址:
    #https://www.cnblogs.com/gengyi/p/9416845.html
    
    ax.set_xlabel('Date')
    ax.set_ylabel('CO2 Levels')
    plt.legend()
    
    plt.show()

     pred.predicted_mean 可以得到预测均值,就是置信区间的上下加和除以2

    函数间区域填充 fill_between用法:

    plt.fill_between( x, y1, y2=0, where=None, interpolate=False, step=None, hold=None,data=None,  **kwarg)

    x - array( length N) 定义曲线的 x 坐标

    y1 - array( length N ) or scalar 定义第一条曲线的 y 坐标

    y2 - array( length N )  or scalar 定义第二条曲线的 y 坐标

    where - array of bool (length N), optional, default: None 排除一些(垂直)区域被填充。注:我理解的垂直区域,但帮助文档上写的是horizontal regions

    也可简单地描述为:

    plt.fill_between(x,y1,y2,where=条件表达式, color=颜色,alpha=透明度)" where = " 可以省略,直接写条件表达式 

    图3:二氧化碳浓度静态预测

    总体而言,我们的预测与真实价值保持一致,呈现总体增长趋势

    量化预测的准确性

    这是很有必要的。 我们将使用MSE(均方误差,也就是方差),它总结了我们的预测的平均误差。 对于每个预测值,我们计算其到真实值的距离并对结果求平方。 结果需要平方,以便当我们计算总体平均值时,正/负差异不会相互抵消。

    y_forecasted = pred.predicted_mean
    y_truth = y['1998-01-01':]
    
    # Compute the mean square error
    mse = ((y_forecasted - y_truth) ** 2).mean()
    print('The Mean Squared Error of our forecasts is {}'.format(round(mse, 2)))
    Output
    The Mean Squared Error of our forecasts is 0.07

    我们前进一步预测的MSE值为0.07 ,这是接近0的非常低的值。MSE=0是预测情况将是完美的精度预测参数的观测值,但是在理想的场景下通常不可能。

    然而,使用动态预测(dynamic=True)可以获得更好地表达我们的真实预测能力。 在这种情况下,我们只使用时间序列中的信息到某一点,之后,使用先前预测时间点的值生成预测。

    在下面的代码块中,我们指定从1998年1月起开始计算动态预测和置信区间。

    pred_dynamic = results.get_prediction(start=pd.to_datetime('1998-01-01'), dynamic=True, full_results=True)
    pred_dynamic_ci = pred_dynamic.conf_int()

    绘制时间序列的观测值和预测值,我们看到即使使用动态预测,总体预测也是准确的。 所有预测值(红线)与地面真相(蓝线)相当吻合,并且在我们预测的置信区间内。

    ax = y['1990':].plot(label='observed', figsize=(20, 15))
    pred_dynamic.predicted_mean.plot(label='Dynamic Forecast', ax=ax)
    
    ax.fill_between(pred_dynamic_ci.index,
                    pred_dynamic_ci.iloc[:, 0],
                    pred_dynamic_ci.iloc[:, 1], color='k', alpha=.25)
    
    ax.fill_betweenx(ax.get_ylim(), pd.to_datetime('1998-01-01'), y.index[-1],
                     alpha=.1, zorder=-1)
    
    ax.set_xlabel('Date')
    ax.set_ylabel('CO2 Levels')
    
    plt.legend()
    plt.show()

    图4:二氧化碳浓度动态预测

    我们再次通过计算MSE量化我们预测的预测性能

    # Extract the predicted and true values of our time-series
    y_forecasted = pred_dynamic.predicted_mean
    y_truth = y['1998-01-01':]
    
    # Compute the mean square error
    mse = ((y_forecasted - y_truth) ** 2).mean()
    print('The Mean Squared Error of our forecasts is {}'.format(round(mse, 2)))
    OutputThe Mean Squared Error of our forecasts is 1.01

    从动态预测获得的预测值产生1.01的MSE。 这比前进一步略高,这是意料之中的,因为我们依赖于时间序列中较少的历史数据。

    前进一步和动态预测都证实了这个时间序列模型是有效的。 然而,关于时间序列预测的大部分兴趣是能够及时预测未来价值观。

    第7步 - 生成和可视化预测

    在本教程的最后一步,我们将介绍如何利用季节性ARIMA时间序列模型来预测未来的价值。 我们的时间序列对象的

    get_forecast()属性可以计算预先指定数量的步骤的预测值。

    # Get forecast 500 steps ahead in future
    pred_uc = results.get_forecast(steps=500)
    
    # Get confidence intervals of forecasts
    pred_ci = pred_uc.conf_int()

    我们可以使用此代码的输出绘制其未来值的时间序列和预测。

    ax = y.plot(label='observed', figsize=(20, 15))
    pred_uc.predicted_mean.plot(ax=ax, label='Forecast')
    ax.fill_between(pred_ci.index,
                    pred_ci.iloc[:, 0],
                    pred_ci.iloc[:, 1], color='k', alpha=.25)
    ax.set_xlabel('Date')
    ax.set_ylabel('CO2 Levels')
    
    plt.legend()
    plt.show()

    图5:时间序列和未来价值预测

    现在可以使用我们生成的预测和相关的置信区间来进一步了解时间序列并预见预期。 我们的预测显示,时间序列预计将继续稳步增长。

    随着我们对未来的进一步预测,我们对自己的价值观信心愈来愈自然。 这反映在我们的模型产生的置信区间,随着我们进一步走向未来,这个模型越来越大。

    结论

    在本教程中,我们描述了如何在Python中实现季节性ARIMA模型。 我们广泛使用了pandasstatsmodels图书馆,并展示了如何运行模型诊断,以及如何产生二氧化碳时间序列的预测。

    这里还有一些其他可以尝试的事情:

    • 更改动态预测的开始日期,以了解其如何影响预测的整体质量。
    • 尝试更多的参数组合,看看是否可以提高模型的适合度。
    • 选择不同的指标以选择最佳模型。 例如,我们使用AIC测量来找到最佳模型,但是您可以寻求优化采样均方误差

    补充:其中一些好用的方法,代码如下:

     

    filename_ts = 'data/series1.csv'
    ts_df = pd.read_csv(filename_ts, index_col=0, parse_dates=[0])
    
    n_sample = ts_df.shape[0]
    print(ts_df.shape)
    print(ts_df.head())

    # Create a training sample and testing sample before analyzing the series
    
    n_train=int(0.95*n_sample)+1
    n_forecast=n_sample-n_train
    #ts_df
    ts_train = ts_df.iloc[:n_train]['value']
    ts_test = ts_df.iloc[n_train:]['value']
    print(ts_train.shape)
    print(ts_test.shape)
    print("Training Series:", "\n", ts_train.tail(), "\n")
    print("Testing Series:", "\n", ts_test.head())

     

    def tsplot(y, lags=None, title='', figsize=(14, 8)):
        
        fig = plt.figure(figsize=figsize)
        layout = (2, 2)
        ts_ax   = plt.subplot2grid(layout, (0, 0))
        hist_ax = plt.subplot2grid(layout, (0, 1))
        acf_ax  = plt.subplot2grid(layout, (1, 0))
        pacf_ax = plt.subplot2grid(layout, (1, 1))
        
        y.plot(ax=ts_ax) # 折线图
        ts_ax.set_title(title)
        y.plot(ax=hist_ax, kind='hist', bins=25) #直方图
        hist_ax.set_title('Histogram')
        smt.graphics.plot_acf(y, lags=lags, ax=acf_ax) # ACF自相关系数
        smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax) # 偏自相关系数
        [ax.set_xlim(0) for ax in [acf_ax, pacf_ax]]
        sns.despine()
        fig.tight_layout()
        return ts_ax, acf_ax, pacf_ax
    
    tsplot(ts_train, title='A Given Training Series', lags=20);

     

                               

    # 此处运用BIC(贝叶斯信息准则)进行模型参数选择
    # 另外还可以利用AIC(赤池信息准则),视具体情况而定
    import itertools
    
    p_min = 0
    d_min = 0
    q_min = 0
    p_max = 4
    d_max = 0
    q_max = 4
    
    # Initialize a DataFrame to store the results
    results_bic = pd.DataFrame(index=['AR{}'.format(i) for i in range(p_min,p_max+1)],
                               columns=['MA{}'.format(i) for i in range(q_min,q_max+1)])
    
    for p,d,q in itertools.product(range(p_min,p_max+1),
                                   range(d_min,d_max+1),
                                   range(q_min,q_max+1)):
        if p==0 and d==0 and q==0:
            results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = np.nan
            continue
        
        try:
            model = sm.tsa.SARIMAX(ts_train, order=(p, d, q),
                                   #enforce_stationarity=False,
                                   #enforce_invertibility=False,
                                  )
            results = model.fit() ##下面可以显示具体的参数结果表
    ## print(model_results.summary())
    ## print(model_results.summary().tables[1])
    # http://www.statsmodels.org/stable/tsa.html
            # print("results.bic",results.bic)
            # print("results.aic",results.aic)
            
            results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = results.bic
        except:
            continue
    results_bic = results_bic[results_bic.columns].astype(float)

    results_bic如下所示:

    为了便于观察,下面对上表进行可视化:、

    fig, ax = plt.subplots(figsize=(10, 8))
    ax = sns.heatmap(results_bic,
                     mask=results_bic.isnull(),
                     ax=ax,
                     annot=True,
                     fmt='.2f',
                     );
    ax.set_title('BIC');
    //annot
    //annotate的缩写,annot默认为False,当annot为True时,在heatmap中每个方格写入数据
    //annot_kws,当annot为True时,可设置各个参数,包括大小,颜色,加粗,斜体字等
    # annot_kws={'size':9,'weight':'bold', 'color':'blue'}
    #具体查看:https://blog.csdn.net/m0_38103546/article/details/79935671

                                              

    # Alternative model selection method, limited to only searching AR and MA parameters
    
    train_results = sm.tsa.arma_order_select_ic(ts_train, ic=['aic', 'bic'], trend='nc', max_ar=4, max_ma=4)
    
    print('AIC', train_results.aic_min_order)
    print('BIC', train_results.bic_min_order)

    注:

    SARIMA总代码如下:

    
    """
    https://www.howtoing.com/a-guide-to-time-series-forecasting-with-arima-in-python-3/
    http://www.statsmodels.org/stable/datasets/index.html
    """
     
    import warnings
    import itertools
    import pandas as pd
    import numpy as np
    import statsmodels.api as sm
    import matplotlib.pyplot as plt
    plt.style.use('fivethirtyeight')
     
    '''
    1-Load Data
    Most sm.datasets hold convenient representations of the data in the attributes endog and exog.
    If the dataset does not have a clear interpretation of what should be an endog and exog, 
    then you can always access the data or raw_data attributes.
    https://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html
    http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample.html
    # resample('MS') groups the data in buckets by start of the month,
    # after that we got only one value for each month that is the mean of the month
    # fillna() fills NA/NaN values with specified method
    # 'bfill' method use Next valid observation to fill gap
    # If the value for June is NaN while that for July is not, we adopt the same value
    # as in July for that in June
    '''
     
    data = sm.datasets.co2.load_pandas()
    y = data.data  # DataFrame with attributes y.columns & y.index (DatetimeIndex)
    print(y)
    names = data.names  # tuple
    raw = data.raw_data  # float64 np.recarray
     
    y = y['co2'].resample('MS').mean()
    print(y)
     
    y = y.fillna(y.bfill()) # y = y.fillna(method='bfill')
    print(y)
     
    y.plot(figsize=(15,6))
    plt.show()
     
    '''
    2-ARIMA Parameter Seletion
    ARIMA(p,d,q)(P,D,Q)s
    non-seasonal parameters: p,d,q
    seasonal parameters: P,D,Q
    s: period of time series, s=12 for annual period
    Grid Search to find the best combination of parameters
    Use AIC value to judge models, choose the parameter combination whose
    AIC value is the smallest
    https://docs.python.org/3/library/itertools.html
    http://www.statsmodels.org/stable/generated/statsmodels.tsa.statespace.sarimax.SARIMAX.html
    '''
     
    # Define the p, d and q parameters to take any value between 0 and 2
    p = d = q = range(0, 2)
     
    # Generate all different combinations of p, q and q triplets
    pdq = list(itertools.product(p, d, q))
     
    # Generate all different combinations of seasonal p, q and q triplets
    seasonal_pdq = [(x[0], x[1], x[2], 12) for x in pdq]
     
    print('Examples of parameter combinations for Seasonal ARIMA...')
    print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1]))
    print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2]))
    print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3]))
    print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))
     
    warnings.filterwarnings("ignore") # specify to ignore warning messages
     
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(y,
                                                order=param,
                                                seasonal_order=param_seasonal,
                                                enforce_stationarity=False,
                                                enforce_invertibility=False)
     
                results = mod.fit()
     
                print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))
            except:
                continue
     
     
    '''
    3-Optimal Model Analysis
    Use the best parameter combination to construct ARIMA model
    Here we use ARIMA(1,1,1)(1,1,1)12 
    the output coef represents the importance of each feature
    mod.fit() returnType: MLEResults 
    http://www.statsmodels.org/stable/generated/statsmodels.tsa.statespace.mlemodel.MLEResults.html#statsmodels.tsa.statespace.mlemodel.MLEResults
    Use plot_diagnostics() to check if parameters are against the model hypothesis
    model residuals must not be correlated
    '''
     
    mod = sm.tsa.statespace.SARIMAX(y,
                                    order=(1, 1, 1),
                                    seasonal_order=(1, 1, 1, 12),
                                    enforce_stationarity=False,
                                    enforce_invertibility=False)
     
    results = mod.fit()
    print(results.summary().tables[1])
     
    results.plot_diagnostics(figsize=(15, 12))
    plt.show()
     
    '''
    4-Make Predictions
    get_prediction(..., dynamic=False) 
    Prediction of each point will use all historic observations prior to it 
    http://www.statsmodels.org/stable/generated/statsmodels.tsa.statespace.mlemodel.MLEResults.get_prediction.html#statsmodels.regression.recursive_ls.MLEResults.get_prediction
    http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.plot.html
    https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.fill_between.html
    '''
     
    pred = results.get_prediction(start=pd.to_datetime('1998-01-01'), dynamic=False)
    pred_ci = pred.conf_int() # return the confidence interval of fitted parameters
     
    # plot real values and predicted values
    # pred.predicted_mean is a pandas series
    ax = y['1990':].plot(label='observed')  # ax is a matplotlib.axes.Axes
    pred.predicted_mean.plot(ax=ax, label='One-step ahead Forecast', alpha=.7)
     
    # fill_between(x,y,z) fills the area between two horizontal curves defined by (x,y)
    # and (x,z). And alpha refers to the alpha transparencies 
    ax.fill_between(pred_ci.index,
                    pred_ci.iloc[:, 0],
                    pred_ci.iloc[:, 1], color='k', alpha=.2)
     
    ax.set_xlabel('Date')
    ax.set_ylabel('CO2 Levels')
    plt.legend()
     
    plt.show()
     
    # Evaluation of model
    y_forecasted = pred.predicted_mean
    y_truth = y['1998-01-01':]
     
    # Compute the mean square error
    mse = ((y_forecasted - y_truth) ** 2).mean()
    print('The Mean Squared Error of our forecasts is {}'.format(round(mse, 2)))
     
    '''
    5-Dynamic Prediction
    get_prediction(..., dynamic=True)
    Prediction of each point will use all historic observations prior to 'start' and
    all predicted values prior to the point to predict  
    '''
     
    pred_dynamic = results.get_prediction(start=pd.to_datetime('1998-01-01'), dynamic=True, full_results=True)
    pred_dynamic_ci = pred_dynamic.conf_int()
     
    ax = y['1990':].plot(label='observed', figsize=(20, 15))
    pred_dynamic.predicted_mean.plot(label='Dynamic Forecast', ax=ax)
     
    ax.fill_between(pred_dynamic_ci.index,
                    pred_dynamic_ci.iloc[:, 0],
                    pred_dynamic_ci.iloc[:, 1], color='k', alpha=.25)
     
    ax.fill_betweenx(ax.get_ylim(), pd.to_datetime('1998-01-01'), y.index[-1],
                     alpha=.1, zorder=-1)
     
    ax.set_xlabel('Date')
    ax.set_ylabel('CO2 Levels')
     
    plt.legend()
    plt.show()
     
    # Extract the predicted and true values of our time-series
    y_forecasted = pred_dynamic.predicted_mean
    y_truth = y['1998-01-01':]
     
    # Compute the mean square error
    mse = ((y_forecasted - y_truth) ** 2).mean()
    print('The Mean Squared Error of our forecasts is {}'.format(round(mse, 2)))
     
    '''
    6-Visualize Prediction
    In-sample forecast: forecasting for an observation that was part of the data sample;
    Out-of-sample forecast: forecasting for an observation that was not part of the data sample.
    '''
     
    # Get forecast 500 steps ahead in future
    # 'steps': If an integer, the number of steps to forecast from the end of the sample.
    pred_uc = results.get_forecast(steps=500)  # retun out-of-sample forecast 
     
    # Get confidence intervals of forecasts
    pred_ci = pred_uc.conf_int()
     
    ax = y.plot(label='observed', figsize=(20, 15))
    pred_uc.predicted_mean.plot(ax=ax, label='Forecast')
    ax.fill_between(pred_ci.index,
                    pred_ci.iloc[:, 0],
                    pred_ci.iloc[:, 1], color='k', alpha=.25)
    ax.set_xlabel('Date')
    ax.set_ylabel('CO2 Levels')
     
    plt.legend()
    plt.show()
    

     

    展开全文
  • 概述 时间序列 四种变动方式: 长期趋势:移动平均法(简单,加权),指数平滑法,最小二乘法 季节变动:同期平均法,长期趋势剔除法 循环变动,不规则变动 几大模型 ...

    概述

    时间序列分析是研究事物随时间变化规律的数据分析方法。
    通常按照时间序列的波动类型,可分为长期趋势,季节波动,循环变动和不规则变动

    长期趋势

    研究对象的某些指标在相当长的一段时间里所呈现出来的持续增加,持续减少或保持平稳的趋势和形态。如国内生产总值。

    季节变动

    季节变动是指由于季节的交替转变使得时间序列的数值发生周期性的变化。如羽绒服销量等现象呈季节变动。

    循环变动

    循环变动是指时间序列的数值以很长一段时间(通常为年为单位)为周期进行波浪式变动。如:经济周期。

    不规则变动

    不规则变动时指由随机因素引起的,这种变动幅度时大时小不可预测。

    上述四种序列的数值变动方式可能同时出现,共同影响指标数值的变动形态,也可能只出现一两种,通常组合方式为两种:

    1.四种因素相互独立,可用加法模型表示:
    时间序列的数值变动 = 长期趋势 + 季节变动 + 循环变动 + 不规则变动
    2.更常用的时乘法模型,适用于几种因素相互影响的情况:
    时间序列的数值变动 = 长期趋势 X 季节变动 X 循环变动 X不规则变动

    通常时间序列分析时对数值总变动进行分解,将总变动分解成四种变动方式中的一种或几种,然后再单独对每种变动方式进行分析,分析他们的变动趋势和变动原因。

    时间序列分解模型体系

    长期趋势的时间序列分析

    移动平均法

    在原时间序列内依次求连续若干期的平均数作为其某一期的趋势值,如此逐项递移求得一系列的移动平均数,形成一个平均数时间序列。
    例:
    在这里插入图片描述
    虽然个别年份有出现比前一年下降的情况,但是移动平均后获得的数值并没有上下起伏,所以可以说这家公司10年来销售量持续增长。
    与此类似,
    还有
    加权移动平均法:即对每一项给予权值,然后再平均;
    指数平滑法:指数平滑法时特殊的加权移动平均法,即设置平滑系数,其他数值可以根据指数平滑的数学模型推算出来。

    最小二乘法

    使用回归分析中的最小二乘,构建时间为t的趋势方程,然后进行预测。

    季节变动趋势中的事件序列分析

    同期平均法

    在这里插入图片描述上表格中,季节指数代表了不同季度的特征数值占全年的总数值比例,季节指数越高,表明由季节因素引起的数值变动比例越大。
    同期平均法可以显示不同时间单位的指标数值季节变化趋势。同时同期平均法只剔除了不规则变动的影响,没有剔除长期趋势的变动影响。从表中可以看到,没一年的特征数值总和都在上升,由稳定增长的长期趋势。所以还应该剔除长期趋势的变动影响。

    长期趋势剔除法

    总变动(Z) = 长期趋势© + 季节变动(J) + 循环变动(X) + 不规则变动(B)
    总变动(Z) = 长期趋势© X 季节变动(J) X 循环变动(X) X 不规则变动(B)
    通常情况,都会互相影响,所以根据乘积关系,长期趋势剔除法的计算公式:
    J B = Z C X JB = \frac{Z}{CX} JB=CXZ

    循环变动和不规则变动

    将原始序列改为以年为周期,可剔除季节变动对总变动的影响,只反映长期趋势,循环变动和不规则变动,利用回归方程法可确定长期趋势,由于不规则变动时由于随机因素引起,所以长时间的变动之和趋于0。所以将序列单位换为年,剔除长期趋势,即可以确定循环变动。

    AR/MA/ARMA/ARIMA模型体系

    时间序列分解是力求将时间序列分解成不同的变动成分,分析每种变动成分的规律,然后在综合各种成分的规律用于预测;除时间序列分解之外,AR/MA/ARMA/ARIMA模型体系则是从时间序列数值本身的相关关系出发,将移动平均技术、相关分析技术和平稳技术(差分)等纳入模型,力求建立时间序列数值之间的回归方程,从而达到预测的目的。

    参考

    书籍:《人人都会数据分析:从生活实例学统计》
    数据分析技术:时间序列分析的AR/MA/ARMA/ARIMA模型体系

    展开全文
  • 1. 实际销售额=预估销售额...季节变动客观现象由于受自然因素和生产或生活条件的影响,在一年内随着季节的更换而引起的比较有规律的,可以预测的周期变动。循环变动的周期在一年以上,且周期长短不同,没有固定的变
  • 时间序列可以分解为加法模型,适用于当季节变动大致相等等情况,其表现形式为:Yi=Ti+Si+Ci+Ii 乘法模型 multiplicative model 时间序列也可以分解为乘法模型,适用于季节变动与时间序列的长期趋势大致成正比的情况...
  • EXCEL篇—时间序列分析(季节指数法)

    万次阅读 多人点赞 2019-08-13 13:35:42
    在百科里,时间序列分析分析的解释是这样的:时间序列(或称动态数列)是将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。时间序列分析的主要目的是根据已有的历史数据对未来进行预测。经济数据中...
  • 时间序列规则和时间序列模型

    千次阅读 2020-08-22 17:57:40
    时间序列(或称动态数列):将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。通常是在相等间隔的时间段内依照给定的采样率对某种潜在过程进行观测的结果。 目的:时间序列数据本质上反映的是某个或者...
  • 假期收到导师布置的作业,用时间序列季节指数的方法预测虫情,由于数据量比较少,用python的话有点杀鸡用牛刀了,用Excle简单、方便、又快捷,直接起飞。 时间序列 时间序列(或称动态数列)是将同一统计指标的...
  • 时间序列相关问题:ARMA模型有用到差分吗?时间序列分解法的过程?季节差分如何选择周期步长?X-11过程?季节与周期的区别与联系?AR模型的残差序列?GARCH模型?
  • 时间序列是反映社会、经济、自然现象的数据按时间先后顺序记录形成的数列。比如:高低气温、某商品日成交量、股票日收盘价格、公司历年利润额。 时间序列形式上由反映客观现象的观测值和这些数值所属的时间两个...
  • 季节性(seasonality):季节变动(seasonal fluctuation),是时间序列在一年内重复出现的周期波动。销售旺季,销售淡季,旅游旺季、旅游淡季,因季节不同而发生变化。季节,不仅一年中的四季,其实是任何一种...
  • 它也不同于季节变动季节变动有比较固定的规律,而且变动周期大多为一年,循环波动则无固定规律,变动周期多在一年以上,且周期长短不一。周期性通常是由经济环境的变化引起的。 除此之外,还有些偶然性因素对时间...
  • 文章目录时间序列分析和预测时间序列及其分解时间序列的描述性分析时间序列预测的程序确定时间序列成分选择预测方法预测方法的评估平稳序列的预测...线性趋势预测非线性趋势预测复合型序列的分解预测确定并分离季节成分...
  • 时间序列

    2017-11-27 20:17:00
    时间序列也成动态序列,是将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列有两个组成要素构成:1、第一个要素是时间要素;2、第二个是数值要素。时间序列根据时间和数值性质的不同 ,可以分为时期...
  • 时间序列分析

    千次阅读 2020-03-01 11:53:48
    季节性也叫做季节变动,它是时间序列在一年内重复出现的周期性波动,比如旅游业中的旺季和淡季,某种产品的销量在不同的季节销量。广义上季节性其实是任何一种周期性的变化。 周期性 周期性也叫做循环波动,是...
  • 利用深度学习来预测股票价格变动

    千次阅读 多人点赞 2019-09-10 20:52:12
    在这篇文章中,我将创建一个预测股票价格变动的完整过程。我们将使用生成对抗网络(GAN)与LSTM(一种循环神经网络)作为生成器,使用卷积神经网络CNN作为鉴别器。我们使用LSTM的原因很明显,我们正在尝试预测时间...
  • 剩余法的基本思想和原理是:从时间序列中一次或陆续消除趋势变动,季节变动,剩下循环波动和不规则波动,然后再将结果进行平滑,尽可能消去不规则成分,其剩余结果即为循环波动值。具体计算步骤如下:
  • 构成分析法:长期趋势、季节变动、循环变动、不规则变动
  • 时间序列预测方法最全总结!

    万次阅读 多人点赞 2021-03-12 00:15:38
    季节变动(Seasonal Variation, S):季节波动是由于季节的变化引起的现象发展水平的规则变动 循环波动(Cyclical Variation, C):循环波动以若干年为期限,不具严格规则的周期性连续变动 不规则波动(Irregular ...
  • 显然,从上图可以看出,中国社会消费品零售总额序列具有显著的季节变动特征,每年春夏季节3—8月是淡季(5,6月稍有回弹),冬季是销售旺季。 另外,在spss中计算季节指数,得到以下结果:(与excel计算的结果有...
  • 概率抽样,也称随机抽样,是遵循随机原则进行的抽样,总体中每个单位都有一定的机会呗选入样本。概率抽样具有如下特点: 抽样时是按一定的概率以随机原则抽取样本,使每个单位都有一定的机会被抽中 每个单位被抽...
  • 【单选题】由于自然条件、生产条件和生活习惯等因素的影响,随着季节的转变而呈现的周期性变动的预测方法是()。 【单选题】()具有简单、方便、可行的优点,适用于特征分布均匀的总体。 【单选题】在三相交流异步电动...
  • PPT内容这是一个关于统计学-时间序列分析ppt,主要介绍...8.1 时间序列的分解8.1.1 时间序列的构成成分长期趋势季节变动( S )循环变动(C)不规则变动(I)8.1.2 时间序列分解模型时间序列的组成成分之间可能是乘法或加...
  • 要获取更多数据点,一种做法是用更长的需求历史,比如选取52周的需求,我们的风险是失去了需求的代表性,特别是那些季节性明显的产品。另一种做法呢,就是把需求拆分地更细,比如把每周拆分成每天,我们的风险是需求...
  • 同比发展速度主要是为了消除季节变动的影响,用以说明本期发展水平与去年同期发展水平对比而达到的相对发展速度。 小 L:所以这里很明显的就是,日销售周期太短,不适合做同环比,这样理解起来就很容易了。 5.业务...
  • 统计学笔记(上)

    2021-05-05 16:16:26
    对照组:每个单位不接受实验组成员所接受的某种特别的处理 抽样误差:抽样的随机性引起的样本结果与总体真值之间的差异,其描述的是所有样本可能的结果与总体真值之间的平均差异 非抽样误差:除抽样误差之外的由...
  •  【解析】固定成本是在一定时期及一定业务量范围内,不直接受业务量变动的影响而保持固定不变的成本。约束性固定成本是管理当局的短期决策行动不能改变其具体数额的固定成本。如:保险费、房屋租金等;酌量性...
  • 同比、环比

    2019-12-25 15:59:18
    同比发展速度主要是为了消除季节变动的影响,用以说明本期发展水平与去年同期发展水平对比而达到的相对发展速度。如,本期2月比去年2月,本期6月比去年6月等。 2、环比:表示连续2个单位周期(比如连续两月)内的量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,671
精华内容 668
关键字:

季节变动是指