时间序列分析:简单指数平滑

1. 朴素方法

  使用 $X_{n+h}^{n}$ 表示使用时刻为 $n$ 的数据对 $n+h$ 时刻进行预测的预测值,则一种非常朴素的预测方法是直接使用 $n$ 时刻的值 $x_n$ 作为 $n + 1$ 时刻的预测值,即

\begin{equation}
x_{n+1}^n = x_n
\end{equation}

考虑季节性因素,对于周期为 $S$ 的序列,可以使用上一个周期的值进行预测,即

\begin{equation}
x_{n+1}^n = x_{n+1-S}
\end{equation}

  另一种朴素的方法是使用历史的平均值进行预测,即

\begin{equation}
x_{n+1}^n = \frac{\sum\limits_{i=1}^n x_i}{n}
\end{equation}

2. 简单指数平滑

  一般来说,一个时间序列在 $t$ 时刻的值与相邻时刻(如 $t-1$ )值的关系较密切,与较远时刻值的关系较弱。在进行预测时,考虑对历史进行加权,较近时刻权值较大,较远时刻权值较小,同时保证所有权值的和为 $1$。

  对于 $0 < |\alpha| < 1$,由几何级数,有

\begin{equation}
\sum_{i=0}^\infty (1 – \alpha)^i = \frac{1}{\alpha}
\end{equation}

上式等号两边同乘以 $\alpha$,得

\begin{equation}
\alpha \sum_{i=0}^\infty (1 – \alpha)^i = \sum_{i=0}^\infty \alpha (1 – \alpha)^i = \alpha + \alpha(1-\alpha) + \alpha(1-\alpha)^2 + \cdots = 1
\end{equation}

  故可以用 $\alpha (1 – \alpha)^i$ 作为权值对时间序列的历史值进行加权,来进行预测,此时得到预测值 $x_{n+1}$

\begin{equation}
x_{n+1}^n = \alpha x_n + \alpha(1-\alpha) x_{n-1} + \alpha(1-\alpha)^2 x_{n-2} + \cdots \tag{1}
\end{equation}

令 $n = n – 1$,有

\begin{equation}
x_{n}^{n-1} = \alpha x_{n-1} + \alpha(1-\alpha) x_{n-2} + \alpha(1-\alpha)^2 x_{n-3} + \cdots \tag{2}
\end{equation}

式 $(2)$ 等号两边同乘以 $(1-\alpha)$,得

\begin{equation}
(1-\alpha)x_{n}^{n-1} = \alpha(1-\alpha) x_{n-1} + \alpha(1-\alpha)^2 x_{n-2} + \alpha(1-\alpha)^3 x_{n-3} + \cdots \tag{3}
\end{equation}

注意到式 $(3)$ 等号右边的部分也出现在式 $(1)$ 中,此时式 $(1)$ 可以写成

\begin{equation}
x_{n+1}^n = \alpha x_n + (1-\alpha)x_{n}^{n-1} \tag{4}
\end{equation}

3. 一个例子

3.1. 查看数据

  获取并绘制伦敦年降雨量数据和 ACF 如图 1、图 2 所示。

data <- scan("http://robjhyndman.com/tsdldata/hurst/precip1.dat", skip=1)
data.ts <- ts(data, start=c(1813))
plot(data.ts)
acf(data.ts)

图 1

图 2

由图 2 可见序列没有显著自相关。

  绘制直方图和 Q-Q Plot 如图 3、图 4。

hist(data.ts)

qqnorm(data.ts)
qqline(data.ts)

图 3

图 4

可见降水量分布类似正态分布,QQ Plot 在两端有一些系统性偏差。

  尝试使用 ARIMA 模型进行建模

library(forecast)
auto.arima(data.ts)

输出结果为

Series: data.ts 
ARIMA(0,0,0) with non-zero mean 

Coefficients:
         mean
      24.8239
s.e.   0.4193

sigma^2 estimated as 17.76:  log likelihood=-285.25
AIC=574.49   AICc=574.61   BIC=579.7

可见得到的模型是一个 $24.8239$ 的常数。

3.2. 简单预测

  使用如下代码进行下一年降水量的预测:

forcast.simple <- function(data, alpha) {
    values <- NULL
    values[1] <- data[1]
    for (i in 1:length(data)) {
        values[i+1] <- alpha * data[i] + (1 - alpha) * values[i]
    }
    return(values)
}

forecast.values <- forcast.simple(data, 0.2)
tail(forecast.values, n=1)

输出为 25.3094062064236

  上面直接使用 $\alpha = 0.2$。为了选择更好的 $\alpha$,以 SSE 为评价标准,尝试一系列的 $\alpha$ 值,找到预测 SSE 最小的 $\alpha$ 值:

sse <- NULL
n <- length(data.ts)
alphas <- seq( .001, .999, by=0.001)

for (i in 1:length(alphas)) {
    forecast.values <- forecast.values <- forcast.simple(data, alphas[i])
    sse[i] <- sum((data.ts[1:n] - forecast.values[1:n])^2)
}

plot(sse ~ alphas)

输出图像如图 5 所示:

图 5

可见得到最小 SSE 的 $\alpha$ 值较小,使用 alphas[which.min(sse)] 查看最佳 $\alpha$ 值为 0.024

3.3. 使用 HoltWinters 函数

  除了像上面手动计算最佳 $\alpha$,也可以直接使用现成的函数拟合:

HoltWinters(data.ts, beta=FALSE, gamma=FALSE)

输出为

Holt-Winters exponential smoothing without trend and without seasonal component.

Call:
HoltWinters(x = data.ts, beta = FALSE, gamma = FALSE)

Smoothing parameters:
 alpha: 0.02412151
 beta : FALSE
 gamma: FALSE

Coefficients:
      [,1]
a 24.67819

这里得到的 $\alpha$ 为 0.02412151,与前面的结果一致。