时间序列_时间序列分析 - CSDN
时间序列 订阅
时间序列(或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。时间序列分析的主要目的是根据已有的历史数据对未来进行预测。经济数据中大多数以时间序列的形式给出。根据观察时间的不同,时间序列中的时间可以是年份、季度、月份或其他任何时间形式。 [1] 展开全文
时间序列(或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。时间序列分析的主要目的是根据已有的历史数据对未来进行预测。经济数据中大多数以时间序列的形式给出。根据观察时间的不同,时间序列中的时间可以是年份、季度、月份或其他任何时间形式。 [1]
信息
外文名
time series
类    型
序列
作    用
描述现象的发展状态和结果
要素二
指标数值
中文名
时间序列
要素一
时间
构成要素
现象所属的时间等
时间序列简介
时间序列是按照时间排序的一组随机变量,它通常是在相等间隔的时间段内依照给定的采样率对某种潜在过程进行观测的结果。时间序列数据本质上反映的是某个或者某些随机变量随时间不断变化的趋势,而时间序列预测方法的核心就是从数据中挖掘出这种规律,并利用其对将来的数据做出估计。 [2]  构成要素:长期趋势,季节变动,循环变动,不规则变动。1)长期趋势( T )现象在较长时期内受某种根本性因素作用而形成的总的变动趋势。2)季节变动( S )现象在一年内随着季节的变化而发生的有规律的周期性变动。3)循环变动( C )现象以若干年为周期所呈现出的波浪起伏形态的有规律的变动。4)不规则变动(I )是一种无规律可循的变动,包括严格的随机变动和不规则的突发性影响很大的变动两种类型。 [3] 
收起全文
  • 算法模型---时间序列模型

    万次阅读 多人点赞 2020-04-20 00:57:22
    1、时间序列时间序列是时间间隔不变的情况下收集的不同时间点数据集合,这些集合被分析用来了解长期发展趋势及为了预测未来。 时间序列与常见的回归问题的不同点在于: 1、时间序列是跟时间有关的;而线性回归模型...

    文章来源

    时间序列

    时间序列是时间间隔不变的情况下收集的不同时间点数据集合,这些集合被分析用来了解长期发展趋势及为了预测未来。
    时间序列与常见的回归问题的不同点在于:
    1、时间序列是跟时间有关的;而线性回归模型的假设:观察结果是独立的在这种情况下是不成立的。
    2、随着上升或者下降的趋势,更多的时间序列出现季节性趋势的形式;

    常用的时间序列模型有AR模型(Autoregressive model:自回归模型)、MA模型(moving average model:滑动平均模型)、ARMA模型(Auto-Regressive and Moving Average Model:自回归滑动平均模型)和ARIMA模型(Autoregressive Integrated Moving Average Model:自回归积分滑动平均模型)等。

    时间序列的预处理(使数据平稳化和随机化)

    拿到一个观察值序列之后,首先要对它的平稳性和纯随机性进行检验,这两个重要的检验称为序列的预处理。根据检验的结果可以将序列分为不同的类型,对不同类型的序列我们会采用不同的分析方法。

    平稳化处理

    平稳 就是围绕着一个常数上下波动且波动范围有限,即有常数均值和常数方差。如果有明显的趋势或周期性,那它通常不是平稳序列。序列平稳不平稳,一般采用三种方法检验:

    时序图检验

    这里写图片描述

    看看上面这个图,很明显的增长趋势,不平稳。

    利用自相关系数和偏相关系数

    自相关系数和偏相关系数的概念可参考《算法模型— 概率论基础—相关系数相关》
    下面是不平稳数据的自相关和偏相关系数的一种情形。
    这里写图片描述
    左边第一个为自相关图(Autocorrelation),第二个偏相关图(Partial Correlation)。
    平稳的序列的自相关图和偏相关图要么拖尾,要么是截尾。截尾就是在某阶之后,系数都为 0 。怎么理解呢,看上面偏相关的图,当阶数为 1 的时候,系数值还是很大, 0.914;二阶长的时候突然就变成了 0.050. 后面的值都很小,认为是趋于 0 ,这种状况就是截尾。什么是拖尾,拖尾就是有一个缓慢衰减的趋势,但是不都为 0 。
    自相关图既不是拖尾也不是截尾。以上的图的自相关是一个三角对称的形式,这种趋势是单调趋势的典型图形,说明这个序列不是平稳序列。
    平稳序列的自相关系数会快速衰减。

    单位根检验

    单位根检验是指检验序列中是否存在单位根,如果存在单位根就是非平稳时间序列。
    单位根检验:ADF是一种常用的单位根检验方法,他的原假设为序列具有单位根,即非平稳,对于一个平稳的时序数据,就需要在给定的置信水平上显著,拒绝原假设。ADF只是单位根检验的方法之一,如果想采用其他检验方法,可以安装第三方包arch,里面提供了更加全面的单位根检验方法,个人还是比较钟情ADF检验。以下为检验结果,其p值大于0.99,说明并不能拒绝原假设。

    利用差分将序列数据转换为平衡序列

    差分可以将数据转换为平稳序列。
    一阶差分指原序列值相距一期的两个序列值之间的减法运算;k阶差分就是相距k期的两个序列值之间相减。如果一个时间序列经过差分运算后具有平稳性,则该序列为差分平稳序列,可以使用ARIMA模型进行分析。
    确定不平稳后,依次进行1阶、2阶、3阶…差分,直到平稳为止。

    随机化处理

    对于纯随机序列,又称白噪声序列,序列的各项数值之间没有任何相关关系,序列在进行完全无序的随机波动,可以终止对该序列的分析。白噪声序列是没有信息可提取的平稳序列。对于平稳非白噪声序列,它的均值和方差是常数。通常是建立一个线性模型来拟合该序的发展,借此提取该序列的有用信息。ARMA模型是最常用的平稳序列拟合模型。

    平稳时间序列建模

    某个时间序列经过预处理,被判定为平稳非白噪声序列,就可以进行时间序列建模。
    建模步骤:
    (1)计算出该序列的自相关系数(ACF)和偏相关系数(PACF);
    (2)模型识别,也称模型定阶。根据系数情况从AR§模型、MA(q)模型、ARMA(p,q)模型、ARIMA(p,d,q)模型中选择合适模型,其中p为自回归项,d为差分阶数,q为移动平均项数。
    若平稳序列的偏相关函数是截尾的,而自相关函数是拖尾的,可断定序列适合AR模型;若平稳序列的偏相关函数是拖尾的,而自相关函数是截尾的,则可断定序列适合MA模型;若平稳序列的偏相关函数和自相关函数均是拖尾的,则序列适合ARMA模型。(截尾是指时间序列的自相关函数(ACF)或偏自相关函数(PACF)在某阶后均为0的性质(比如AR的PACF);拖尾是ACF或PACF并不在某阶后均为0的性质(比如AR的ACF)。)
    (3)估计模型中的未知参数的值并对参数进行检验;
    (4)模型检验;
    (5)模型优化;
    (6)模型应用:进行短期预测。

    混合自回归移动平均过程(公式表达)

    差分方程
    所谓差分方程即将变量 yty_t与它的滞后期联系起来的表达式。
    研究变量在第t期的值记为yty_t。假定给出的动态方程将变量y第t期的值与另外的变量wtw_t以及y的前一期联系起来:
    yt=ϕyt1+wty_t=ϕy_{t−1}+w_t
    上述称为一阶差分方程是因为仅仅只有变量的一阶滞后(yt1)(y_t−1)出现在方程中。
    移动平均
    “移动平均”的含义源于YtY_t是最近两期的ϵ\epsilon的加权平均。
    ϵt{\epsilon_t}是一个白噪声序列。
    Yt=μ+ϵt+θϵt1Y_t=μ+\epsilon_t+θ\epsilon_{t−1}
    其中μ和θ可以是任意的常数。这个时间序列称为一阶移动平均过程,记为MA(1)MA(1)
    自回归过程
    一阶自回归过程
    一个一阶自回归,记作AR(1)AR(1)满足下面的差分方程
    Yt=c+ϕYt1+ϵtY_t=c+ϕY_{t−1}+\epsilon_t
    ϵt{\epsilon_t}是一个白噪声序列。
    p阶自回归过程
    一个p阶自回归,记作AR(p)AR(p)满足下式
    Yt=c+ϕ1Yt1+ϕ2Yt2+...+ϕpYtp+ϵtY_t=c+ϕ_1Y_{t−1}+ϕ_2Y_{t−2}+...+ϕ_pY{t−p}+\epsilon_t
    混合自回归移动平均过程
    一个ARMA(p,q)ARMA(p,q)过程包括自回归和移动平均项:
    Yt=c+ϕ1Yt1+ϕ2Yt2+...+ϕpYtp+ϵt+θ1ϵt1+θ2ϵt2+...+θqϵtqY_t=c+ϕ_1Y_{t−1}+ϕ_2Y_{t−2}+...+ϕ_pY{t−p}+\epsilon_t+θ_1ϵ_{t−1}+θ_2ϵ{t−2}+...+θ_qϵ_{t−q}

    利用statsmodels库实现时间序列的分析处理

    Time Series analysis tsa
    statsmodels.tsa.arima_model.ARIMA
    AR(I)MA时间序列建模过程——步骤和python代码
    Seasonal ARIMA with Python
    Python 3中使用ARIMA进行时间序列预测的指南
    Python_Statsmodels包_时间序列分析_ARIMA模型
    时间序列实战(一)
    How to Make Predictions for Time Series Forecasting with Python
    How to Use and Remove Trend Information from Time Series Data in Python
    时间序列分析之ARIMA上手-Python
    [python] 时间序列分析之ARIMA

    python中有专门的库statsmodels可以用来作时间序列分析,但spark中则没有现成的。

    #-*- coding: utf-8 -*-
    import matplotlib.pyplot as plt
    import pandas as pd
    data=pd.read_csv('./HIS_MONTH.csv')
    b=data['fData']
    plt.plot(data['fData'])
    plt.show()
    

    数据结构如下
    这里写图片描述

    #自相关图
    from statsmodels.graphics.tsaplots import plot_acf
    plot_acf(data['fData']).show()
    

    如下所示
    这里写图片描述
    从图上可以自相关系数基本是拖尾的,稍做调整就可以使用。

    #偏自相关图
    from statsmodels.graphics.tsaplots import plot_pacf
    plot_pacf(data['fData']).show()
    

    如下图所示
    这里写图片描述
    偏相关系数也基本符合拖尾。

    #平稳性检测
    from statsmodels.tsa.stattools import adfuller as ADF
    print('原始序列的ADF检验结果为:')
    print(ADF(data['fData']))
    #返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
    

    如下所示

    原始序列的ADF检验结果为:
    (-6.561077625309946, 8.378411469638636e-09, 0L, 47L, {'5%': -2.925338105429433, '1%': -3.5778480370438146, '10%': -2.6007735310095064}, 273.5266547319719)
    

    p值远小于0.05,拒绝原假设(原假设认为存在单位根),所以该序列为平衡时间序列。

    #白噪声检验
    from statsmodels.stats.diagnostic import acorr_ljungbox
    print('差分序列的白噪声检验结果为:')
    print(acorr_ljungbox(data['fValueData'], lags=1))
    

    结果如下

    差分序列的白噪声检验结果为:
    (array([0.05198092]), array([0.81965149]))
    

    P=0.81965149,统计量的P值大于显著性水平0.05,则接受原假设(原假设认为为白噪声序列)。

    下面对原序列做一阶差分运算

    #差分后的结果
    D_data = data['fValueData'].diff().dropna()
    D_data.columns = ['fValueData']
    #时序图
    D_data.plot()
    

    结果如下:
    这里写图片描述
    从图上看,一阶差分后,感觉数据分布更对称为随机了。

    #自相关图
    plot_acf(D_data).show()
    plt.show()
    

    结果如下
    这里写图片描述
    从图上看,一阶差分对数据有改善,振荡衰减更明显

    #偏自相关图
    plot_pacf(D_data).show()
    

    结果如下
    这里写图片描述
    从图上看,偏相关系数虽然没有自相关系数好,但基本能满足平稳序列的要求。

    #平稳性检测
    print('差分序列的ADF检验结果为:')
    print( ADF(D_data))
    

    结果如下

    差分序列的ADF检验结果为:
    (-4.595500765524432, 0.0001316587309452837, 10L, 36L, {'5%': -2.9459512825788754, '1%': -3.626651907578875, '10%': -2.6116707716049383}, 270.35268975914374)
    

    p值远小于0.05,拒绝原假设(原假设认为存在单位根),所以该序列为平衡时间序列。

    #白噪声检验
    from statsmodels.stats.diagnostic import acorr_ljungbox
    #返回统计量和p值
    print('差分序列的白噪声检验结果为:')
    print(acorr_ljungbox(D_data, lags=1))
    

    结果如下:

    差分序列的白噪声检验结果为:
    (array([12.35619393]), array([0.00043953]))
    

    P=0.00043953,统计量的P值小于显著性水平0.05,则拒绝原假设(原假设认为为白噪声序列),所以一阶差分后该序列为非白噪声序列,有进一步分析的价值。

    Holt-Winters模型原理及python实现

    本部分来源,也可以参考该文

    原理分析

    公式前面也写过,这里再表述一下,有时间再来整理
    假设随机时间序列为:
    xt(t=1,2,,N,N=n)x_t(t=1,2,\ldots,N,N=n)
    时间序列数据一般有以下几种特点:1.趋势(Trend) 2. 季节性(Seasonality)。
    趋势描述的是时间序列的整体走势,比如总体上升或者总体下降。下图所示的时间序列是总体上升的:
    这里写图片描述
    季节性描述的是数据的周期性波动,比如以年或者周为周期,如下图:
    这里写图片描述
    三次指数平滑算法可以对同时含有趋势和季节性的时间序列进行预测,该算法是基于一次指数平滑和二次指数平滑算法的。

    移动平均(The simple moving average (MA))

    直观上,最简单的平滑时间序列的方法是实现一个无权重的移动平均,目前已知的方法是用窗口函数,平滑统计量 StS_t就是最近k个观察值的均值。公式如下:

    st=1kn=0k1xtn=xt+xt1++xtk+1k=st1+xtxtkk s_t=\frac{1}{k} \sum_{n=0}^{k-1} x_{t-n}=\frac{x_t+x_{t-1}+\ldots + x_{t-k+1}}{k}=s_{t-1}+\frac{x_t -x_{t-k}}{k}

    这样的方法存在明显的缺陷,当k比较小时,预测的数据平滑效果不明显,而且突出反映了数据最近的变化;当k较大时,虽然有较好的平滑效果,但是预测的数据存在延迟。而且最少需要k个值(窗口有限)。

    加权移动平均

    一种稍微复杂的方法是先选择一组权重因子来计算加权移动平均
    ω1,ω2,,ωk,n=1kωn=1 {\omega_1,\omega_2,\ldots,\omega_k},满足\sum_{n=1}^{k}\omega_n=1
    然后用这些权重来计算这些平滑统计量:
    st=n=1kωnxtn+1=ω1xt+ω2xt1++ωkxtk+1 s_t=\sum_{n=1}^{k}\omega_n x_{t-n+1}=\omega_1x_t+\omega_2 x_{t-1}+\ldots+\omega_{k}x_{t-k+1}
    在实践中,通常在选择权重因子时,赋予时间序列中的最新数据更大的权重,并减少对旧数据的权重。这个方法也需要最少k个值,并且计算复杂。

    简单指数平滑法

    幸运地是有一种方法可以避免上述问题,它叫做指数平滑法。最简单的指数平滑法如下:
    si=αxi+(1α)si1 s_i = \alpha x_i + (1-\alpha)s_{i-1}
    其中α\alpha是平滑因子,0<α<10 < \alpha < 1sis_i是当前时刻的平滑值。换句话说,平滑统计值SiS_i是当前统计值XtX_t与上一时间平滑值Si1S_{i-1}加权平均。这个简单指数平滑是很容易被应用的,因为只要有两个观察值就能计算了。这里α的选取,我们可以采用最小二乘来决定α\alpha(最小化(stxt)2(s_t-x_t)^2)。
    一次指数平滑算法进行预测的公式为:
    xi+h=six_{i+h}=s_i
    其中i为当前最后的一个数据记录的坐标,亦即预测的时间序列为一条直线,不能反映时间序列的趋势和季节性。

    为什么被称为“指数”平滑法
    从它的递推公式就能发现:

    简单指数平滑法适用于没有总体趋势的时间序列。如果用来处理有总体趋势的序列,平滑值将往往滞后于原始数据,除非α的值接近1,但这样一来就会造成不够平滑。

    二次指数平滑(HoltWinters-无季节趋势)

    为了解决上述问题,于是引出了二次指数平滑,能够保留总体趋势信息。因为将指数平滑应用了两次,所以被称为二次指数平滑。与简单指数平滑相比,二次指数平滑加入了时间趋势统计量tit_i,公式如下:
    si=αxi+(1α)(si1+ti1)ti=β(sisi1)+(1β)ti1 s_i=\alpha x_i + (1-\alpha)(s_{i-1}+t_{i-1})\\ t_i=\beta (s_i-s_{i-1}) + (1-\beta)t_{i-1}
    sis_i添加了与一次指数平滑相比,添加了一个新的趋势项tit_i;而tit_i的表达式与一次指数平滑形式上是一样的,只不过用将xix_i换成(sisi1)(s_i-s_{i-1}),趋势可以想像成增量,就是在此刻与上一刻的差值,趋势当然应该用平滑后的数据的差值;同时将一次平滑中的si1s_{i-1}换成ti1t_{i-1}
    二次指数平滑的预测公式为
    xi+h=si+h ti x_{i+h}=s_i+h \ t_i
    二次指数平滑的预测结果是一条斜的直线

    三次指数平滑

    三次指数平滑将时间序列的季节性这一特征也考虑进去了。
    季节性被定义为时间序列数据的趋势,它表现出每一个周期重复自身的行为,就像任何周期函数一样。“季节”这个词用来表示行为每隔时间段L就开始自我重复。在自然界中有不同类型的季节性“累加性”(additive)和“累乘性“(multiplicative),就像加法和乘法是数学的基本运算。
    如果每个12月都比每个11月多卖出1000套公寓,我们就说这样的季节趋势是“累加性”的。可以用绝对增⻓来表示。如果我们在夏季比冬季多卖出10%的公寓,那么季节趋势在自然中是“累乘性”的。
    累乘性公式如下:
    下面的式子中kk表示季节频率,这个还需要查资料进行理解
    si=αxipik+(1α)(si1+ti1)ti=β(sisi1)+(1β)ti1pi=γxisi+(1γ)ptk s_i=\alpha \frac{x_i }{p_{i-k}} +(1-\alpha)(s_{i-1}+t_{i-1})\\ t_i=\beta (s_i-s_{i-1}) + (1-\beta)t_{i-1}\\ p_i=\gamma \frac{x_i}{s_i} + (1-\gamma)p_{t-k}\\
    上式中k为周期, 累乘三次指数平滑的预测公式为:
    xi+h=(si+h ti)pik+(h mod k) x_{i+h}=(s_i+h\ t_i)p_i-k+(h\ mod\ k)
    或者
    xi+h=(si+h ti)pik+1+(h1) mod k x_{i+h}=(s_i+h\ t_i)p_{i-k+1+(h-1) \ mod \ k}
    两个公式还需要确认下
    累乘性公式初始值的计算
    sk=1k(s1+s2++sk)tk=1k[xk+1x1k+xk+2x2k++xk+kxkk]p1=x1sk,p2=x2sk,,pk=xksk s_k=\frac{1}{k} (s_1+s_2+\cdots+s_k)\\ t_k=\frac{1}{k}\left[ \frac{x_{k+1}-x_1}{k}+\frac{x_{k+2}-x_2}{k}+\cdots+\frac{x_{k+k}-x_k}{k} \right]\\ p_1=\frac{x_1}{s_k},p_2=\frac{x_2}{s_k},\cdots,p_k=\frac{x_k}{s_k}

    累加性公式如下:
    si=α(xipik)+(1α)(si1+ti1)ti=β(sisi1)+(1β)ti1pi=γ(xisi)+(1γ)pikxi+h=si+hbi+pik+h mod k s_i=\alpha (x_i-p_{i-k} )+(1-\alpha)(s_{i-1}+t_{i-1})\\ t_i=\beta (s_i-s_{i-1}) + (1-\beta)t_{i-1}\\ p_i=\gamma (x_i-s_i) + (1-\gamma)p_{i-k}\\ x_{i+h}=s_i+hb_i + p_{i-k+h \ mod \ k}
    或者
    xi+h=si+hbi+pik+1+(h1) mod k x_{i+h}=s_i+hb_i + p_{i-k+1+(h-1) \ mod \ k}
    两个公式还需要确认下
    累加性公式初始值的计算
    sk=1k(s1+s2++sk)tk=1k[xk+1x1k+xk+2x2k++xk+kxkk]p1=x1sk,p2=x2sk,,pk=xksk s_k=\frac{1}{k} (s_1+s_2+\cdots+s_k)\\ t_k=\frac{1}{k}\left[ \frac{x_{k+1}-x_1}{k}+\frac{x_{k+2}-x_2}{k}+\cdots+\frac{x_{k+k}-x_k}{k} \right]\\ p_1=x_1-s_k,p_2=x_2-s_k,\cdots,p_k=x_k-s_k
    其中 α\alpha是数据平滑因子, 0<α<10 < \alpha < 1;β\beta是趋势平滑因子,0<β<10 < \beta < 1; γ\gamma是季节改变平滑因子0<γ<10 < \gamma < 1
    αβγ\alpha,\beta,\gamma的值都位于[0,1]之间,可以多试验几次以达到最佳效果。

    s,t,ps,t,p初始值的选取对于算法整体的影响不是特别大,通常的取值为s0=x0,t0=x1x0s_0=x_0,t_0=x_1-x_0,累加时p=0p=0,累乘时p=1p=1.
    对三次指数平滑法而言,我们必须初始化一个完整的“季节”pip_i的值,不过我们可以简单地设置为全1(针对累乘式)或全0(针对累加式)。只有当序列的⻓度较短时,我们才需要慎重考虑初始值的选取。
    我们这里讲的Holt-Winters模型就是三次指数平滑法。哇,终于切入正题了。
    所有的指数平滑法都要更新上一时间步⻓的计算结果,并使用当前时间步⻓的数据中包含的新信息。它们通过“混合”新信息和旧信息来实现,而相关的新旧信息的权重由一个可调整的拌和参数来控制。各种方法的不同之处在于它们跟踪的量的个数和对应的拌和参数的个数。三次指数平滑法,功能最强大,既能体现趋势性又能体现季节性,所以三次指数平滑法的参数最多,有三个。
    下图为使用累加三次指数平滑进行预测的效果:其中红色为源时间序列,蓝色为预测的时间序列,αβγ\alpha,\beta,\gamma的取值为0.45,0.2,0.95:

    下图为累乘三次指数平滑进行预测的效果,αβγ\alpha,\beta,\gamma的取值为0.4,0.05,0.9:

    可以看到三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息,在International Airline Passengers数据集上累乘平滑指数算法的效果更好。

    python代码实现

    我们知道HoltWinters模型有三个可调参数,我们的目的就是训练出有效的α,β, γ
    。我们有两种方法,一种就是自己取值来试试,一种就是采用数值优化的思想,比如
    前面我们提到的最小二乘来最小化误差来求参数(注意不一定能全局收敛!这个问题
    实在是让人头痛。。。)我们就采用最小二乘法(L-BFGS)。

    RMSE的实现

    statsmodels中的holtwinters

    statsmodels.tsa模块
    statsmodels.tsa.holtwinters源码
    statsmodels.tsa.holtwinters.ExponentialSmoothing
    ExponentialSmoothing - 指数平滑算法

    基于SVM作短期时间序列的预测

    传统的做法是提取1、2、3、4、5、7、9、13个单位时间的数据作为特征进行预测;
    举个例子进行分析,比如每天都有口香糖的销量,那么如何通过几周的数据预测明天的数据,
    就可以选择前1、2、3、4、5、7、14天的数据作为特征,从而预测明天的数据,
    通过构建特征,再选择核函数进行预测,其中调参的参数尽量要进行最优化,
    参考方法:如果选择RBF核函数,那么其中就会有三个参数,固定两个,然后不停的优化另外一个,直到得到最优解。

    具体应用的例子:

    (1)SVM预测风场:http://wenku.baidu.com/link?url=SCCIJJe8tXLbTjLMZ81x5Qy6elsceAKIOwtkZ0QxfSCQQ4KaWKwo8Biepjs3Ss2LJ2ewhisNR0ixrDY4kV1Rd7BcqWRenuTaG85K80E-30y
    (2)SVM预测股票指数:基于SVM修正的模糊时间序列模型在沪指预测中的应用
    (3)SVM预测时间序列其他方面:http://www.docin.com/p-233353900.html

    LSTM模型分析及对时序数据预测的具体实现(python实现)

    来源:2017年09月30日 10:28:08

    如何用LSTM自编码器进行极端事件预测?(含Python代码)

    时间序列的并行实现

    spark里面的库是没有时间序列算法的,但是国外有人已经写好了相应的算法。其github网址是:https://github.com/sryza/spark-timeseries
    sryza/spark-timeseries
    Spark-TimeSeries使用方法
    A New Library for Analyzing Time-Series Data with Apache Spark
    【Spark Summit East 2017】使用Spark进行时间序列分析

    基于小波变换的时间序列预测,Python实现,来自雪球

    清华AIOps算法:KPI聚类

    其他资料

    时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)
    Holt-Winters原理和初始值的确定

    展开全文
  • 时间序列分析和预测(含实例及代码)

    万次阅读 多人点赞 2020-07-10 10:54:48
    研究时间序列主要目的:进行预测,根据已有的时间序列数据预测未来的变化。 时间序列预测关键:确定已有的时间序列的变化模式,并假定这种模式会延续到未来。 时间序列预测法的基本特点 假设事物发展趋势会...

    导论

    研究时间序列主要目的:进行预测,根据已有的时间序列数据预测未来的变化。

    时间序列预测关键:确定已有的时间序列的变化模式,并假定这种模式会延续到未来。

    时间序列预测法的基本特点
    • 假设事物发展趋势会延伸到未来
    • 预测所依据的数据具有不规则性
    • 不考虑事物发展之间的因果关系

    时间序列数据用于描述现象随时间发展变化的特征

    时间序列分析就其发展历史阶段和所使用的统计分析方法看:传统的时间序列分析和现代时间序列分析

    一、时间序列及其分解

    时间序列(time series)是同一现象在不同时间上的相继观察值排列而成的序列。根据观察时间的不同,时间序列中的时间可以是可以是年份、季度、月份或其他任何时间形式。

    时间序列:

    (1)平稳序列(stationary series)

    是基本上不存在趋势的序列,序列中的各观察值基本上在某个固定的水平上波动,在不同时间段波动程度不同,但不存在某种规律,随机波动

    (2)非平稳序列(non-stationary series)

    是包含趋势、季节性或周期性的序列,只含有其中一种成分,也可能是几种成分的组合。可分为:有趋势序列、有趋势和季节性序列、几种成分混合而成的复合型序列。

    趋势(trend):时间序列在长时期内呈现出来的某种持续上升或持续下降的变动,也称长期趋势。时间序列中的趋势可以是线性和非线性。

    季节性(seasonality):季节变动(seasonal fluctuation),是时间序列在一年内重复出现的周期波动。销售旺季,销售淡季,旅游旺季、旅游淡季,因季节不同而发生变化。季节,不仅指一年中的四季,其实是指任何一种周期性的变化。含有季节成分的序列可能含有趋势,也可能不含有趋势。

    周期性(cyclicity):循环波动(cyclical fluctuation),是时间序列中呈现出来的围绕长期趋势的一种波浪形或振荡式波动。周期性是由商业和经济活动引起的,不同于趋势变动,不是朝着单一方向的持续运动,而是涨落相间的交替波动;不同于季节变动,季节变动有比较固定的规律,且变动周期大多为一年,循环波动则无固定规律,变动周期多在一年以上,且周期长短不一。周期性通常是由经济环境的变化引起。

    除此之外,还有偶然性因素对时间序列产生影响,致使时间序列呈现出某种随机波动。时间序列除去趋势、周期性和季节性后的偶然性波动,称为随机性(random),也称不规则波动(irregular variations)。

    时间序列的成分可分为4种:趋势(T)、季节性或季节变动(S)、周期性或循环波动(C)、随机性或不规则波动(I)。传统时间序列分析的一项主要内容就是把这些成分从时间序列中分离出来,并将它们之间的关系用一定的数学关系式予以表达,而后分别进行分析。按4种成分对时间序列的影响方式不同,时间序列可分解为多种模型:加法模型(additive model),乘法模型(multiplicative model)。乘法模型:Y_t=T_t\times S_t\times C_t\times I_t

    二、描述性分析

    1、图形描述

    2、增长率分析

    是对现象在不同时间的变化状况所做的描述。由于对比的基期不同,增长率有不同的计算方法。

    (1)增长率(growth rate):增长速度,是时间序列中报告期观察值与基期观察值之比减1后的结果,用%表示。由于对比的基期不同,可分为环比增长率和定基增长率。

    环比增长率:是报告期观察值与前一时期观察值之比减1,说明现象逐期增长变化的程度;

    定基增长率是报告期观察值与某一固定时期观察值之比减1,说明现象在整个观察期内总的增长变化程度。

    设增长率为G:          环比增长率 :G_i=\frac{Y_i-Y_{i-1}}{Y_{i-1}}=\frac{Y_i}{Y_{i-1}}-1,i=1,2...,n

                                           定基增长率 :G_i=\frac{Y_i-Y_{0}}{Y_{0}}=\frac{Y_i}{Y_{0}}-1,i=1,2...,n

    (2)平均增长率(average rate of increase):平均增长速度,是时间序列中逐期环比值(环比发展速度)的几何平均数减1的结果:\bar{G}=\sqrt[n]{\frac{Y_1}{Y_{0}}\times \frac{Y_2}{Y_{1}}...\times \frac{Y_n-Y_{n-1}}{Y_{i-1}}}-1=\sqrt[n]{\frac{Y_n}{Y_{0}}}-1   n:环比值的个数

    (3)增长率分析中应注意的问题

    i:    当时间序列中的观察出现0或负数时,不宜计算增长率。这种序列计算增长率,要么不符合数学公理,要么无法解释其实际意义。可用绝对数进行分析。

    ii:    有些情况下,不能单纯就增长率论增长率,注意增长率与绝对水平结合起来。增长率是一个相对值,与对比的基数值的大小有关。这种情况,计算增长1%的绝对值来克服增长率分析的局限性:

    增长1%的绝对值表示增长率每增长一个百分点而增加的绝对数量:增长1%的绝对值=前期水平/100

    三、时间序列预测的程序

    时间序列分析的主要目的之一是根据已有的历史数据对未来进行预测。时间序列含有不同的成分,如趋势、季节性、周期性和随机性。对于一个具体的时间序列,它可能含有一种成分,也可能同时含有几种成分,含有不同成分的时间序列所用的预测方法是不同的。预测步骤:

    第一步:确定时间序列所包含的成分,确定时间序列的类型

    第二步:找出适合此类时间序列的预测方法

    第三步:对可能的预测方法进行评估,以确定最佳预测方案

    第四步:利用最佳预测方案进行预测

    1、确定时间序列成分

    (1)确定趋势成分

    确定趋势成分是否存在,可绘制时间序列的线图,看时间序列是否存在趋势,以及存在趋势是线性还是非线性。

    利用回归分析拟合一条趋势线,对回归系数进行显著性检验。回归系数显著,可得出线性趋势显著的结论。

    (2)确定季节成分

    确定季节成分是否存在,至少需要两年数据,且数据需要按季度、月份、周或天来记录。可绘图,年度折叠时间序列图(folded annual time series plot),需要将每年的数据分开画在图上,横轴只有一年的长度,每年的数据分别对应纵轴。如果时间序列只存在季节成分,年度折叠时间序列图中的折线将会有交叉;如果时间序列既含有季节成分又含有趋势,则年度折叠时间序列图中的折线将不会有交叉,若趋势上升,后面年度的折线将会高于前面年度的折线,若下降,则后面年度的折线将会低于前面年度的折线。

    2、选择预测方法

    确定时间序列类型后,选择适当的预测方法。利用时间数据进行预测,通常假定过去的变化趋势会延续到未来,这样就可以根据过去已有的形态或模式进行预测。时间序列的预测方法:传统方法:简单平均法、移动平均法、指数平滑法等,现代方法:Box-Jenkins 的自回归模型(ARMA)。

    一般来说,任何时间序列都会有不规则成分存在,在商务和管理数据中通常不考虑周期性,只考虑趋势成分和季节成分。

    不含趋势和季节成分的时间序列,即平稳时间序列只含随机成分,只要通过平滑可消除随机波动。因此,这类预测方法也称平滑预测方法。

    3、预测方法的评估

    在选择某种特定的方法进行预测时,需要评价该方法的预测效果或准确性。评价方法是找出预测值与实际值的差距,即预测误差。最优的预测方法就是预测误差达到最小的方法。

    预测误差计算方法:平均误差,平均绝对误差、均方误差、平均百分比误差、平均绝对百分比误差。方法的选择取决于预测者的目标、对方法的熟悉程度。

    (1)平均误差(mean error):Y:观测值,F:预测值,n预测值个数

                   ME=\frac{\sum_{i=1}^{n}(Y_i-F_i)}{n}     

    由于预测误差的数值可能有正有负,求和的结果就会相互抵消,这种情况下,平均误差可能会低估误差。

    (2)平均绝对误差(mean absolute deviation)是将预测误差取绝对值后计算的平均无擦,MAD:

                  MAD=\frac{\sum_{i=1}^{n}|Y_i-F_i|}{n}

    平均绝对误差可避免误差相互抵消的问题,因而可以准确反映实际预测误差的大小。

    (3)均方误差(mean square error):通过平方消去误差的正负号后计算的平均误差,MSE:

                MSE=\frac{\sum_{i=1}^{n}(Y_i-F_i)^2}{n}

    (4)平均百分比误差和平均绝对百分比误差

    ME,MAD,MSE的大小受时间序列数据的水平和计量单位的影响,有时并不能真正反映预测模型的好坏,只有在比较不同模型对同一数据的预测时才有意义。平均百分比误差(mean percentage error,MPE)和平均绝对百分比误差(mean absolute percentage error,MAPE)则不同,它们消除了时间序列数据的水平和计量单位的影响,是反映误差大小的相对值。

    MPE=\frac{\sum_{i=1}^{n}(\frac{Y_i-F_i}{Y_i}\times 100)}{n} 

    MAPE=\frac{\sum_{i=1}^{n}(\frac{|Y_i-F_i|}{Y_i}\times 100)}{n}

    4、平稳序列的预测

    平稳时间序列只含有随机成分,预测方法:简单平均法、移动平均法、指数平滑法。主要通过对时间序列进行平滑以消除随机波动,又称平滑法。平滑法可用于对时间序列进行短期预测,也可对时间序列进行平滑以描述序列的趋势(线性趋势和非线性趋势)。

    (1)简单平均法:根据已有的t期观察值通过简单平均法来预测下一期的数值。设时间序列已有的t期观察值为Y_1,Y_2,...,Y_t,则t+1期的预测值F_{t+1}为:F_{t+1}=\frac{1}{t}(Y_1+Y_2+...+Y_t)=\frac{1}{t}\sum_{i=1}^{t} Y_i

    到了t+1期后,有了t+1期的实际值,t+1期的预测误差e_{t+1}为:e_{t+1}=Y_{t+1}-F_{t+1}

    t+2期预测值:F_{t+2}=\frac{1}{t+1}(Y_1+Y_2+...+Y_t+Y_{t+1})=\frac{1}{t+1}\sum_{i=1}^{t+1} Y_i

    简单平均法适合对较为平稳的时间序列进行预测,即当时间序列没有趋势时,用该方法比较好。但如果时间序列有趋势或季节成分,该方法的预测则不够准确。简单平均法将远期的数值和近期的数值看作对未来同等重要。从预测角度,近期的数值比远期的数值对未来有更大的作用,因此简单平均法预测的结果不够准确。

    (2)移动平均法(moving average):通过对时间序列逐期递移求得平均数作为预测值的一种预测方法,有简单移动平均法(simple moving average)和加权移动平均法(weighted moving average).

    简单移动平均将最近k期数据加以平均,作为下一期的预测值。设移动平均间隔为k(1<k<t),则t期的移动平均值为:

    \bar{Y}_{t}=\frac{Y_{t-k+1}+Y_{t-k+2}+...+Y_{t-1}+Y_{t}}{k}  是对时间序列的平滑结果,通过这些平滑值可描述出时间序列的变化形态或趋势。也可以用来预测。

    t+1期的简单移动平均预测值为:F_{t+1}=\bar{Y}_{t}=\frac{Y_{t-k+1}+Y_{t-k+2}+...+Y_{t-1}+Y_{t}}{k}

    t+2期的简单移动平均预测值为:F_{t+2}=\bar{Y}_{t+1}=\frac{Y_{t-k+2}+Y_{t-k+3}+...+Y_{t}+Y_{t+1}}{k}

    移动平均法只使用最近k期的数据,在每次计算移动平均值时,移动的间隔都为k,也适合对较为平稳的时间序列进行预测。应用关键是确定合理的移动平均间隔k。对于同一个时间序列,采用不同的移动间隔,预测的准确性是不同的。可通过试验的方法,选择一个使均方误差达到最小的移动间隔。移动间隔小,能快速反映变化,但不能反映变化趋势;移动间隔大,能反映变化趋势,但预测值带有明显的滞后偏差。

    移动平均法的基本思想:移动平均可以消除或减少时间序列数据受偶然性因素干扰而产生的随机变动影响,适合短期预测。

    (3)指数平滑法(exponential smoothing)是通过对过去的观察值加权平均进行预测,使t+1期的预测值等t期的实际观察值与t期的预测值的加权的平均值。指数平滑法是从移动平均法发展而来,是一种改良的加权平均法,在不舍弃历史数据的前提下,对离预测期较近的历史数据给予较大权数,权数由近到远按指数规律递减,因此称指数平滑。指数平滑有一次指数平滑法、二次指数平滑法、三次指数平滑法等。

    一次指数平滑法也称单一指数平滑法(single exponential smoothing),只有一个平滑系数,且观察值离预测时期越久远,权数变得越小。一次指数平滑是将一段时期的预测值与观察值的线性组合作为t+1时期的预测值,预测模型为:

    F_{t+1}=\alpha Y_t+(1-\alpha )F_t      \alpha:平滑系数(0\leq \alpha\leq 1

    t+1期的数据是t期的实际观察值与t期的预测值的加权平均。1期的预测值=1期的观察值

    2期预测值:F_{2}=\alpha Y_1+(1-\alpha )F_1=\alpha Y_1+(1-\alpha )Y_1=Y_1

    3期预测值:F_{3}=\alpha Y_2+(1-\alpha )F_2=\alpha Y_2+(1-\alpha )Y_1

    4期预测值:F_{4}=\alpha Y_3+(1-\alpha )F_3=\alpha Y_3+\alpha (1-\alpha )Y_2+ (1-\alpha )^2Y_1

    对指数平滑法的预测精度,用均方误差来=衡量:

    F_{t+1}=\alpha Y_t+(1-\alpha )F_t

              =F_t+\alpha (Y_t-F_t)

    F_{t+1}是t期的预测值F_{t}加上用\alpha调整的t期预测误差(Y_t-F_t)。

    使用指数平滑法时, 关键问题是确定一个合适的平滑系数\alpha,不同的\alpha对预测结果产生不同的影响。

    \alpha=0,预测值仅仅是重复上一期的预测结果;\alpha=1,预测值就是上一期的实际值;

    \alpha越接近1,模型对时间序列变化的反应就越及时,因为它给当前的实际值赋予了比预测值更大的权数;

    \alpha越接近0,给当前的预测值赋予了更大的权数,模型对时间序列变化的反应就越慢。

    当时间序列有较大随机波动时,选较大\alpha,以便能很快跟上近期的变化;当时间序列比较平稳时,选较小\alpha

    实际应用中,需考虑预测误差,用均方误差衡量预测误差大小。确定\alpha时,可选择几个\alpha进行预测,然后找出预测误差最小的作为最后的\alpha值。

    与移动平均法一样,一次指数平滑法可用于对时间序列进行修匀,以消除随机波动,找出序列的变化趋势。

    用一次指数平滑法进行预测时,一般\alpha取值不大于0.5,若大于0.5,才能接近实际值,说明序列有某种趋势或波动过大。

    阻尼系数  \beta=1-\alpha ,阻尼系数越小,近期实际值对预测结果的影响越大,反之,越小。阻尼系数是根据时间序列的变化特性来选取。

    5、趋势型序列的预测

    时间序列的趋势可分为线性趋势和非线性趋势,若这种趋势能够延续到未来,就可利用趋势进行外推预测。有趋势序列的预测方法主要有线性趋势预测、非线性趋势预测和自回归模型预测。

    (1) 线性趋势预测

    线性趋势(linear trend)是指现象随着时间的推移而呈现稳定增长或下降的线性变化规律。

    趋势方程:\hat{Y}_t=b_0+b_1t     \hat{Y}_t:时间序列Y_t的预测值;b_1是趋势线斜率,表示时间t 变动一个单位,观察值的平均变动数量

    (2) 非线性趋势预测

    序列中的趋势通常可认为是由于某种固定因素作用同一方向所形成的。若这种因素随时间推移按线性变化,则可对时间序列拟合趋势直线;若呈现出某种非线性趋势(non-linear trend),则需要拟合适当的趋势曲线。

    i:   指数曲线(exponential curve):用于描述以几何级数递增或递减的现象,即时间序列的观察值Y_t按指数规律变化,或者时间序列的逐期观察值按一定的增长率增长或衰减。一般的自然增长及大多数经济序列都有指数变化趋势。

    趋势方程:\hat{Y}_t=b_0b_1^{t}     b_0,b_1为待定系数

    b_1>1,则增长率随着时间t的增加而增加;若b_1<1,则增长率随着时间t的增加而降低;若b_0>0,b_1<1,则预测值\hat{Y}_t逐渐降低以到0为极限。

    为确定b_0,b_1,可采用线性化手段将其化为对数直线形式,两端取对数:lg\hat{Y}_t=lgb_0+tlgb_1

    根据最小二乘原理,按直线形式的常数确定方法求得 lgb_0,lgb_1,求出 lgb_0,lgb_1后,再取其反对数,即可得到b_0,b_1

    \left\{\begin{matrix}\sum lgY=nlgb_0+lgb_1\sum t\\\sum t lgY_t=lgb_0\sum t+lgb_1\sum t^2\end{matrix}\right.

    ii:   多阶曲线:

    有些现象变化形态复杂,不是按照某种固定的形态变化,而是有升有降,在变化过程中可能有几个拐点。这时就需要拟合多项式函数。当只有一个拐点时,可拟合二项曲线,即抛物线;当有两个拐点时,需要拟合三阶曲线;有k-1个拐点时,需要拟合k阶曲线。

    6、复合型序列的分解预测

    复合型序列是指含有趋势、季节、周期和随机成分的序列。对这类序列的预测方法是将时间序列的各个因素依次分解出来,然后进行预测。由于周期成分的分析需要有多年的数据,实际中很难得到多年的数据,因此采用的分解模型为:Y_t=T_t\times S_t\times I_t

    预测方法有:季节性多元回归模型、季节自回归模型和时间序列分解法预测。

    分解法预测步骤:

    第一步:确定并分离季节成分。计算季节指数,以确定时间序列中的季节成分。然后将季节成分从时间序列中分离出去,即用每一个时间序列观察值除以相应的季节指数,以消除季节性。

    第二步:建立预测模型并进行预测。对消除了季节成分的时间序列建立适当的预测模型,并根据这一模型进行预测。

    第三步:计算最后的预测值。用预测值乘以相应的季节指数,得到最终的预测值。

    (1)确定并分离季节成分

    季节性因素分析是通过季节指数来表示各年的季节成分,以此描述各年的季节变动模式。

    i:  计算季节指数(seasonal index)

    季节指数刻画了序列在一个年度内各月或各季度的典型季节特征。在乘法模型中,季节指数以其平均数等于100%为条件而构成的,反映了某一月份或季度的数值占全年平均值的大小。若现象的发展没有季节变动,则各期的季节指数应等于100%;若某一月份或季度有明显的季节变化,则各期的季节指数应大于或小于100%。因此,季节变动的程度是根据各季节指数与其平均数(100%)的偏差程度来测定的。

    季节指数计算方法较多,移动平均趋势剔除法步骤:

    第一步:计算移动平均值(若是季节数据,采用4项移动平均,月份数据则采用12项移动平均),并对其结果进行中心化处理,即将移动平均的结果再进行一次二项移动平均,即得出中心化移动平均值(CMA)。

    第二步:计算移动平均的比值,即季节比率,即将序列的各观察值除以相应的中心化移动平均值,然后计算出各比值的季度或月份平均值。

    第三步:季节指数调整。由于各季节指数的平均数应应等于1或100%,若根据第二步计算的季节比率的平均值不等于1,则需要进行调整。具体方法:将第二步计算的每个季节比率的平均值除以它们的总平均值。

    ii:  分离季节成分

    计算出季节指数后,可将各实际观察值分别除以相应的季节指数,将季节成分从时间序列中分离出去:\frac{Y}{S}=\frac{T*S*I}{S}=T*I

    结果即为季节成分分离后的序列,反映了在没有季节因素影响下时间序列的变化形态。

    iii: 建立预测模型并进行预测

    7、时序案例分析

    https://blog.csdn.net/mengjizhiyou/article/details/104765862

    展开全文
  • 时间序列

    2020-06-03 18:29:01
    一、ARIMA时间序列模型(Autoreg Ressive Moving A版本) 1、有三个不同的整数(P、d、q)对应数据集中的季节性、趋势和超声 a)P是模型的自回归部分。它允许我们将过去的价值观的影响纳入我们的模型。直观地说,...

    一、ARIMA时间序列模型(Autoreg Ressive Moving A版本)

    1、有三个不同的整数(P、d、q)对应数据集中的季节性、趋势和超声

    a)P是模型的自回归部分。它允许我们将过去的价值观的影响纳入我们的模型。直观地说,这将是类似的,表示如果过去3天已经变暖,明天可能会变暖

    b)d是模型的集成部分。这包括模型中包含差异量(即从当前值减去的过去时间点的数量)以适用于时间序列的术语。直观地说,这将类似于说如果过去三天的温度差异非常小,明天可能会有相同的温度

    c)q是模型的移动平均部分。这允许我们将模型的误差设置为过去以前时间点观察到的误差值的线性组合

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

    3、使用statsmodels模块的SARIMAX()函数拟合一个新的季节性ARIMA模型

    二、pandas时间序列

    1、类和方法

    1)Timestamp(时间戳):to_datetime , Timestamp

    2)DatetimeIndex(时间戳索引):to_datetime , date_range , DatetimeIndex

    3)Period(时间间隔):Period

    4)PeriodIndex(时间间隔索引):period_range , PriodIndex

    2、DataFrame

    1)pd.to_datetime(Series / DataFrame)返回的是Series

    2)pd.to_datetmie(List)返回的是DatetimeIndex

    如果要转换如上所示的DataFrame,必须存在的列名有year、month、day

    另外hour、second、millisecond、microsecond、nanosecond可选

    3、将无效数据显示为NaT

    In: pd.to_datetime(['2017-1-1', 'invalid'], error='coerce')

    Out: DatetimeIndex(['2017-01-01' , 'NaT'] , dtype='datetime64[ns]' , freq=None)

    4、pd.date_range(start=None, end=None, periods=None, freq='D')

    a)period是=10,设置时间间隔(向后推10次)

    b)freq=‘s’ 秒 / 'min' 分钟 / ‘H’ 小时 / ‘D’ 天 / ‘W’ 周 / ‘m’ 月

    5、重采样Resample

    三、ARIMA(差分自回归移动平均模型)

    1、ARIMA(P、d、q)中,AR是自回归,P为自回归项数,I为差分,d为使之成为平稳序列所做的差分次数(阶数);MA为滑动平均,q为滑动平均项数

    2、ACF自相关系数能决定q的取值,PACF偏自相关系数能决定P的值

    3、ARIMA原理:将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值,及随机误差项的现值和滞后值,进行回归所建立的模型

     

    展开全文
  • 时间序列--ARIMA(原理简单应用

    万次阅读 2018-12-28 15:50:32
    其原理在于:在将非平稳时间序列转化为平稳时间序列的过程中,将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。         其实就是三大块的整合 1.自回归model 自回归模型是...

    Autoregressive Integrated Moving Average Model,即自回归移动平均模型。它属于统计模型中最常见的一种,用于进行时间序列的预测。其原理在于:在将非平稳时间序列转化为平稳时间序列的过程中,将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。

     

     

     

     

    其实就是三大块的整合

    1.自回归model

    自回归模型是描述当前值与历史值之间的关系的模型,是一种用变量自身的历史事件数据对自身进行预测的方法。其公式如下:

     

     

    其中,yt是当前值;μ是常数项;p是阶数;γi是自相关系数,ϵt是误差值。

     

    自回归模型的使用有以下四项限制:

     

    该模型用自身的数据进行预测,即建模使用的数据与预测使用的数据是同一组数据;使用的数据必须具有平稳性;使用的数据必须有自相关性,如果自相关系数小于0.5,则不宜采用自回归模型;自回国模型只适用于预测与自身前期相关的现象。
     

    2.integrated

    ARIMA模型最重要的地方在于时序数据的平稳性。平稳性是要求经由样本时间序列得到的拟合曲线在未来的短时间内能够顺着现有的形态惯性地延续下去,即数据的均值、方差理论上不应有过大的变化。平稳性可以分为严平稳与弱平稳两类。严平稳指的是数据的分布不随着时间的改变而改变;而弱平稳指的是数据的期望与向关系数(即依赖性)不发生改变。在实际应用的过程中,严平稳过于理想化与理论化,绝大多数的情况应该属于弱平稳。对于不平稳的数据,我们应当对数据进行平文化处理。最常用的手段便是差分法,计算时间序列中t时刻与t-1时刻的差值,从而得到一个新的、更平稳的时间序列。
     

    3.moving average

    移动平均模型关注的是自回归模型中的误差项的累加。它能够有效地消除预测中的随机波动。

     

    1+3=ARMA

    在这个公式中,p与q分别为自回归模型与移动平均模型的阶数,是需要人为定义的。γi与θi分别是两个模型的相关系数,是需要求解的。如果原始数据不满足平稳性要求而进行了差分,则为差分自相关移动平均模型(ARIMA),将差分后所得的新数据带入ARMA公式中即可

    流程:

    自相关函数(ACF)是将有序的随机变量序列与其自身相比较,它反映了同一序列在不同时序的取值之间的相关性。

    偏自相关函数(PACF)计算的是严格的两个变量之间的相关性,是剔除了中间变量的干扰之后所得到的两个变量之间的相关程度。对于一个平稳的AR(p)模型,求出滞后为k的自相关系数p(k)时,实际所得并不是x(t)与x(t-k)之间的相关关系。这是因为在这两个变量之间还存在k-1个变量,它们会对这个自相关系数产生一系列的影响,而这个k-1个变量本身又是与x(t-k)相关的。这对自相关系数p(k)的计算是一个不小的干扰。而偏自相关函数可以剔除这些干扰

    • p: The number of lag observations included in the model, also called the lag order.
    • d: The number of times that the raw observations are differenced, also called the degree of differencing.
    • q: The size of the moving average window, also called the order of moving average.

    Shampoo Sales Dataset Plot

    我们的序列张这样,可以看出来存在趋势,不平稳所以需要差分(至少一次差分,你可以用adf检验获取更具有统计意义的结果,参考:https://www.jianshu.com/p/4130bac8ebec)

    Autocorrelation Plot of Shampoo Sales Data

    自回归图长这样,所以我们大致选择滞后项为5(更精确的选择可以参考上面链接)

    from pandas import read_csv
    from pandas import datetime
    from pandas import DataFrame
    from statsmodels.tsa.arima_model import ARIMA
    from matplotlib import pyplot
    
    def parser(x):
    	return datetime.strptime('190'+x, '%Y-%m')
    
    series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
    # fit model
    model = ARIMA(series, order=(5,1,0))
    model_fit = model.fit(disp=0)
    print(model_fit.summary())
    # plot residual errors
    residuals = DataFrame(model_fit.resid)
    residuals.plot()
    pyplot.show()
    residuals.plot(kind='kde')
    pyplot.show()
    print(residuals.describe())

    这里我们选择lag=5,差分=1,MA=0看看模型

                                 ARIMA Model Results
    ==============================================================================
    Dep. Variable:                D.Sales   No. Observations:                   35
    Model:                 ARIMA(5, 1, 0)   Log Likelihood                -196.170
    Method:                       css-mle   S.D. of innovations             64.241
    Date:                Mon, 12 Dec 2016   AIC                            406.340
    Time:                        11:09:13   BIC                            417.227
    Sample:                    02-01-1901   HQIC                           410.098
                             - 12-01-1903
    =================================================================================
                        coef    std err          z      P>|z|      [95.0% Conf. Int.]
    ---------------------------------------------------------------------------------
    const            12.0649      3.652      3.304      0.003         4.908    19.222
    ar.L1.D.Sales    -1.1082      0.183     -6.063      0.000        -1.466    -0.750
    ar.L2.D.Sales    -0.6203      0.282     -2.203      0.036        -1.172    -0.068
    ar.L3.D.Sales    -0.3606      0.295     -1.222      0.231        -0.939     0.218
    ar.L4.D.Sales    -0.1252      0.280     -0.447      0.658        -0.674     0.424
    ar.L5.D.Sales     0.1289      0.191      0.673      0.506        -0.246     0.504
                                        Roots
    =============================================================================
                     Real           Imaginary           Modulus         Frequency
    -----------------------------------------------------------------------------
    AR.1           -1.0617           -0.5064j            1.1763           -0.4292
    AR.2           -1.0617           +0.5064j            1.1763            0.4292
    AR.3            0.0816           -1.3804j            1.3828           -0.2406
    AR.4            0.0816           +1.3804j            1.3828            0.2406
    AR.5            2.9315           -0.0000j            2.9315           -0.0000
    -----------------------------------------------------------------------------

    最后那个roots其实没太明白是什么玩意。。。。

    ARMA Fit Residual Error Line Plot

    上面是残差图,可以看出来并不会杂乱无章,所以说明我们的模型不是很好

    count   35.000000
    mean    -5.495213
    std     68.132882
    min   -133.296597
    25%    -42.477935
    50%     -7.186584
    75%     24.748357
    max    133.237980

    残差均值也不=0,所以确实模型不好啊

    按理说残差表现好才能预测,那先假设残差表现好把

    如果我们使用训练数据集中的100个观测值来拟合模型,那么预测的下一个时间步的索引将被指定给预测函数start=101, end=101。这将返回一个包含预测的元素的数组。

    如果在配置模型时执行了任何不同操作(d>0),我们也希望预测的值保持在原始的比例。这可以通过将typ参数设置为值“levels”来指定:typ=“levels”。

    另外,我们可以通过使用forecast()函数来避免所有这些规范,该函数使用模型执行一步预测。我们可以将训练数据集分为训练集和测试集,使用训练集来拟合模型,并为测试集上的每个元素生成一个预测。

    考虑到对差分和AR模型的依赖,需要滚动预测。执行滚动预测的一种粗略方法是在每次接收到新的观测之后重新创建ARIMA模型。

    我们手动跟踪一个名为history的列表中的所有观察结果,这个列表中包含了培训数据,并且每个迭代都会添加新的观察结果。把这些放在一起,下面是一个使用Python中的ARIMA模型滚动预测的示例。

    from pandas import read_csv
    from pandas import datetime
    from matplotlib import pyplot
    from statsmodels.tsa.arima_model import ARIMA
    from sklearn.metrics import mean_squared_error
    
    def parser(x):
    	return datetime.strptime('190'+x, '%Y-%m')
    
    series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
    X = series.values
    size = int(len(X) * 0.66)
    train, test = X[0:size], X[size:len(X)]
    history = [x for x in train]
    predictions = list()
    for t in range(len(test)):
    	model = ARIMA(history, order=(5,1,0))
    	model_fit = model.fit(disp=0)
    	output = model_fit.forecast()
    	yhat = output[0]
    	predictions.append(yhat)
    	obs = test[t]
    	history.append(obs) # 这里实现了滚动预测,应该是ARIMA只能预测下一步而不能多步
    	print('predicted=%f, expected=%f' % (yhat, obs))
    error = mean_squared_error(test, predictions)
    print('Test MSE: %.3f' % error)
    # plot
    pyplot.plot(test)
    pyplot.plot(predictions, color='red')
    pyplot.show()

    ARIMA Rolling Forecast Line Plot

    效果图如上

    https://machinelearningmastery.com/arima-for-time-series-forecasting-with-python/

    使用建议:

    https://machinelearningmastery.com/gentle-introduction-box-jenkins-method-time-series-forecasting/

     

    https://blog.csdn.net/qq_27123591/article/details/80272669 

    这里有两个具体的例子实现了ARIMA

    1.https://machinelearningmastery.com/time-series-forecast-study-python-annual-water-usage-baltimore/

    2.https://machinelearningmastery.com/time-series-forecast-case-study-python-monthly-armed-robberies-boston/

    这两个例子介绍了如何根据acf、pacf选择ARIMA的pdq

    这里我们用predict实现了ARIMA的滚动预测,也可以手动实现(虽然不必要)可以参考:

    https://machinelearningmastery.com/make-manual-predictions-arima-models-python/

    展开全文
  • 机器学习(三)——时间序列

    万次阅读 2019-04-16 23:30:04
    笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据...
  • 时间序列模型 (一):模型概述

    万次阅读 多人点赞 2019-05-03 20:18:37
    时间序列的其它博文系列: 时间序列模型 (一):模型概述 时间序列模型 (二):移动平均法 时间序列模型 (三):指数平滑法 时间序列模型 (四):差分指数平滑法、 自适应滤波法v 时间序列模型 (五): ...
  • 统计学——时间序列预测

    千次阅读 2019-02-15 10:43:12
    第13章 时间序列分析和预测 时间序列是同一现象在不同时间上的相继观测值排列而成的序列。本书中用t表示所观察的时间,Y表示观察值,则Yi( i =1, 2, …, n)为时间ti上的观察值。 时间序列可以分为平稳序列和非平稳...
  • [python] 时间序列分析之ARIMA

    万次阅读 多人点赞 2015-11-06 19:28:48
    时间序列建模基本步骤 1. 获取被观测系统时间序列数据; 2. 对数据绘图,观测是否为平稳时间序列;对于非平稳时间序列要先进行**d阶差分运算**,化为平稳时间序列; 3. 经过第二步处理,已经得到平稳时间序列。要对...
  • 之前我们说明了怎么样的时间序列是序列平稳的,但是世界并不是那么美好,很多时间序列都不是平稳序列,所以这里就要求我们做一些处理了。 首先我们来看一下非平稳时间序列长什么样。在AR模型中,只要自回归系数都...
  • 使用R语言进行时间序列分析

    万次阅读 多人点赞 2018-04-09 15:25:34
    一、时间序列的定义 时间序列是将统一统计值按照时间发生的先后顺序来进行排列,时间序列分析的主要目的是根据已有数据对未来进行预测。一个稳定的时间序列中常常包含两个部分,那么就是:有规律的时间序列+噪声。...
  • Matlab时间序列分析

    万次阅读 多人点赞 2020-09-17 22:29:59
    在引入时间序列前,先介绍几个matlab函数 matlab中的gallery函数简析 Matlab 中的 gallery 函数是一个测试矩阵生成函数。当我们需要对某些算法进行测试的时候,可以利用gallery函数来生成各种性质的测试矩阵。其用法...
  • 数据挖掘之时间序列分析

    万次阅读 多人点赞 2018-08-27 22:12:59
    按时间顺序排列的一组随机变量X1,X2,…,Xt表示一个随机事件的时间序列时间序列分析的目的是给定一个已被观测了的时间序列,预测该序列的未来值。 表1 常用的时间序列模型 模型名称 描述 平滑法 常...
  • 时间序列建模的基本步骤 时间序列建模的基本步骤 习题 时间序列经典教材推荐 时间序列模型 (一):模型概述 时间序列模型 (二):移动平均法 时间序列模型 (三):指数平滑法 时间序列模型 (四):差分...
  • 横截面数据、时间序列数据、面板数据

    万次阅读 多人点赞 2019-05-02 13:56:29
    面板数据(Panel Data)是将“截面数据”和“时间序列数据”综合起来的一种数据类型。具有“横截面”和“时间序列”两个维度,当这类数据按两个维度进行排列时,数据都排在一个平面上,与排在一条线上的一维数据有着...
  • 时间序列分析--ARIMA模型

    万次阅读 多人点赞 2017-06-01 15:33:01
    指数平滑法对时间序列上连续的值之间的相关性没有要求。但是,如果你想使用指数平滑法计算出预测区间, 那么预测误差必须是不相关的, 且必须是服从零均值、 方差不变的正态分布。即使指数平滑法对时间序列连续数值...
  • SPSS(十九)SPSS之时间序列模型(图文+数据集)

    万次阅读 多人点赞 2019-06-17 22:32:38
    SPSS(十九)SPSS之时间序列模型(图文+数据集) 时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。正如人们常说,人生的出场顺序很重要,时间序列中隐藏着一些过去与未来的关系。时间序列...
  • 时间序列分析之ADF检验

    万次阅读 多人点赞 2019-02-06 18:59:09
    在使用很多时间序列模型的时候,如 ARMA、ARIMA,都会要求时间序列是平稳的,所以一般在研究一段时间序列的时候,第一步都需要进行平稳性检验,除了用肉眼检测的方法,另外比较常用的严格的统计检验方法就是ADF检验...
  • 时间序列的聚类方法

    万次阅读 2019-12-08 15:27:23
    时间序列的聚类方法 时间序列是按照时间排序的一组随机变量,它通常是在相等间隔的时间段内,依照给定的采样率,对某种潜在过程进行观测的结果。 时间序列数据是实值型的序列数据,具有数据量大、数据维度高以及数据...
  • 简单粗暴LSTM:LSTM进行时间序列预测

    万次阅读 多人点赞 2019-11-06 14:53:51
    使用LSTM进行时间序列预测 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新...
  • EXCEL篇—时间序列分析(季节指数法)

    万次阅读 多人点赞 2019-08-13 13:35:42
    之前跟大家一起分享了如何用EXCEL进行回归分析,现在跟大家一起来学习一下如何用EXCEL做时间序列分析。 在百科里,时间序列分析分析的解释是这样的:时间序列(或称动态数列)是指将同一统计指标的数值按其发生的...
1 2 3 4 5 ... 20
收藏数 771,177
精华内容 308,470
关键字:

时间序列