本专栏将会介绍时间序列、预测和不同的基本原理我们将在讨论的不同章节中使用。具体来说,本笔记本将讨论:
- 时间序列
- 时间序列预测
- 随机过程
我们使用Python及相关Python第三方库来分析时间序列
# Required Libraries
import numpy as np
import numpy.random as rng
import pandas as pd
import scipy.stats as st
import matplotlib.pyplot as plt
import statsmodels.graphics.tsaplots as tg
%matplotlib inline
plt.rcParams['figure.figsize'] = [15, 2]
General Introduction
我们大多数人都会听说过市场上的新嗡嗡声,即加密货币。我们中的许多人也会投资他们的硬币。但是,将资金投资于如此波动的货币安全吗?我们如何确保现在投资这些硬币肯定会在未来产生健康的利润?我们不能确定,但我们肯定可以根据之前的价格生成一个近似值。时序模型是预测它们的一种方法。
What is a Time Series?
引用两篇博客中对时间序列的定义:
- 时间序列数据(time-series data) ,亦即单一变量按时间的先后次序产生的数据。
- 时间序列是一系列索引值,其中每个值都是随机变量的结果。换句话说,时间序列是相应过程的一种实现。
时间序列的一个例子是在德国耶拿马克斯普朗克生物地球化学研究所的气象站记录的天气时间序列数据集。在这个数据集中,几年内每 14 分钟记录 10 个不同的量(如气温、大气压力、湿度、风向等)。原始数据可以追溯到 2003 年,但此示例仅限于 2009-2016 年的数据。此数据集非常适合学习使用数值时间序列。我们将使用此数据集来构建我们的模型。以下是数据中的实际变量:
- Date Time
- p (mbar) atmospheric pressure
- T (degC) temperature
- Tpot (K) potential temperature
- Tdew (degC) dew point temperature
- rh (%) relative humidity
- VPmax (mbar) saturation water vapor pressure
- VPact (mbar) actual water vapor pressure
- VPdef (mbar) water vapor pressure deficit
- sh (g/kg) specific humidity
- H2OC (mmol/mol) water vapor concentration
- rho ( g / m 3 ) (g/m^3) (g/m3) air density
- wv (m/s) wind velocity
- max. wv (m/s) maximum wind velocity
- wd (deg) wind direction
Time Series Forecasting
预测是在给定所有可用信息(例如历史数据和可能影响数据的任何可能变量)的情况下预测时间序列的未来值。除了加密货币之外,还有多个重要领域使用时间序列预测,例如:预测销售,呼叫中心的呼叫量,太阳能活动,海洋潮汐,股票市场行为等等。假设一家酒店的经理想要预测他预计明年有多少访客来相应地调整酒店的库存,并对酒店的收入做出合理的猜测。根据前几年/月/日的数据,他可以使用时间序列预测并得到访问者的近似值。游客的预测价值将有助于酒店管理资源并相应地计划事情。
在我们预测时间序列之前需要考虑时间序列的几个点:
- 数据类型(趋势、季节性等)。
- 影响他的因素分析(多元分析、因果关系分析等)。
- 数据量的大小。
在接下来的章节中,我们将讨论如何使用它们的不同预测方法。每种方法都有自己的一组假设和局限性,但一般的想法是我们假设有一个基本的数学过程来定义我们的时间序列。了解这些数学过程有助于我们找到最佳方法或算法(以及相应的超参数),以更好地预测我们的时间序列。
在下一节中我们讨论时间序列的第一种表述方式,随机过程。
stochastic process
随机过程是一系列索引随机变量,在时间序列分析的背景下,我们将使用、离散的时间作为索引:
t
=
0
,
1
,
2
,
⋯
t=0,1,2,\cdots
t=0,1,2,⋯
{
X
0
,
X
1
,
X
2
,
⋯
}
\{X_0,X_1,X_2,\cdots\}
{X0,X1,X2,⋯}表示一个随机过程,其中
X
0
,
X
1
,
X
2
⋯
X_0,X_1,X_2\cdots
X0,X1,X2⋯表示随机变量。
在此上下文中,时间序列是一系列索引值,其中每个值都是随机变量的结果。换句话说,时间序列是相应过程的一种实现。
示例 1:伯努利试验。回想一下,伯努利试验有两种可能的结果或实现。让我们把它们当作.让我们生成几个值:{−1,+1}
bern_outcomes = [-1., 1.]
size = 100
# Generate 100 Bernoulli trials
flips = rng.choice(bern_outcomes, size=size)
series = pd.Series(flips)
fig, ax = plt.subplots(figsize=(15, 2))
series.plot(ax=ax) # here we implicitly index them; let the index stand for time
plt.show()
示例2:高斯白噪声。高斯白噪声过程生成一个时间序列,其中每个值都来自均值和单位方差为零的高斯分布:
x
t
∼
G
a
u
s
s
i
a
n
(
0
,
1
)
x_t\sim Gaussian(0,1)
xt∼Gaussian(0,1)
size = 1000
wn = st.norm.rvs(size=size)
wn_series = pd.Series(wn)
fig, ax = plt.subplots(figsize=(15, 2))
wn_series.plot(ax=ax)
plt.show()
高斯白噪声具有独立且分布相同的特性,这导致了线性时间序列的一些关键特性,下面将介绍。
示例 3:一维布朗运动。一维布朗运动或维纳过程可以被认为是白噪声时间序列的累积和。序列在
t
t
t时刻的值是所有先前值的总和,可以认为是随机步行者在时间
t
t
t的位移:
X
t
=
X
t
1
+
X
t
−
2
+
⋯
=
∑
i
=
0
t
X
i
X_t = X_{t1}+X_{t-2}+\dots =\sum_{i=0}^{t}X_i
Xt=Xt1+Xt−2+⋯=∑i=0tXi
size = 100000
bms = []
bms_msq = []
for i in range(100):
wn = st.norm.rvs(size=size)
bm = np.cumsum(wn)
bms.append(bm)
bms_msq.append([x**2 for x in bm])
bm_ave = np.mean(bms, axis=1)
bm_msq = np.mean(bms_msq, axis=1)
fig, ax = plt.subplots(figsize=(15, 2))
bms_series = pd.Series(bm_ave)
bms_msq_series = pd.Series(bm_msq)
bms_series.plot(label="Displacement", ax=ax)
bms_msq_series.plot(label="MSD", ax=ax)
plt.legend()
plt.show()
示例4:移动平均`给定一个白噪声过程见上,在
t
t
t时刻的一个q阶的移动平均过程是当前值和过去几个值的加权和:
X
t
=
ϵ
t
+
a
1
ϵ
t
−
1
+
⋯
+
a
q
ϵ
t
−
q
X_t=\epsilon_t+a_1\epsilon_{t-1}+\cdots+a_q\epsilon_{t-q}
Xt=ϵt+a1ϵt−1+⋯+aqϵt−q,其中
{
ϵ
t
}
∼
W
N
(
0
,
σ
2
)
\{\epsilon_t\}\sim WN(0,\sigma^2)
{ϵt}∼WN(0,σ2)。我们写作
{
X
t
}
∼
M
A
(
q
)
\{X_t\}\sim MA(q)
{Xt}∼MA(q),该移动平均过程是一个线性过程,假如我们有一个参数
a
1
=
0.5
a_1=0.5
a1=0.5和
a
2
=
0.25
a_2=0.25
a2=0.25的二阶移动平均过程:
X
t
=
ϵ
t
+
a
1
ϵ
t
−
1
+
a
2
ϵ
t
−
2
X_t=\epsilon_t+a_1\epsilon_{t-1}+a_2\epsilon_{t-2}
Xt=ϵt+a1ϵt−1+a2ϵt−2
def ma2(wn):
x = []
# First element is just epsilon_t
x.append(wn[0])
# For the second element, let's take just the first coefficient (admittedly a judgment call)
x.append(0.5*wn[0] + wn[1])
# For the rest, use the full equation
for t in range(2, len(wn)):
x.append(wn[t] + 0.5*wn[t - 1] + 0.25*wn[t - 2])
return np.array(x)
size = 1000
wn = st.norm.rvs(size=size)
ma2_series = pd.Series(
ma2(wn)
)
wn_series = pd.Series(wn)
fig, ax = plt.subplots(figsize=(15, 2))
wn_series.plot(label="WN(0,1)", ax=ax)
ma2_series.plot(label=r"MA(2)", ax=ax)
plt.legend(loc="best")
plt.show()
Stationarity
时序数据具有平稳性,意味着其统计特性(如均值、方差)在时间上是常数或不会随时间变化。
给定一个时间序列
{
X
t
}
\{X_t\}
{Xt},在时间
t
1
+
τ
,
t
2
+
τ
,
⋯
,
t
n
+
τ
t_1+\tau,t_2+\tau,\cdots ,t_n+\tau
t1+τ,t2+τ,⋯,tn+τ具有相应的时间分布
P
(
X
t
1
+
τ
,
X
t
2
+
τ
,
⋯
,
X
t
n
+
τ
)
P(X_{t_{1+\tau}},X_{t_{2+\tau}},\cdots ,X_{t_{n+\tau}})
P(Xt1+τ,Xt2+τ,⋯,Xtn+τ)。
对任何
τ
,
t
1
⋯
,
t
n
和
n
\tau,t_1\cdots,t_n\text{和}n
τ,t1⋯,tn和n来说,如果
P
(
X
t
1
+
τ
,
X
t
2
+
τ
,
⋯
,
X
t
n
+
τ
)
=
P
(
X
t
1
+
,
X
t
2
,
⋯
,
X
t
n
)
P(X_{t_{1+\tau}},X_{t_{2+\tau}},\cdots ,X_{t_{n+\tau}})=P(X_{t1}+,X_{t2},\cdots ,X_{tn})
P(Xt1+τ,Xt2+τ,⋯,Xtn+τ)=P(Xt1+,Xt2,⋯,Xtn),那么时间序列
X
t
X_t
Xt是平稳的。
本质上讲,平稳过程的统计量对时间平移是不变的。
如果时间序列
{
X
t
}
\{X_t\}
{Xt}满足:
- 对任意 τ \tau τ来说 μ ( X t ) = μ ( X t + τ ) = μ \mu(X_t)=\mu(X_{t+\tau})=\mu μ(Xt)=μ(Xt+τ)=μ。
- 对任意 t t t来说 E [ ∣ X t ∣ 2 ] < ∞ E[|X_t|^2]<\infin E[∣Xt∣2]<∞。
- Γ ( t 1 , t 2 ) = Γ ( t 1 − t 2 ) \Gamma(t_1,t_2)=\Gamma(t_1-t_2) Γ(t1,t2)=Γ(t1−t2)
上式中
Γ
(
t
1
,
t
2
)
\Gamma(t_1,t_2)
Γ(t1,t2)表示
t
1
t_1
t1和
t
2
t_2
t2的协方差定义为:
Γ
(
t
1
,
t
2
)
=
c
o
v
(
t
1
,
t
2
)
=
E
[
(
X
t
1
−
μ
X
t
1
)
(
X
t
2
−
μ
X
t
2
)
]
\Gamma(t_1,t_2)=cov(t_1,t_2)=E[(X_{t1}-\mu X_{t1})(X_{t2}-\mu X_{t2})]
Γ(t1,t2)=cov(t1,t2)=E[(Xt1−μXt1)(Xt2−μXt2)]。
平稳相关性意味着延迟参数
τ
\tau
τ,可用于参数化自协方差,从而:
Γ
(
τ
)
=
E
[
(
X
t
−
μ
)
(
X
t
+
τ
−
μ
)
]
=
γ
t
−
s
\Gamma(\tau)=E[(X_t-\mu)(X_{t+\tau}-\mu)]=\gamma_{t-s}
Γ(τ)=E[(Xt−μ)(Xt+τ−μ)]=γt−s。
{
γ
t
}
\{\gamma_t\}
{γt}为序列
{
X
t
}
\{X_t\}
{Xt}的自协方差函数
通过标准差归一化
t
1
t_1
t1和
t
2
t_2
t2时刻的自协方差,并产生自相关:
P
(
t
1
,
t
2
)
=
c
o
v
(
t
1
,
t
2
)
σ
t
1
σ
t
2
=
E
[
(
X
t
1
−
μ
(
X
t
1
)
)
(
X
t
2
−
μ
(
X
t
2
)
)
]
σ
t
1
σ
t
2
P(t_1,t_2)=\frac{cov(t_1,t_2)}{\sigma_{t_1}\sigma_{t_2}}=\frac{E[(X_{t_1}-\mu(X_{t_1}))(X_{t_2}-\mu(X_{t_2}))]}{\sigma_{t_1}\sigma_{t_2}}
P(t1,t2)=σt1σt2cov(t1,t2)=σt1σt2E[(Xt1−μ(Xt1))(Xt2−μ(Xt2))]
对于弱平稳性时间序列来说:
P
(
τ
)
=
E
[
(
X
t
−
μ
)
(
X
t
+
τ
−
μ
)
]
σ
2
P(\tau)=\frac{E[(X_t-\mu)(X_{t+\tau}-\mu)]}{\sigma^2}
P(τ)=σ2E[(Xt−μ)(Xt+τ−μ)]
Autocovariance of a stationary process
平稳时间序列的自协方差函数具有特定的形式,让 τ = ∣ t 1 − t 2 ∣ \tau=|t_1-t_2| τ=∣t1−t2∣表示时间滞后lag,对于具有 n n n个时间点的平稳时间序列 { X t } \{X_t\} {Xt}来说,它的自协方差函数矩阵是对称和正定的:
- 对称性 γ k = γ − k , ∀ k ∈ Z \gamma_k=\gamma_{-k},\forall k\in \mathbb{Z} γk=γ−k,∀k∈Z。
- 正定性:
Γ n = ( γ k − j ) k , j = 1 n = ( γ 0 γ 1 γ 2 ⋯ γ n − 1 γ 1 γ 0 γ 1 ⋯ γ n − 2 γ 2 γ 1 γ 0 ⋯ γ n − 3 ⋮ ⋮ ⋮ ⋱ ⋮ γ n − 1 γ n − 2 ⋯ γ n − 3 γ 0 ) \Gamma_n=(\gamma_{k-j})^n_{k,j=1}= \left( \begin{matrix} \gamma_0 &\gamma_1 &\gamma_2 &\cdots &\gamma_{n-1} \\ \gamma_1 &\gamma_0 &\gamma_1 &\cdots &\gamma_{n-2} \\ \gamma_2 &\gamma_1 &\gamma_0 &\cdots &\gamma_{n-3} \\ \vdots &\vdots &\vdots &\ddots &\vdots \\ \gamma_{n-1} &\gamma_{n-2} &\cdots &\gamma_{n-3} &\gamma_0 \end{matrix} \right) Γn=(γk−j)k,j=1n= γ0γ1γ2⋮γn−1γ1γ0γ1⋮γn−2γ2γ1γ0⋮⋯⋯⋯⋯⋱γn−3γn−1γn−2γn−3⋮γ0
Moving Average Process
移动平均模型(MA模型)描述的是当前时间点的数据与过去噪声的关系。严格定义上来讲:其模型的定义是基于白噪声序列的假设。白噪声是一种特殊的时间序列模型,每个时间点的数据都是独立且服从相同分布的,且具有常数的均值和方差。
q
q
q阶的移动平均模型的函数表达式为:
Y
t
=
ϵ
t
+
a
1
ϵ
t
−
1
+
⋯
+
a
q
ϵ
t
−
q
Y_t=\epsilon_t+a_1\epsilon_{t-1}+\dots+a_q\epsilon_{t-q}
Yt=ϵt+a1ϵt−1+⋯+aqϵt−q
这一公式被称为q阶的移动平均模型,写作
M
A
(
q
)
MA(q)
MA(q),其中:
- Y t Y_t Yt是我们感兴趣的时间序列,在时间点 t t t的观察值。
- μ \mu μ是时间序列的均值或者期望值,这个值对所有的时间点都是相同的。
- ϵ t , ϵ t − 1 , ϵ t − 2 , … , ϵ t − q \epsilon_t,\epsilon_{t-1},\epsilon_{t-2},\dots,\epsilon_{t-q} ϵt,ϵt−1,ϵt−2,…,ϵt−q这些是所谓的白噪声项,每个时间点的值都是独立同分布的,通常假设为正态分布。这些项的均值为0,方差为 σ 2 \sigma^2 σ2。
- θ 1 , θ 2 , … , θ q \theta_1,\theta_2,\dots,\theta_q θ1,θ2,…,θq这些事模型的参数,每个参数的 θ \theta θ对应一个白噪声项,它们衡量的是对应的白噪声对当前时间点的影响程度。
- q q q是阶数,表示有多少个过去的白噪声项被纳入模型。
这个公式的含义是:在时间点 t t t,观察到的值 Y t Y_t Yt是由过去q个时间点的白噪声的线性组合加上一个常数 μ \mu μ和当前时间点的白噪声决定的。各个白噪声项的权重由参数 θ \theta θ决定。
Autoregressive Process
AR自回归模型,是一种被广泛用于分析时间序列数据的统计模型。从严格的定义上来说:在统计学中,一个自回归模型的形式是描述某个变量与其过去值的关系的。对于一个时间序列数据,自回归模型的
q
q
q阶形式为:
Y
t
=
ϵ
t
+
a
1
X
t
−
1
+
⋯
+
a
p
X
t
−
p
Y_t=\epsilon_t+a_1X_{t-1}+\dots+a_pX_{t-p}
Yt=ϵt+a1Xt−1+⋯+apXt−p
其中
p
p
p表示使用的时间滞后(lags)的数量。公式中:
- ϵ t \epsilon_t ϵt表示在时间点 t t t的误差项,也被称为白噪声项。
- a 1 X t − 1 + ⋯ + a p X t − p a_1X_{t-1}+\dots+a_pX_{t-p} a1Xt−1+⋯+apXt−p:这些项表示过去的 p p p个时间点的时间序列值对当前时间点的影响, a i a_i ai是弟 i i i哥滞后项的系数,代表了弟 i i i个滞后项对当前时间点的相对影响力。
Evaluation Metrics for Forecast Accuracy
预测是时间序列分析中最常见的推理任务之一。为了正确衡量时序模型的性能,通常的做法是将数据集分为两部分:训练数据和测试数据。使用训练数据估计模型参数,然后使用模型生成根据测试数据进行评估的预测。
错误统计有不同的风格,每种风格都有自己的优点和缺点。
Mean Absolute Error
最常用的指标是mean absolute error或者MAE。它的主要优点是易于理解和计算。我们注意到该指标与规模相关,这意味着它无法与具有不同单位的其他时间序列进行比较。此外,最小化 MAE 的方法会生成导致中位数的预测。
M
A
E
=
1
n
∑
t
=
1
n
∣
y
t
−
y
^
t
∣
MAE=\frac{1}{n}\sum_{t=1}^n|y_t-\hat y_t|
MAE=n1t=1∑n∣yt−y^t∣
Root Mean Squared Error
另一个经常用的是指标是root mean squared error或者RMSE,虽然更难解释。最小化 RMSE 的方法生成导致平均值的预测,并且与 MAE 类似,RMSE 与规模相关。
R
M
S
E
=
1
n
∑
t
=
1
n
(
y
t
−
y
^
t
)
2
RMSE=\sqrt{\frac{1}{n}\sum_{t=1}^n{(y_t-\hat y_t)^2}}
RMSE=n1t=1∑n(yt−y^t)2
Mean Absolute Percentage Error
为了在具有不同单位的时间序列之间进行比较,可以使用百分比误差。一个常用的基于百分比的指标是Mean Absolute Percentage Error或 MAPE。不幸的是,百分比误差的主要缺点是,当
y
t
y_t
yt为零或接近零时,它们可能是无限的或未定义的。
M
A
P
E
=
1
n
∑
t
=
1
n
∣
y
t
−
y
^
t
y
t
∣
MAPE=\frac{1}{n}\sum_{t=1}^n|\frac {y_t-\hat y_t}{y_t}|
MAPE=n1t=1∑n∣ytyt−y^t∣
Symmetric Mean Absolute Percentage Error
MAPE 的一个特别缺点是,与正错误相比,它对负误差的惩罚更大。这导致了另一种基于百分比的指标,称为对称平均绝对百分比误差或 SMAPE。然而,计算该指标可能依然是不稳定的如果
y
t
y_t
yt和
y
^
t
\hat y_t
y^t两者都接近于零的话。
S
M
A
P
E
=
1
n
∑
t
=
1
n
∣
y
^
t
−
y
t
∣
∣
y
t
∣
+
∣
y
^
t
∣
SMAPE=\frac{1}{n}\sum_{t=1}^n\frac{|\hat y_t-y_t|}{|y_t|+|\hat y_t|}
SMAPE=n1t=1∑n∣yt∣+∣y^t∣∣y^t−yt∣