精华内容
下载资源
问答
  • Matlab时间序列分析

    万次阅读 多人点赞 2018-11-13 18:53:46
    在引入时间序列前,先介绍几个matlab函数 matlab中的gallery函数简析 Matlab 中的 gallery 函数是一个测试矩阵生成函数。当我们需要某些算法进行测试的时候,可以利用gallery函数来生成各种性质的测试矩阵。其用法...
    展开全文
  • 时间序列分析

    万次阅读 多人点赞 2017-03-22 17:04:51
    http://blog.csdn.net/pipisorry/article/details/62053938时间序列简介时间序列是时间间隔不变的情况下收集的时间点集合。这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式。但是什么时间...

    http://blog.csdn.net/pipisorry/article/details/62053938

    时间序列简介

    时间序列是时间间隔不变的情况下收集的时间点集合。这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式。但是什么时间序列?与常见的回归问题的不同?

    1、时间序列是跟时间有关的。所以基于线性回归模型的假设:观察结果是独立的。在这种情况下是不成立的。

    2、随着上升或者下降的趋势,更多的时间序列出现季节性趋势的形式,如:特定时间框架的具体变化。即:如果你看到羊毛夹克的销售上升,你就一定会在冬季做更多销售。

    因为时间序列的固有特性,有各种不同的步骤可以对它进行分析。

    时间序列的数据格式[pandas时间序列分析和处理Timeseries ]

    Note: pandas时间序列series的index必须是DatetimeIndex不能是Index,也就是如果index是从dataframe列中转换来的,其类型必须是datetime类型,不能是date、object等等其它类型!否则会报错:AttributeError: 'Index' object has no attribute 'inferred_freq'。[Decomposing trend, seasonal and residual time series elements]

    什么导致时间序列不稳定?

    这儿有两个主要原因。

    • 趋势-随着时间产生不同的平均值。举例:在飞机乘客这个案例中,我们看到总体上,飞机乘客的数量是在不断增长的。
    • 季节性-特定时间框架内的变化。举例:在特定的月份购买汽车的人数会有增加的趋势,因为车价上涨或者节假日到来。

    模型的根本原理或者预测序列的趋势和季节性,从序列中删除这些因素,将得到一个稳定的序列。然后统计预测技术可以在这个序列上完成。最后一步是通过运用趋势和季节性限制倒回到将预测值转换成原来的区间。


    时间序列的稳定性

    如果一个时间序列的统计特征如平均数,方差随着时间保持不变,我们就可以认为它是稳定的。稳定性的确定标准是非常严格的。但是,如果时间序列随着时间产生恒定的统计特征,根据实际目的我们可以假设该序列是稳定的。如下:

    • 恒定的平均数
    • 恒定的方差
    • 不随时间变化的自协方差

    为什么时间序列的稳定性这么重要?

    大部分时间序列模型是在假设它是稳定的前提下建立的。直观地说,我们可以这样认为,如果一个时间序列随着时间产生特定的行为,就有很高的可能性认为它在未来的行为是一样的。同时,根据稳定序列得出的理论是更加成熟的, 也是更容易实现与非稳定序列的比较。

    时间序列的稳定性测试

    1、绘制滚动统计:我们可以绘制移动平均数和移动方差,观察它是否随着时间变化。随着移动平均数和方差的变化,我认为在任何“t”瞬间,我们都可以获得去年的移动平均数和方差。如:上一个12个月份。但是,这更多的是一种视觉技术。

    2、DF检验:这是一种检查数据稳定性的统计测试。无效假设:时间序列是不稳定的。测试结果由测试统计量和一些置信区间的临界值组成。如果“测试统计量”少于“临界值”,我们可以拒绝无效假设,并认为序列是稳定的。[假设检验-t检验和Augmented Dickey–Fuller test ]

    from statsmodels.tsa.stattools import adfuller
    def test_stationarity(timeseries):
        
        #Determing rolling statistics
        rolmean = pd.rolling_mean(timeseries, window=12)
        rolstd = pd.rolling_std(timeseries, window=12)
    
        #Plot rolling statistics:
        orig = plt.plot(timeseries, color='blue',label='Original')
        mean = plt.plot(rolmean, color='red', label='Rolling Mean')
        std = plt.plot(rolstd, color='black', label = 'Rolling Std')
        plt.legend(loc='best')
        plt.title('Rolling Mean & Standard Deviation')
        plt.show(block=False)
        
        #Perform Dickey-Fuller test:
        print 'Results of Dickey-Fuller Test:'
        dftest = adfuller(timeseries, autolag='AIC')
        dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
        for key,value in dftest[4].items():
            dfoutput['Critical Value (%s)'%key] = value
        print dfoutput

    The code is pretty straight forward. Please feel free to discuss the code in comments if you face challenges in grasping it.

    Let’s run it for our input series:

    test_stationarity(ts)

    皮皮blog



    趋势减少技术

    消除趋势的第一个方法是转换。例如,在本例中,我们可以清楚地看到,有一个显著的趋势。所以我们可以通过变换,惩罚较高值而不是较小值。这可以采用log,平方根,立方跟等等。

    ts_log = np.log(ts)
    我们可以使用一些技术来估计或对这个趋势建模,然后将它从序列中删除:

    聚合Aggregation – taking average for a time period like monthly/weekly averages取一段时间的平均值(月/周平均值)

    平滑Smoothing – taking rolling averages取滚动平均数

    多项式回归分析Polynomial Fitting – fit a regression model适合的回归模型

    平滑

    移动平均

    (英语:Moving Average,MA),又称“移动平均线”(简称均线),也称为滚动平均数(Rolling Average)、滚动平均值或运行平均值,是技术分析中一种分析时间序列数据的工具。移动平均可抚平短期波动,反映出长期趋势或周期。数学上,移动平均可视为一种卷积。

    最常见的是利用股价、回报或交易量等变数计算出移动平均。

    简单移动平均(英语:Simple Moving Average,SMA)是某变数之前n个数值的未作加权算术平均。例如,收市价的10日简单移动平均指之前10日收市价的平均数。

    加权移动平均(英语:Weighted Moving Average,WMA)指计算平均值时将个别数据乘以不同数值,在技术分析中,n日WMA的最近期一个数值乘以n、次近的乘以n-1,如此类推,一直到0。

    指数移动平均(英语:Exponential Moving Average,EMA或EWMA)是以指数式递减加权的移动平均。各数值的加权影响力随时间而指数式递减,越近期的数据加权影响力越重,但较旧的数据也给予一定的加权值。加权的程度以常数α决定,α数值介乎0至1。

    一般形式

    {\text{EMA}}={p_{1}+(1-\alpha )p_{2}+(1-\alpha )^{2}p_{3}+(1-\alpha )^{3}p_{4}+\cdots  \over 1+(1-\alpha )+(1-\alpha )^{2}+(1-\alpha )^{3}+\cdots }
    α可能的取值方法有

    com :     Specify decay in terms of center of mass, \alpha = 1 / (1 + com),  for com >= 0
    span :    Specify decay in terms of span, \alpha = 2 / (span + 1), for span > 1
    halflife : 使用参数“半衰期”来定义指数衰减量Specify decay in terms of half-life, \alpha = 1 - exp(log(0.5) / halflife), for halflife > 0   lz感觉0.5应该改成2??或者pandas内部有相应的转换?

    span: α用天数N来代表:\alpha ={2 \over {N+1}},所以,N=19天,代表α=0.1

    halflife : 在使用halflife计算移动平均时候,EMA计算中(1-α)的指数项为负数,表示与当前时间t的差值?如计算2017.2.30的EMA时,2017.2.29的指数项为-1。而在2017.2.15时,如果halflife设置为15,则p_{2015.2.15}的权重为(1-α)^-15 = (exp(log(0.5) / 15)^-15 = (exp(log(0.5) / 15 ^-15) = exp(-log0.5) = 2?

    [wikipedia移动平均]

    指数衰减

    某个量的下降速度和它的值成比例,称之为服从指数衰减。用符号可以表达为以下微分方程,其中N是指量,λ指衰减常数(或称衰变常数)。{\displaystyle {\ {dN}{dt}}=-\lambda N.}

    方程的一个解为:{\displaystyle N(t)=N_{0}e^{-\lambda t}.\,}

    平均寿命

    如果这个衰减量是一个集合中的离散元素,可以计算元素留在集合中的平均时间长度。这被称为平均寿命(一般称寿命)。并且它可以被证明与衰减速率有关。{\displaystyle \tau ={\frac {1}{\lambda }}.}

    平均时间(或被称为指数时间常数)由此被看做一个简单的缩放时间: {\displaystyle N(t)=N_{0}e^{-t/\tau }.\,}因而,这是量减少到初始量的1/e所需要的时间。

    类似的,下面所述的以2为底的指数缩放时间为半衰期

    半衰期

    对多数人而言更加直观的一个典型指数衰减是当量减少为初始量的一半所需要的时间。这个时间被称为半衰期,表示为{\displaystyle t_{0.5}}

    半衰期可以被写作衰减常数或者平均寿命的形式:{\displaystyle t_{0.5}={\frac {\ln 2}{\lambda }}=\tau \ln 2.}

    代入\tau     {\displaystyle N(t)=N_{0}2^{-t/t_{0.5}}.\,}

    平均寿命\tau 等于半衰期除以ln2,或:{\displaystyle \tau ={\frac {t_{0.5}}{ln2}}\approx 1.442695040888963t_{0.5}.}

    [wikipedia指数衰减]

    皮皮blog

    pandas实现

    简单移动平均rolling

    这个方法有一个缺陷:要严格定义时段。在这种情况下,我们可以采用年平均数,但是对于复杂的情况的像预测股票价格,是很难得到一个数字的。所以,我们采取“加权移动平均法”可以对最近的值赋予更高的权重。

    Note: 前面window个rolling值是Nan,我们要丢掉这些NaN值

    Series.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0)

    主要参数

    window : int, or offset
        Size of the moving window. This is the number of observations used for calculating the statistic. Each window will be a fixed size.
        If its an offset then this will be the time period of each window. Each window will be a variable sized based on the observations included in the time-period. This is only

    valid for datetimelike indexes.

    min_periods : int, default None
        Minimum number of observations in window required to have a value (otherwise result is NA). For a window that is specified by an offset, this will default to 1.

    center : boolean, default False
        Set the labels at the center of the window. By default, the result is set to the right edge of the window. This can be changed to the center of the window by setting center=True.也就是rolling方法默认是将如2011.2.1 ~ 2011.2.30的均值设置为2011.2.30的均值,center=True则是将2011.2.1 ~ 2011.2.30的均值设置为2011.2.15对应的均值。相当于将rolling线向前移动了window/2个单位。

    win_type : string, default None lz猜测应该是取变长window的意思,没用过。这样的话时间间隔长的timeseries的window可能小点。

        Provide a window type. See the notes below.

    on : string, optional
        For a DataFrame, column on which to calculate the rolling window, rather than the index.

    [ref & Examples pandas.Series.rolling]

    指数移动平均ewm

    Note: (不同于rolling)在这种情况下就不会有遗漏值因为所有的值在一开始就被赋予了权重。所以在运行的时候,它没有先前的值参与

    Series.ewm(com=None, span=None, halflife=None, alpha=None, min_periods=0, freq=None, adjust=True, ignore_na=False, axis=0)

    主要参数

    com : float, optional
        Specify decay in terms of center of mass, \alpha = 1 / (1 + com),  for com >= 0
    span : float, optional
        Specify decay in terms of span, \alpha = 2 / (span + 1), for span > 1
    halflife : float, optional
        Specify decay in terms of half-life, \alpha = 1 - exp(log(0.5) / halflife), for halflife > 0

    alpha : float, optional
        Specify smoothing factor \alpha directly, 0 < \alpha <= 1

    [pandas.Series.ewm]

    皮皮blog



    趋势和季节性消除技术

    差分Differencing – taking the differece with a particular time lag采用一个特定时间差的差值

    分解Decomposition – modeling both trend and seasonality and removing them from the model.建立有关趋势和季节性的模型和从模型中删除它们

    差分Differencing

    处理趋势和季节性的最常见的方法之一就是差分法。在这种方法中,我们采用特定瞬间和它前一个瞬间的不同的观察结果。这主要是在提高平稳性。

    一般可以很大程度上减少了趋势。同样可以采取二阶或三阶差分在具体应用中获得更好的结果。

    前向差分

    前向差分有时候也称作数列的二项式变换

    函数的前向差分通常简称为函数的差分。对于函数\ f(x),如果在等距节点:

    x_{k}=x_{0}+kh,(k=0,1,...,n)
    \ \Delta f(x_{k})=f(x_{​{k+1}})-f(x_{k})

    则称\ \Delta f(x),函数在每个小区间上的增量y_{​{k+1}}-y_{k}\ f(x)一阶差分。

    在微积分学中的有限差分(finite differences),前向差分通常是微分在离散的函数中的等效运算。差分方程的解法也与微分方程的解法相似。当\ f(x)是多项式时,前向差分为Delta算子(称\Delta 为差分算子[2]),一种线性算子。前向差分会将多项式阶数降低 1。

    逆向差分

    对于函数\ f(x_{k}),如果:\ \nabla f(x_{k})=f(x_{k})-f(x_{​{k-1}}).\,则称\ \nabla f(x_{k})\ f(x)的一阶逆向差分。

    差分的阶

    一阶差分的差分为二阶差分,二阶差分的差分为三阶差分,其余类推。记:\ \Delta ^{n}[f](x)\ f(x)\ n阶差分。

    如果

    \ \Delta ^{n}[f](x)\ =\Delta \{\Delta ^{​{n-1}}[f](x)\}\ =\Delta ^{​{n-1}}[f](x+1)-\Delta ^{​{n-1}}[f](x)

    根据数学归纳法,有

    \ \Delta ^{n}[f](x)=\sum _{​{i=0}}^{n}{n \choose i}(-1)^{​{n-i}}f(x+i)       其中, \ {n \choose i}为二项式系数。

    特别的,有\ \Delta ^{2}[f](x)=f(x+2)-2f(x+1)+f(x)

    [wikipedia差分]

    与差分相关的均差参考[数据插值方法]

    Pandas实现

    Series.shift(periods=1, freq=None, axis=0)[pandas.Series.shift]

    shift示例

    se
    se.shift()

    2013-01-01    0
    2013-01-02    1
    2013-01-03    2
    2013-01-04    5
    2013-01-05    4


    2013-01-01    NaN
    2013-01-02    0.0
    2013-01-03    1.0
    2013-01-04    2.0
    2013-01-05    5.0

    pandas实现一阶差(前向差分)示例

    ts_diff = ts - ts.shift()

    分解:趋势+季节性+残差

    在这种方法中,趋势和季节性是分别建模的并倒回到序列的保留部分。

    from statsmodels.tsa.seasonal import seasonal_decompose
    decomposition = seasonal_decompose(ts_log)
    
    trend = decomposition.trend
    seasonal = decomposition.seasonal
    residual = decomposition.resid
    
    plt.subplot(411)
    plt.plot(ts_log, label='Original')
    plt.legend(loc='best')
    plt.subplot(412)
    plt.plot(trend, label='Trend')
    plt.legend(loc='best')
    plt.subplot(413)
    plt.plot(seasonal,label='Seasonality')
    plt.legend(loc='best')
    plt.subplot(414)
    plt.plot(residual, label='Residuals')
    plt.legend(loc='best')
    plt.tight_layout()
    16. decompose

    在这里我们可以看到趋势,季节性从数据分离,我们可以建立残差的模型,让我们检查残差的稳定性。

    ts_log_decompose = residual
    ts_log_decompose.dropna(inplace=True)
    test_stationarity(ts_log_decompose)

    这样时间序列是非常接近稳定。你也可以尝试高级的分解技术产生更好的结果。同时,你应该注意到, 在这种情况下将残差转换为原始值对未来数据不是很直观。

    [Source code for statsmodels.tsa.seasonal]

    Note: decomposition = seasonal_decompose(ts_log)

    1 如果你的数据的index不是DatetimeIndex而是其它的就会出错

    AttributeError: 'Index' object has no attribute 'inferred_freq'

    AttributeError: 'Float64Index' object has no attribute 'inferred_freq'

    2 如果你的数据的DatetimeIndex不能自动识别出datetime的freq就会出错

    ValueError: You must specify a freq or x must be a pandas object with a timeseries index

    这时应该手动指定decomposition = seasonal_decompose(ts_log, freq = 1)

    3 warnning

    VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future

    皮皮blog



    时间序列预测

    从上我们看到了不同的技术,并且在使得时间序列得以稳定上运作良好。让我们通过差分后建立时间序列模型,因为差分是很受欢迎的技术,也相对更容易添加噪音和季节性从而倒回到预测残差residuals。

    在执行趋势和季节性评估技术上,有两种情况:

    • 值之间不含依赖的严格稳定系列。简单的情况下,我们可以建立残差residuals模型作为白噪音(指功率谱密度在整个频域内均匀分布的噪声),但这非常罕见。
    • 序列之间含有明显依赖。在这种情况下,我们需要使用一些统计模型像ARIMA(差分自回归移动平均模型)来预测数据。

    这里简要介绍一下ARIMA,但不会介绍技术细节,但如果你希望更有效地应用它们,你应该理解这些概念的细节。ARIMA代表差分自回归移动平均(Auto-Regressive Integrated Moving Averages)。平稳时间序列的ARIMA预测的只不过是一个线性方程(如线性回归)。

    预测依赖于ARIMA模型参数(p d q)

    • 自回归项的数目Number of AR (Auto-Regressive) terms (p):AR条件仅仅是因变量的滞后。如:如果P等于5,那么预测x(t)将是x(t-1)。。。(t-5)。
    • 移动平均项的数目Number of MA (Moving Average) terms (q):MA条件是预测方程的滞后预测错误。如:如果q等于5,预测x(t)将是e(t-1)。。。e(t-5),e(i)是移动平均叔在第ith个瞬间和实际值的差值。
    • 差分数目Number of Differences (d):它们是非季节性的差值的数目,即这种情况下我们采用一阶差分。所以传递变量令d=0或者传递原始变量令d=1,两种方法得到的结果一样。

    如何确定“p”和“q”的值

    我们使用两个坐标来确定这些数字。

    1. 自相关函数Autocorrelation Function (ACF):这是时间序列和它自身滞后版本之间的相关性的测试。比如在自相关函数可以比较时间的瞬间‘t1’…’t2’以及序列的瞬间‘t1-5’…’t2-5’ (t1-5和t2 是结束点)。
    2. 部分自相关函数Partial Autocorrelation Function (PACF):这是时间序列和它自身滞后版本之间的相关性测试,但是是在预测(已经通过比较干预得到解释)的变量后。如:滞后值为5,它将检查相关性,但是会删除从滞后值1到4得到的结果。

    时间序列(在差分后)的自回归函数和部分自回归函数绘制为:

    #ACF and PACF plots:
    from statsmodels.tsa.stattools import acf, pacf
    lag_acf = acf(ts_log_diff, nlags=20)
    lag_pacf = pacf(ts_log_diff, nlags=20, method='ols')
    #Plot ACF: 
    plt.subplot(121) 
    plt.plot(lag_acf)
    plt.axhline(y=0,linestyle='--',color='gray')
    plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.title('Autocorrelation Function')
    #Plot PACF:
    plt.subplot(122)
    plt.plot(lag_pacf)
    plt.axhline(y=0,linestyle='--',color='gray')
    plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.title('Partial Autocorrelation Function')
    plt.tight_layout()

    Python

    此图中,0每一边的两条虚线之间是置信区间。这些可以用来确定“p”和“q”的值:

    1、p-部分自相关函数图第一次截断上层置信区间的滞后值。如果你仔细看,该值是p=2。

    2、q- 自相关函数图第一次截断上层置信区间的滞后值。如果你仔细看,该值是q=2。

    [http://discuss.analyticsvidhya.com/t/seasonal-parameter-in-arima-and-adf-test/7385/1]


    现在,考虑个体以及组合效应建立3个不同的ARIMA模型。我也会打印各自的RSS(RSS表示一组统计数据的平方和的平方根)。请注意,这里的RSS是对残差值来说的,而不是实际序列。

    首先,我们需要ARIMA模型。

    from statsmodels.tsa.arima_model import ARIMA

    p,d,q值可以通过ARIMA的order参数即元组(p,d,q)指定。

    建立三种情况下的模型:

    自回归(AR)模型:

    model = ARIMA(ts_log, order=(2, 1, 0))  
    results_AR = model.fit(disp=-1)  
    plt.plot(ts_log_diff)
    plt.plot(results_AR.fittedvalues, color='red')
    plt.title('RSS: %.4f'% sum((results_AR.fittedvalues-ts_log_diff)**2))

    Python

    移动平均数(MA )模型

    model = ARIMA(ts_log, order=(0, 1, 2))  
    results_MA = model.fit(disp=-1)  
    plt.plot(ts_log_diff)
    plt.plot(results_MA.fittedvalues, color='red')
    plt.title('RSS: %.4f'% sum((results_MA.fittedvalues-ts_log_diff)**2))

    Python

    组合模型

    model = ARIMA(ts_log, order=(2, 1, 2))  
    results_ARIMA = model.fit(disp=-1)  
    plt.plot(ts_log_diff)
    plt.plot(results_ARIMA.fittedvalues, color='red')
    plt.title('RSS: %.4f'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))

    Python

    Note: 如果报错TypeError: Cannot cast ufunc subtract output from dtype('float64') to dtype('int64') with casting rule 'same_kind',说明时序数据的数据类型不是float类型,astype转换一下就可以了。

    ARMAResults及其方法[ARMAResults (class in statsmodels.tsa.arima_model)]

    在这里我们可以看到,自回归函数模型和移动平均数模型几乎有相同的RSS,但相结合效果显著更好。


    倒回到原始区间

    现在,我们只剩下最后一步,即把这些值倒回到原始区间。

    既然组合模型获得更好的结果,让我们将它倒回原始值,看看它如何执行。

    第一步是作为一个独立的序列,存储预测结果并观察。

    predictions_ARIMA_diff = pd.Series(results_ARIMA.fittedvalues, copy=True)
    print predictions_ARIMA_diff.head()

    Python

    Note: 1 这些是从‘1949-02-01’开始,而不是第一个月。为什么?这是因为我们将第一个月份取为滞后值,一月前面没有可以减去的元素。

    2 这里fittedvalues是已知的数据(或者说是训练数据吧),和[statsmodels.tsa.arima_model.ARMAResults.predict]可以得到相同结果,但是不能是未来的结果。

    3 这里只是预测的已有的数据,实际中我们当然是要预测未来的数据。这时应该使用forecast方法,如预测最后时间之后14天的结果:

    print(results_ARIMA.forecast(14)[0])

    [statsmodels.tsa.arima_model.ARMAResults.forecast]

    将差分转换为对数尺度的方法是这些差值连续地添加到基本值。一个简单的方法就是首先确定索引的累计总和,然后将其添加到基本值(这里就是第一个月的值)。

    predictions_ARIMA_diff_cumsum = predictions_ARIMA_diff.cumsum()
    print predictions_ARIMA_diff_cumsum.head()

    Python

    你可以在head()使用之前的输出结果进行回算,检查这些是否正确的。接下来我们将它们添加到基本值。为此我们将使用基本值作为所有的值来创建一个序列,并添加差值。

    predictions_ARIMA_log = pd.Series(ts_log.ix[0], index=ts_log.index)
    predictions_ARIMA_log = predictions_ARIMA_log.add(predictions_ARIMA_diff_cumsum,fill_value=0)
    predictions_ARIMA_log.head()

    Python

    第一个元素是基本值本身,从基本值开始值累计添加。

    最后一步是将指数与原序列比较。

    predictions_ARIMA = np.exp(predictions_ARIMA_log)
    plt.plot(ts)
    plt.plot(predictions_ARIMA)
    plt.title('RMSE: %.4f'% np.sqrt(sum((predictions_ARIMA-ts)**2)/len(ts)))

    Python

    最后我们获得一个原始区间的预测结果。虽然不是一个很好的预测。但是你获得了思路不是吗?现在,我把它留个你去进一步改进,做一个更好的方案。

    在本文中,我试图提供你们一个标准方法去解决时间序列问题。这里我们广泛的讨论了稳定性的概念和最终的预测残差。这是一个漫长的过程,我跳过了一些统计细节,我鼓励大家使用这些作为参考材料。

    皮皮blog

    from: http://blog.csdn.net/pipisorry/article/details/62053938

    ref: [Complete guide to create a Time Series Forecast (with Codes in Python)]*

    [时间序列预测全攻略]

    [平稳时间序列预测法]

    [时间序列分析课件 第三章 平稳时间序列分析.ppt]


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

    万次阅读 多人点赞 2018-09-17 21:37:34
    导论 研究时间序列主要目的:进行预测,根据已有的时间序列数据预测未来的变化。 时间序列预测关键:确定已有的时间序列的变化模式,并假定这种模式会延续到未来。...时间序列分析就其发展历史阶段和所使...

    导论

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

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

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

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

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

    一、时间序列及其分解

    时间序列(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_{n-1}}{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

     

    参考:贾俊平《统计学》第六版

    《统计学》pdf及课后答案:链接: https://pan.baidu.com/s/1dZPW0smz2cO-67zfn1BFyQ 提取码: ktxq 

    展开全文
  • 数据挖掘之时间序列分析

    万次阅读 多人点赞 2018-08-12 23:45:16
    时间序列分析的目的是给定一个已被观测了的时间序列,预测该序列的未来值。 表1 常用的时间序列模型 模型名称 描述 平滑法 常用于趋势分析和预测,利用修匀技术,削弱短期随机波动序列的影响,使...

    按时间顺序排列的一组随机变量X1,X2,…,Xt表示一个随机事件的时间序列。

    时间序列分析的目的是给定一个已被观测了的时间序列,预测该序列的未来值。

    表1 常用的时间序列模型
    模型名称描述
    平滑法

    常用于趋势分析和预测,利用修匀技术,削弱短期随机波动对序列的影响,使序列平滑化。

    根据所用平滑技术的不同,可分为移动平均法和指数平滑法。

    趋势拟合法

    把时间作为自变量,相应的序列观察值作为因变量,建立回归模型。

    根据序列的特征,可分为线性拟合和曲线拟合。

    组合模型

    时间序列的变化主要受到长期趋势(T)、季节变动(S)、周期变动(C)和不规则变动(\varepsilon)这四个因素的影响。

    根据序列的特点,可以构建加法模型和乘法模型。

    加法模型:x = T+S+C+\varepsilon

    乘法模型:x = T\timesS\timesC\times\varepsilon

    AR模型以前p期的序列值为自变量,随机变量Xt为因变量建立线性回归模型
    MA模型随机变量Xt的取值与前各期的序列值无关,建立Xt与前q期的随机扰动(\varepsilon)的线性回归模型
    ARMA模型随机变量Xt的取值,不仅与前p期的序列值有关,还与前q期的随机扰动(\varepsilon)有关
    ARIMA模型

    许多非平稳序列差分后会显示出平稳序列的性质,称这个非平稳序列为差分平稳序列。

    对差分平稳序列可以使用ARIMA模型进行拟合

    ARCH模型能准确地模拟时间序列变量的波动性变化,适用于序列具有异方差性并且异方差函数短期自相关
    GARCH模型及其衍生模型称为广义ARCH模型,是ARCH模型的拓展。更能反映实际序列中的长期记忆性、信息的非对称性等性质

     

    1、时间序列分析之前,需要进行序列的预处理,包括纯随机性和平稳性检验。根据检验结果可以将序列分为不同的类型,采取不同的分析方法。

    表2 不同检验结果的分析方法
    纯随机序列

    又叫白噪声序列,序列的各项之间没有任何相关关系,序列在进行完全无序的随机波动。

    白噪声序列是没有信息可提取的平稳序列,可以终止分析

    平稳非白噪声序列

    均值和方差是常数。通常建立一个线性模型来拟合该序列的发展,从而提取有用信息。

    ARMA模型是最常用的平稳序列拟合模型。

    非平稳序列

    均值和方差不稳定。一般将其转变成平稳序列,应用有关平稳时间序列的分析方法,如ARMA模型。

    如果时间序列经差分运算后,具有平稳性,称该序列为差分平稳序列,使用ARIMA模型进行分析。

    (1)纯随机性检验

    如果序列是纯随机性检验,则序列值之间应该没有任何关系。实际上纯随机性序列的样本自相关系数不会绝对为零,但是很接近零,并在零附近随机波动。

    纯随机性检验,又叫白噪声检验,一般是构造检验统计量来检验。常用的检验统计量有Q统计量、LB统计量,由样本各延迟期数的自相关系数,可以计算出检验统计量,然后计算对应的p值,如果p值大于显著性水平\alpha,则表示接受原假设,是纯随机序列,停止分析。

    (2)平稳性检验

    如果时间序列在某一常数附近波动且波动范围有限,即有常数均值和常数方差,并且延迟k期的序列变量的自协方差和自相关系数是相等的,或者说延迟k期的序列变量之间的影响程度是一样的,则称该时间序列为平稳序列。

    两种检验方法:

    a. 根据时序图和自相关图的特征做出判断的图检验,该方法操作简单、应用广泛,缺点是带有主观性;

    时序图检验:根据平稳时间序列的均值和方差都为常数的性质,平稳序列的时序图显示序列值始终在一个常数附近随机波动,且波动的范围有界。

    如果有明显的趋势性或周期性,通常不是平稳序列。

    自相关图检验:平稳序列具有短期相关性,所以平稳序列中,只有近期的序列值对现时值得影响比较明显,间隔越远的过去值对现时值的影响越小。

    随着延迟期数k的增加,平稳序列的自相关系数会比较快的衰减趋向于零,并在零附近随机波动,而非平稳序列的自相关系数衰减的速度比较慢。

    b. 构造检验统计量,目前最常用的方法是单位根检验。

    单位根检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列。

     

    2、平稳时间序列分析

    ARMA模型的全称是自回归移动平均模型,可以细分为AR模型、MA模型和ARMA模型三类,都可以看做是多元线性回归模型。

    建模步骤:

    (1)计算自相关系数(ACF)和偏自相关系数(PACF)

    (2)ARMA模型识别,也叫模型定阶,由AR(p)模型、MA(q)模型和ARMA(p,q)的自相关系数和偏自相关系数的性质,选择合适的模型。

    表3 ARMA模型识别原则
    模型自相关系数(ACF)偏自相关系数(PACF)
    AR(p)拖尾p阶截尾
    MA(q)

    q阶截尾

    拖尾
    ARMA(p,q)拖尾拖尾

    (3)估计模型中未知参数的值,并进行参数检验

    (4)模型检验

    (5)模型优化

    (6)模型应用:进行短期预测。

    3、非平稳时间序列分析

    实际上,在自然界中绝大部分序列都是非平稳的。

    分析方法分为两类:

    (1)确定性因素分解的时序分析

    把所有序列的变化都归结为四个因素,长期趋势、季节变动、循环变动和随机变动的综合影响。

    缺点是由随机因素导致的波动难以确定和分析,对随机信息浪费严重,会导致模型拟合精度不够理性。

    (2)随机时序分析

    根据时间序列的不同特点,随机时序分析可以建立的模型有ARIMA模型、残差自回归模型、季节模型、异方差模型等。

    ARIMA模型建模步骤:

    a. 检查序列的平稳性

    b. 对原始序列进行差分,并进行平稳性和白噪声检验

    c. 选择ARIMA模型

    需要为ARIMA(p、d、q)模型指定参数p、d、q。其中d为差分次数。

    或者使用forecast包里面的auto.arima函数实现最优ARIMA模型的自动选取。

    表4 结合ACF和PACF图选择ARIMA模型的方法
    模型ACFPACF
    ARIMA(p,d,0)逐渐减小到零在p阶后减小到零
    ARIMA(0,d,q)q阶后减小到零逐渐减小到零
    ARIMA(p,d,q)逐渐减小到零逐渐减小到零

    d. 拟合模型

    e. 预测


    举例说明ARIMA模型的应用。

    R语言实现:

    1、读取数据集

    2、生成时序对象,检验平稳性

    sales = ts(data) #生成时序对象
    
    plot.ts(sales,xlab="时间",ylab="销量") #作时序图
    
    acf(sales) #作自相关图
    
    library(fUnitRoots)
    unitrootTest(sales) #单位根检验

    时序图如下,具有单调递增趋势。

    自相关图如下,自相关系数长期大于零,说明序列间具有很强的长期相关性。

    单位根检验 结果如下,p值显著大于0.05,判断为非平稳序列。(非平稳序列一定不是白噪声序列

    3、对原始序列进行一阶差分,并进行平稳性检验。

    difsales = diff(sales) #一阶差分
    
    plot.ts(difsales,xlab="时间",ylab="销量残差") #作时序图
    
    acf(difsales) #作自相关图
    
    unitrootTest(difsales) #单位根检验

    时序图如下,在均值附近比较平稳的波动。

    自相关图如下,有很强的短期相关性。

    单位根检验 结果如下,p值小于0.05,所以一阶差分后的序列是平稳序列。

    4、白噪声检验

    Box.test(difsales,type = "Ljung-Box") #白噪声检验

    结果为

    p值显著小于0.05,所以一阶差分后的序列是平稳非白噪声序列。

    5、拟合ARIMA模型

    第一种方法:

    pacf(difsales) #作偏自相关图

    偏自相关图如下,

    根据表4的选择方法,选定ARIMA(1,1,0)模型。

    fit = arima(sales,order=c(1,1,0)) #ARIMA(1,1,0)模型

    第二种方法:

    auto.arima(CWD) #另一个实例

    输出结果如下:

    6、模型检验

    模型确定后,检验其残差是否为白噪声,如果不是白噪声,说明残差中还存在有用的信息,需要修改模型参数,进一步提取。

    fit = arima(CWD,order = c(0,1,1)) #另一个实例
    
    r3 = fit$residuals
    
    Box.test(r3,type = "Ljung-Box")

    7、预测

    library(forecast) 
    forecast(fit,5) #预测接下来5期的序列值
    
    plot(forecast(fit,5)) #作预测图,深色区域分别为80%和95%的置信区间

    结果为

    8、模型评价

    采用三个衡量模型预测精度的统计量指标:平均绝对误差、均方根误差、平均绝对百分误差。这三个指标从不同方面反映了模型的预测精度。

    mae = mean(abs(pre-real)) #平均绝对误差
    
    rmse = mean((pre-real)^2) #均方根误差
    
    mape = mean(abs(pre-real)/real) #平均绝对百分误差

    结合实际业务分析,将误差阈值设定在一个值,如1.5,评价模型的预测精度。

     

    Python实现:

    #ARIMA时序模型
    import pandas as pd
    
    forecastnum = 5
    data = pd.read_excel("arima_data.xls",index_col=u'日期') #pandas自动将“日期”列识别为datetime格式
    
    #时序图
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] 
    plt.rcParams['axes.unicode_minus'] = False
    data.plot()
    plt.show()
    
    #自相关图
    from statsmodels.graphics.tsaplots import plot_acf
    plot_acf(data).show()
    
    #ADF单位根检验
    from statsmodels.tsa.stattools import adfuller as ADF
    print(u'原始序列的ADF检验结果为:',ADF(data[u'销量']))
    #返回值依次是adf、pvalue

    输出结果为:

    可以得出时间序列不平稳,需要进行差分操作。

    D_data = data.diff().dropna() #差分
    D_data.columns = [u'销量差分']
    D_data.plot() #时序图
    plt.show()
    
    plot_acf(D_data).show() #自相关图
    
    from statsmodels.graphics.tsaplots import plot_pacf
    plot_pacf(D_data).show() #偏自相关图
    
    print(u'差分序列的ADF检验结果为:',ADF(D_data[u'销量差分']))

    输出结果为:

    这时差分后的序列符合平稳性。

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

    输出结果为:

    p值小于显著性水平,所以非白噪声。

    from statsmodels.tsa.arima_model import ARIMA
    data[u'销量'] = data[u'销量'].astype(float)
    #定阶
    pmax = int(len(D_data)/10) #一般阶数不超过length/10
    qmax = int(len(D_data)/10) 
    bic_matrix =[] #bic矩阵
    for p in range(pmax+1):
        tmp = []
        for q in range(qmax+1):
            try: #存在部分报错
                tmp.append(ARIMA(data,(p,1,q)).fit().bic)
            except:
                tmp.append(None)
        bic_matrix.append(tmp)
        
    bic_matrix = pd.DataFrame(bic_matrix)
    p,q = bic_matrix.stack().idxmin() #先用stack展平,用idxmin找出最小值位置
    print (u'BIC最小的p值和q值为:%s,%s' % (p,q))
    
    model = ARIMA(data,(p,1,q)).fit() #建立ARIMA(0,1,1)模型
    model.summary2() #模型报告
    
    model.forecast(5) #预测5天的数据,返回预测结果、标准误差、置信区间

    输出结果为:

    展开全文
  • 在GEE中,时间序列分析经常用到,有时根据研究需要,会统计在每个pixel上时间序列最大值所对应的日期或时间,这一操作,这一操作的算法思想与取一个列表中最大值所对应的索引有异曲同工之处。 废话不多说直接上代码 ...
  • spss 时间序列分析

    千次阅读 2019-12-25 16:53:15
    目录 定义日期标示变量 了解序列发展趋势 季节因素分解 时间序列预测操作 ...【分析】【时间序列预测】【序列图】 将“销售数据移至”【变量】,‘DATE_’变量移至【时间轴标签】【确定】 ...
  • R语言实现时间序列分析

    万次阅读 2019-11-11 20:11:45
    一、时间序列分析导论图: 处理方式: 1.对于原始数据进行季节性处理和差分,以形成平稳序列;期间如果遇到了随机序列,则停止时间序列建模 2.对于给定的序列进行自相关函数和偏自相关函数分析(在不同的滞后...
  • Python数据分析:pandas时间序列处理及操作 基本类型,以时间戳为索引的series–>datatimeindex 创建方法: 指定index为datatime的list from datetime import datetime import pandas as pd import numpy ...
  • 多元时间序列分析

    万次阅读 2016-11-05 19:24:39
    时间序列分析就是对可以获得的部分的系统输出数据进行分析,提取其蕴含的系统特征,构造对应的等价系统,从而完成该系统的功能刻划,并依据相应的模型完成系统未来行为预测的过程。从本质上讲,时序分析仍然是发现...
  • python数据分析时间序列分析(Time series analysis)

    万次阅读 热门讨论 2018-12-06 14:01:20
    时间序列分析包括用于分析时间序列数据的方法,以便提取有意义的统计数据和数据的其他特征。时间序列预测是使用模型根据先前观察到的值预测未来值。虽然回归分析通常采用的方式是测试理论,即一个或多个...
  • 数学建模之时间序列分析

    千次阅读 2020-07-12 14:48:54
    时序图检验:根据平稳时间序列均值、方差为常数的性质,平稳序列的时序图应该显示出该序列始终在一个常数值附近随机波动,而且波动的范围有界、无明显趋势及周期特征。 自相关图检验:平稳序列通常具有短期相关性。...
  • 时间序列分析之holtwinters和ARIMA

    万次阅读 多人点赞 2017-10-16 16:24:14
    所谓时间序列分析,就是根据有序随机变量或观测得到的有序数据之间相互依赖所包含的信息,用概率统计方法定量地建立一个合适的数学模型,并根据这个模型相应序列所反映的过程或系统作出预报或进行控制。...
  • 时间序列分析相关概念

    千次阅读 2018-10-01 20:24:18
    1. 在时间序列分析中, 数学模型是什么?数学公式又是什么?数学推导过程又是什么?… … 一句话:用数学公式后者符号来表示现实存在的意义。数学是“万金油”的科学,它是作为工作和分析方法运用到某个学科当中。...
  • 时间序列分析 需要解释的概念 平稳时间序列 平稳时间序列 平稳时间序列及其数字特征 均值为常数,协方差函数与时间无关的时间序列叫做平稳时间序列 平稳时间序列有一种简化模型,就是均值为0的平稳时间序列。...
  • Python通过ARIMA模型进行时间序列分析预测

    千次阅读 热门讨论 2020-03-18 17:30:17
    时间序列分析预测就是在已有的和时间有关的数据序列的基础上构建其数据模型并预测其未来的数据,例如航空公司的一年内每日乘客数量、某个地区的人流量,这些数据往往具有周期性的规律。如下图所示,有的数据呈现出...
  • 【Python】时间序列分析完整过程

    万次阅读 多人点赞 2019-05-20 10:48:21
    1. 导言 1.1 基本定义   根据维基百科上对时间序列的定义,我们简单将其理解为: 时间序列:一系列以时间顺序作为索引的数据点...  咱们先来看看,对时间序列数据分析,需要用到哪些库吧 ~ import numpy as np ...
  • 用R分析时间序列(time series)数据

    千次阅读 2015-11-10 22:53:48
    用R分析时间序列(time series)数据 时间序列(time series)是一系列有序的数据。通常是等时间间隔的采样数据。如果不是等间隔,则一般会标注每个数据点的时间刻度。  下面以time series 普遍使用的数据 ...
  • 数据挖掘之 时间序列分析

    万次阅读 2016-05-26 01:04:49
    时间序列是指按时间顺序排列的一组数据,这些数据有两个特点:趋势和季节性 趋势:总体情况 季节性:周期性波动 时间序列挖掘的基本思路:根据之前已有的序列数据,发现隐含的规则,来预测后面的发展趋势 实现方法...
  • 时间序列分析 给定一个已被观测了的时间序列,预测该序列的的未来值。 重点介绍AR模型、MA模型、ARMA模型和ARIMA模型 1、时间序列的预处理 拿到一个观察值序列后,首先要它的纯随机性和平稳性进行检验,称之...
  • 时间序列是某个时间段或者某些时间点对应的不同数值的数值,这些数值只有两个具体数据:时间要素、数值要素。时间要素可以是某一个时间段或者某一个时刻。例如一个杂货铺一周(七天)的销售额为时间段的时间要素...
  • 通过这些时间序列分析,从中发现和揭示现象发展变化的规律,并将这些知识和信息用于预测。比如销售量是上升还是下降,销售量是否与季节有关,是否可以通过现有的数据预测未来一年的销售额是多少等。 对于时间...
  • 在建立时间序列模型之前,必须先对时间序列数据进行必要的预处理,以便剔除那些不符合统计规律的异常样本,并这些样本数据的基本统计特性进行检验,以确保建立时间序列模型的可靠性和置信度,并满足一定的精度要求。...
  • 金融时间序列分析入门

    千次阅读 2019-02-18 23:50:20
    某一个或者一组变量X(t)进行观察测量,将在一系列时刻t1, t2, …, tn所得的离散序列集合,称之为时间序列。(注意,X(ti)X(t_i)X(ti​)是一个随机变量) 特征 趋势:是时间序列在长时期内呈现出来的持续向上或...
  • R语言时间序列分析

    万次阅读 多人点赞 2015-01-26 15:35:48
    R语言时间序列分析:ARIMA模型及检验
  • 关于谱分析的内容,参考我的另一篇文章:时间序列预测:谱分析 1. 简介 ...频谱分析就是在频域上分析时间序列的方法,它使用傅里叶分析方法,将时域信号转换到频域,并从频域中找出信号频谱的变化规...
  • 时间序列预测分析:以NASDAQ指数为例
  • 时间序列预测算法总结

    万次阅读 多人点赞 2018-10-18 10:30:48
    time series data mining 主要包括decompose(分析数据的各个成分,例如趋势,周期性),prediction(预测未来的值),classification(有序数据序列的feature提取与分类),clustering(相似数列聚类)等。...
  • 研究金融市场表现和天气预报的事实上的选择,时间序列是最普遍的分析技术之一,因为它与时间有着不可分割的关系 - 我们总是有兴趣预测未来。 时间相关模型 一种直观的预测方法是参考最近的时间点。今天的股价可能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 197,185
精华内容 78,874
关键字:

对应分析的可以对时间序列