移动平均

<image>

移动平均（moving average，缩写：MA），又称滚动平均值、滑动平均，在统计学中是一种通过创建整个数据集中不同子集的一系列平均数来分析数据点的计算方法。它也是有限脉冲响应滤波器的一种。变化包括: 简单移动平均、指数移动平均、加权移动平均，以及累积移动平均（描述如下）。

给定一个数列和一个固定子集大小，移动平均数的第一个元素是由数列的初始固定子集的平均值得到的。然后通过“向前移位”修改子集，即排除序列的第一个数，并在子集中包含下一个值。

移动平均通常与时间序列数据一起使用，以消除短期波动，突出长期趋势或周期。短期和长期之间的阈值取决于应用，移动平均的参数将相应地设置。例如，它通常用于对财务数据进行技术分析，如股票价格、收益率或交易量。它也用于经济学中研究国内生产总值、就业或其他宏观经济时间序列。数学上，移动平均是卷积的一种类型，因此它可以被看作是用于信号处理的低通滤波器的一个例子。当与非时间序列数据一起使用时，移动平均滤波器的频率分量更高，但与时间没有任何特定的联系，尽管通常暗含某种排序。简单地看，它可以看作是把数据变得更平滑。

## 数字信号处理观点下的移动平均

在数字信号处理（DSP）领域中，移动平均可视为一种用来平滑离散时间讯号的低通滤波器。不同类型的移动平均在系统特性上，对应着不同的滤波器架构与频率响应：

简单移动平均在数学上等同于一个有限脉冲响应（FIR）滤波器。若将时间序列视为离散时间讯号 $x[n]$，一个长度为 $N$ 的 SMA 其差分方程式为：

$$y[n] = \frac{1}{N}\sum_{k=0}^{N-1} x[n-k]$$

在时域中，这相当于对讯号施加一个长度为 $N$ 的矩形窗（Rectangular window）。其频率响应呈现Sinc函数 $\frac{\sin(\omega N/2)}{\sin(\omega/2)}$ 的特征。由于 Sinc 函数具有显著的旁波瓣（Side lobes），这意味着 SMA 虽然能滤除大部分高频噪声，但对于某些特定频率的周期性波动无法完全抑制，甚至可能产生相位反转（Phase reversal），这在资料分析上会导致伪影或伪讯号的产生。

相较之下，指数移动平均（EMA）由于在计算时引入了前一次的输出结果，在数字信号处理中对应于一阶无限脉冲响应（IIR）滤波器。其差分方程式具备回馈（Feedback）特征：

$$y[n] = \alpha x[n] + (1-\alpha) y[n-1]$$

由于具备指数递减的脉冲响应，EMA 在系统运算上不需储存大量的历史资料，且其频率响应的滚降（Roll-off）特性通常能比同长度的 SMA 更平滑地衰减高频讯号。

在金融技术分析中常提及移动平均具有“滞后性（Lag）”，此现象在讯号处理中称为群延迟或相位延迟。任何处理即时讯号的因果滤波器（Causal filter）皆会产生时间差。对于长度为 $N$ 的 SMA，其线性相位特性会产生精确的 $\frac{N-1}{2}$ 个取样点的群延迟。这解释了为何数据趋势发生反转时，SMA 的转折点会落后于实际数据。而 EMA 作为一阶 IIR 滤波器，其非线性相位特性使其在低频区域的群延迟较小，因此对最新数据的反应速度在数学结构上会比 SMA 更为迅速。

## 在美国线（OHLC）与价格特征的进阶应用

在金融市场的技术分析中，移动平均最常被应用于平滑美国线（OHLC chart）所记录的价格波动。传统上，移动平均的输入讯号 $x[n]$ 多半仅采用美国线四项资讯中的“收盘价（Close）”。然而，单一收盘价容易受到市场尾盘的极端交易或人为高频噪声影响。

结合讯号预处理的观念，进阶的应用会提取美国线中的多维度资讯来重建输入讯号。例如，将最高价（High）、最低价（Low）与收盘价（Close）取算术平均，计算出“典型价格（Typical Price）”：

$$Typical\ Price = \frac{High + Low + Close}{3}$$

将典型价格或其他加权价格（如包含开盘价的 $\frac{Open+High+Low+Close}{4}$）作为离散讯号再输入至 SMA 或 EMA 滤波器中，相当于在进行时间轴的低通滤波前，先进行了振幅轴的降噪处理。这种做法能更客观地反映该取样区间的真实价格重心，有效降低单一数据点极端波动对移动平均线造成的误导。

## 简单移动平均

<image>

在金融应用中，一个简单移动平均（SMA）是以前 n 个数据的未加权平均数。然而，在科学和工程中，平均值通常取自中心值两边相等数量的数据。这样可以确保平均值的变化与数据的变化一致，而不是随时间变化。

例如，对于 n 天的收盘价样本，简单等权重移动平均是前 n 天收盘价的平均值。如果收盘价为 $p_M, p_{M-1}, \dots, p_{M-(n-1)}$，则公式为

$$\begin{align} <pre> \overline{p}_\text{SM} &= \frac{p_M + p_{M-1} + \cdots + p_{M-(n-1)}}{n} \\ &= \frac{1}{n} \sum_{i=0}^{n-1} p_{M-i}. </pre> \end{align}$$

当计算下一天的移动平均的时候，就会在求和中加入一个新值，剔除一个旧值，无需把所有数值重新加一遍：

$$\overline{p}_\text{SM} = \overline{p}_{\text{SM},\text{prev}} + \frac{1}{n} (p_M - p_{M-n}).$$

所选择的时间段取决于利率变动的类型，如短期、中期或长期。从金融角度来看，移动平均线水平可以解释为市场下跌时的支撑，或者市场上涨时的阻力。

如果使用的数据不以平均值为中心，那么简单移动平均就会落后于最新的数据点一半的采样宽度。旧数据点的丢掉和新数据点的加入也会对SMA造成较大影响。SMA的一个特点是，如果数据存在周期性波动，那么应用该周期的SMA将消除这种波动（平均值总是包含一个完整的周期）。但是完全规律的循环是几乎不会遇到的。

对于许多应用来说，这有利于避免仅使用“过去”数据而引起的移位。因此，可以使用在计算平均值的系列中点的任一侧等距分布的数据来计算中心移动平均。这需要在样本窗口中使用奇数个数据点。

SMA的主要缺点是，它使比窗口长度短的大量信号通过。更糟糕的是，它实际上将其反转。这可能会导致意外的伪影，例如，平滑结果中的峰值出现在数据中出现波谷的位置。由于某些较高的频率未正确消除，这也导致结果不如预期的平滑。

在技术分析中，不同的市场对常用天数（n值）有不同的需求，例如：某些市场普遍的n值为10日、40日、200日；有些则是5日、10日、20日、60日、120日、240日，视乎分析时期长短而定。投资者冀从移动平均线的图表中分辨出支持位或阻力位。

## 指数移动平均

<image>

指数移动平均（exponential moving average，EMA或EWMA）是以指数式递减加权的移动平均。

各数值的加权影响力随时间而指数式递减，越近期的数据加权影响力越重，但较旧的数据也给予一定的加权值。右图是一例子。

加权的程度以常数 α 决定，α 数值介乎 0 至 1。α 也可用天数N来代表：$\alpha={2\over{N+1}}$，所以，N=19天，代表 α=0.1。

设时间 t 的实际数值为 Yt，而时间t的EMA则为St；时间 t-1 的EMA则为 St-1，计算时间 t≥2 是方程式为：

$$S_{t} = \alpha \times Y_{t} +(1-\alpha) \times S_{t-1}$$

设今日（t）价格为$p_{t}$，则今日（t）的$EMA_{t}$方程式为：

$$EMA_{t} = \alpha \times p_{t} + (1-\alpha) \times EMA_{t-1} = EMA_{t-1} + \alpha \times (p_{t} - EMA_{t-1})$$

将$EMA_{t-1}$递回代入：

$$EMA_{t} = \alpha \times ( p_{t} +(1-\alpha)p_{t-1} +(1-\alpha)^2 p_{t-2} +(1-\alpha)^3 p_{t-3} + \cdots )$$

理论上这是一个无穷级数，由于$(1 - \alpha)$小于 1，后面的数值会越来越小，可以被忽略只计算前 (N+1) 项。

对于近似均匀无变的数据少算的部分约为$(1-\alpha)^{N+1}$

$$\text{EMA權 重}\;= \alpha \times \Big[1+(1-\alpha)+(1-\alpha)^2+(1-\alpha)^3+ \cdots +(1-\alpha)^N \Big]$$

$$\qquad\qquad\;=\Big[ 1 - (1 - \alpha)^{N+1} \Big]$$

假设MA和EMA有相同质心, MA质心= ${(1+N) \over 2}$ ,

EMA 质心= $\alpha \times \Big[1+2(1-\alpha)+3(1-\alpha)^2 + \cdots \Big]= {1 \over \alpha}$ ,

即 ${{(1+N)} \over 2} = {1 \over \alpha} , \quad \alpha= {2 \over{ (N+1)}}$

根据1697年 Johann Bernoulli: $\lim_{n \to \infty} {(1 + {x \over n})^n} = \mbox{e}^x$ , 则

$1 - (1 - \alpha)^{N+1} = 1- \left(1 - {2 \over (N+1)}\right)^{N+1} \approx 1 - \mbox{e}^{-2} \approx 86%$ ;

即当 $\alpha = {2 \over (N+1)}$时, 只计算前 N+1 项已涵盖了 86% 完整权重;

若要计算函盖 99.9% 的完整加权，计算前 k-1 项( k-1 天) 忽略第k项之后, 则约略漏算了$\;(1 - \alpha)^{k} = 0.1%=0.001$ , 则

$k = {\log_{e}(0.001) \over {\log_{e}(1-\alpha)}} \approx {\log_{e}(0.001) \over {- \alpha} } \approx 3.45(N+1)$ ,

由于当 N 值很大时 α 很小接近零, $\; \log_{e}(1-\alpha)$ = $- \alpha + {\alpha^2 \over 2} + \cdots$ 将趋近$- \alpha$ (泰勒展开)。

若只要函盖 99% 的加权则 $k \approx {\log_{e}(0.01) \over {- \alpha} } \approx 2.30(N+1)$;

要包含 95% 的加权则 $k \approx {\log_{e}(0.05) \over {- \alpha} } \approx 1.50(N+1)$;

例如: 当 N=9, α = 0.200 , k ∼15 函盖95% , k ∼23 能函盖99% ; k ∼35 函盖达99.9% ;

当 N=26, α ≈ 0.074 , k ∼40 函盖95%.

## 加权移动平均

加权移动平均（weighted moving average，WMA）指计算平均值时将个别数据乘以不同数值，在技术分析中，n日WMA的最近期一个数值乘以n、次近的乘以n-1，如此类推，一直到0：

$$WMA_{M} = { n p_{M} +(n-1) p_{M-1} + \cdots + 2 p_{M-n+2} + p_{M-n+1} \over n +(n-1) + \cdots + 2 + 1}$$

<image>

由于$WMA_{M+1}$与$WMA_{M}$的分子相差$n p_{M+1} - p_{M} - \cdots - p_{M-n+1}$，假设$p_{M} + p_{M-1} + \cdots + p_{M-n+1}$为总和M：

总和M+1 $=$总和M $+ p_{M+1} - p_{M-n+1}$

分子M+1 $= N_{M+1} =$分子M $+ n p_{M+1} -$总和M

$$WMA_{M+1} = { N_{M+1} \over n +(n-1) + \cdots + 2 + 1}$$

留意分母为三角形数，方程式为$n(n+1)\over2$

右图显示出加权是随日子远离而递减，直至递减至零。

## 累积移动平均

在累积移动平均（CMA）中，数据以有序数据流的形式到达，用户希望获得直到当前数据点为止的所有数据的平均值。例如，投资者可能想要特定股票直到当前时间的所有股票交易的平均价格。随着每笔新交易的发生，可以使用累计平均值（通常是直到当前时间的 n 个值序列 $x_1, \ldots, x_n$ 的均等加权平均值）计算该点之前所有交易的平均交易价格：

$$\text{CMA}_n = {{x_1 + \cdots + x_n} \over n}\,.$$

计算此问题的暴力方法是存储所有数据，并计算总和，并在每次新数据点到来时除以数据点数。但其实，可以使用下面地公式，在拿到新值 $x_{n+1}$ 时，简单地更新累计平均值：

$$\text{CMA}_{n+1} = {{x_{n+1} + n \cdot \text{CMA}_n} \over {n+1}}.$$

因此，新数据点的当前累积平均值等于先前的累积平均值乘以 n，再加上最新的数据点，所有这些均除以到目前为止已接收的点数 n+1。当所有数据点都到达（n = N）时，累积平均值将等于最终平均值。还可以存储数据点的当前总和以及点的数目，并将总数除以数据点的数目，以便在每次有新的基准点到达时得到CMA。

累积平均公式的推导很直接。使用

$$x_1 + \cdots + x_n = n \cdot \text{CMA}_n$$

对于 n + 1，我们有

$$\begin{align} x_{n+1} & = (x_1 + \cdots + x_{n+1}) - (x_1 + \cdots + x_n) \\[6pt] \end{align}$$

求解 $\text{CMA}_{n+1}$ 就可以得到

$$\begin{align} \text{CMA}_{n+1} & = {x_{n+1} + n \cdot \text{CMA}_n \over {n+1}} \\[6pt] & = {x_{n+1} + (n + 1 - 1) \cdot \text{CMA}_n \over {n+1}} \\[6pt] & = {(n + 1) \cdot \text{CMA}_n + x_{n+1} - \text{CMA}_n \over {n+1}} \\[6pt] & = {\text{CMA}_n} + {{x_{n+1} - \text{CMA}_n} \over {n+1}} \end{align}$$

## 其他加权

有时计算移动平均时会加入其他变数，例如，“交易量加权”会加入交易量的因素。

## 内部连结

- 技术分析
- K线
- 布林带（BBands）
- 随机指标（KD）
- 相对强弱指数（RSI）
- 指数平滑异同移动平均线（MACD）
- 乖离率（BIAS）