1 时间序列简介
1.1 定义
时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。
1.2 构成要素
时间序列可以分为长期趋势(trend)、季节变动(seasonal)、循环变动(cycling)和随机波动(irregular)四个部分。
- 长期趋势( T )现象在较长时期内受某种根本性因素作用而形成的总的变动趋势
- 季节变动( S )现象在一年内随着季节的变化而发生的有规律的周期性变动
- 循环变动( C )现象以若干年为周期所呈现出的波浪起伏形态的有规律的变动
- 不规则变动(I )是一种无规律可循的变动,包括严格的随机变动和不规则的突发性影响很大的变动两种类型
- 构成要素
2 时间序列模型详解
2.1 插值法
在讲AR模型之前,我们先了解下插值法
插值法又称“内插法”,是利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法。如果这特定函数是多项式,就称它为插值多项式。
插值法也有很多种,我们以简单为例讲下线性插值法:
2.2 AR模型
AR模型(Auto regressive Model)是一种线性预测,即已知N个数据,可由模型推出第N点前面或后面的数据(设推出P点),所以其本质类似于插值,其目的都是为了增加有效数据,只是AR模型是由N点递推,而插值是由两点(或少数几点)去推导多点,所以AR模型要比插值方法效果更好。
AR模型(自回归模型),是统计上一种处理时间序列的方法,用同一变数例如x的之前各期,亦即x1至xt-1来预测本期xt的表现,并假设它们为一线性关系。因为这是从回归分析中的线性回归发展而来,只是不用x预测y,而是用x预测 x(自己);所以叫做自回归。
AR模型
下面是一个四阶自回归模型的图线:
def AR(b, X, mu, sigma):
"""This functions simulates and autoregressive process
by generating new values given historical values AR coeffs b1...bk + rand"""
l = min(len(b) - 1, len(X))
b0 = b[0]
return b0 + np.dot(b[1:l + 1], X[-l:]) + np.random.normal(mu, sigma)
#Generate random data.
np.random.seed(8)
b = np.array([0.2, 0.04, 0.4, 0.05])
X = np.array([1])
mu = 0
sigma = 1
for i in range(1,1000):
X = np.append(X, AR(b, X, mu, sigma))
#Plot the AR series.
fig, ax = plt.subplots(figsize = (15, 7))
plt.plot(X)
plt.xlabel("Time values")
plt.ylabel("AR values")
plt.show()
AR模型时序图
2.3 MA模型
MA模型(moving average model)称为滑动平均模型,MA模型和AR大同小异,它并非是历史时序值的线性组合而是历史白噪声的线性组合。与AR最大的不同之处在于,AR模型中历史白噪声的影响是间接影响当前预测值的(通过影响历史时序值)。
令{et}代表未观测的白噪声序列,{zt}是观测到的时间序列,将线性过程{zt}表示成现在和过去白噪声变量的加权线性组合,对于以下形式的序列
称为滑动平均MA(q)模型。
2.4 ARMA模型
ARMA模型(auto regressive moving average model)自回归滑动平均模型,模型参量法高分辨率谱分析方法之一。这种方法是研究平稳随机过程有理谱的典型方法。它比AR模型法与MA模型法有较精确的谱估计及较优良的谱分辨率性能,但其参数估算比较繁琐。
自回归移动平均模型由两部分组成:自回归部分和移动平均部分,因此包含两个阶数,可以表示为ARMA(p,q),p是自回归阶数,q为移动平均阶数,回归方程表示为:
ARMA模型
从回归方程可知,自回归移动平均模型综合了AR和MA两个模型的优势,在ARMA模型中,自回归过程负责量化当前数据与前期数据之间的关系,移动平均过程负责解决随机变动项的求解问题,因此,该模型更为有效和常用。
from __future__ import print_function
import numpy as np
import statsmodels.api as sm
import pandas as pd
from statsmodels.tsa.arima_process import arma_generate_sample
np.random.seed(12345)
arparams = np.array([.75, -.25])
maparams = np.array([.65, .35])
arparams = np.r_[1, -arparams]
maparams = np.r_[1, maparams]
nobs = 250
y = arma_generate_sample(arparams, maparams, nobs)
dates = sm.tsa.datetools.dates_from_range('1980m1', length=nobs)
y = pd.Series(y, index=dates)
arma_mod = sm.tsa.ARMA(y, order=(2,2))
arma_res = arma_mod.fit(trend='nc', disp=-1)
print(arma_res.summary())
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10,8))
fig = arma_res.plot_predict(start='1999-06-30', end='2001-05-31', ax=ax)
legend = ax.legend(loc='upper left')
plt.show()
fig.show()
2.5 ARIMA模型
介绍时间序列平稳性时提到过,AR/MA/ARMA模型适用于平稳时间序列的分析,当时间序列存在上升或下降趋势时,这些模型的分析效果就大打折扣了,这时差分自回归移动平均模型也就应运而生。ARIMA模型能够用于齐次非平稳时间序列的分析,这里的齐次指的是原本不平稳的时间序列经过d次差分后成为平稳时间序列。
在现实生活中,存在很多非平稳的时间序列,它们的均值和方差是随着时间的变化而变化的,幸运的是,统计学家们发现,很多时间序列本身虽然不平稳,但是经过差分(相邻时间点的指标数值相减)之后,形成的新时间序列就变成平稳时间序列了。因此,差分自回归移动平均模型写成ARIMA(p,d,q)。p代表自回归阶数;d代表差分次数;q代表移动平均阶数。在spss软件中,有时输出的ARIMA模型包括6个参数:ARIMA(p,d,q)(P,D,Q),这是因为如果时间序列中包含季节变动成分的话,需要首先将季节变动分解出来,然后再分别分析移除季节变动后的时间序列和季节变动本身。这里小写的p,d,q描述的是移除季节变动成分后的时间序列;大写的P,D,Q描述的是季节变动成分。两个部分是相乘的关系。因此,ARIMA(p,d,q)(P,D,Q)也被称为复合季节模型。