↓ Skip to main content
  1. Posts/

从 EMA 到 MACD:理解趋势、动能与动能的变化

·6209 words·13 mins
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

最近一直在学美股的技术分析。前面接触了 Breakout + Retest、Double Bottom、Head & Shoulders 这些价格形态,发现每次想进一步分析趋势强度或转折信号时,MACD 都会冒出来——金叉、死叉、红绿柱、顶背离、底背离,这些词到处都是。

但我一直在记结论:金叉看涨、死叉看跌、红柱变长代表动能增强……背了一堆规则,实际对着图表看的时候说不清楚:MACD 的每一层计算到底在做什么?为什么有时候股价还在涨,Histogram 却开始缩短了?

这篇是我回到 MACD 的数学定义,把计算过程从头跟一遍之后的笔记。MACD 全称 Moving Average Convergence Divergence(移动平均收敛发散),Gerald Appel 在 1970 年代后期提出了它的基本框架——比较两条不同周期的指数移动平均线。1986 年 Thomas Aspray 加入了 Histogram,用柱状图展示 MACD 线和信号线之间的差值。理解这些计算的结构之后,再回头看那些交易信号,确实清楚了很多。

从 SMA 到 EMA
#

在看 MACD 之前,先理清移动平均线(Moving Average)。

最直觉的是 Simple Moving Average(SMA,简单移动平均)。N 日 SMA 就是过去 N 天收盘价的算术平均:

$$ SMA_t = \frac{P_t + P_{t-1} + \cdots + P_{t-N+1}}{N} $$

SMA 的问题很明显:窗口内每一天的权重都是 \(\frac{1}{N}\),10 天前的价格和今天的价格贡献完全相同。当价格突然大幅变化时,SMA 需要好几天才能把旧数据「挤出」窗口,反应很慢。

Exponential Moving Average(EMA,指数移动平均)用一种不同的方式解决这个问题。它的递推公式是:

$$ EMA_t = \alpha \cdot P_t + (1 - \alpha) \cdot EMA_{t-1} $$

其中平滑系数:

$$ \alpha = \frac{2}{N + 1} $$

这个递推展开之后,等价于对所有历史价格做加权平均,权重是 \(\alpha,\ \alpha(1-\alpha),\ \alpha(1-\alpha)^2,\ \ldots\)。因为 \(0 \lt (1-\alpha) \lt 1\),越远的价格权重衰减得越快——EMA 天然给近期价格更高的权重。

MACD 默认使用两条 EMA:

  • EMA₁₂(快线):\(\alpha = 2/13 \approx 0.154\),权重衰减较快,对价格变化更敏感。
  • EMA₂₆(慢线):\(\alpha = 2/27 \approx 0.074\),权重衰减较慢,更平滑,对短期波动反应更迟钝。

用一个简单例子感受一下。假设某只股票的价格突然开始连续上涨——从 100 元涨到 110 元、115 元、118 元。EMA₁₂ 把更大的权重给了最近的高价,会比较快地向上移动。EMA₂₆ 因为给旧数据分配了更多的权重,抬升得更慢。两条 EMA 之间就会拉开一段距离。

反过来,如果价格突然下跌,EMA₁₂ 也会更快地掉头,而 EMA₂₆ 还在高位慢慢下移。

两条 EMA 之间的距离,就是 MACD 关心的核心。

DIF 在衡量什么
#

MACD 的第一层计算:

$$ DIF = EMA_{12} - EMA_{26} $$

DIF 就是快线减慢线,有些地方叫它 MACD Line。

DIF 的计算来源:收盘价经过两种不同速度的指数平滑,差值就是 DIF
DIF 状态含义
DIF > 0快线在慢线上方,近期价格均值高于长期价格均值
DIF < 0快线在慢线下方,近期价格均值低于长期价格均值
DIF 在上升快线相对慢线正在拉开距离,或正从下方追赶
DIF 在下降快线相对慢线正在收窄距离,或正从上方回落

到这里容易产生一个误解:觉得 DIF 就是价格的变化率。

DIF 不是价格的变化率。 它是两条不同时间尺度的 EMA 之间的有符号差值。DIF > 0 说明近期价格相对长期均值偏高,但不直接等于「价格在涨」。一个极端情况:价格连续上涨后突然停住不动,EMA₂₆ 还在向上追赶 EMA₁₂,DIF 会逐渐缩小——价格没变,DIF 却在下降。

另一个容易忽略的地方:DIF 的绝对值跟股价水平有关。200 元的股票两条 EMA 差 3 元,和 20 元的股票差 3 元,含义完全不同。原始 DIF 不适合直接跨股票比较。

为什么还要再做一次 EMA
#

有了 DIF 之后,MACD 没有直接拿它做信号,而是对 DIF 再算一次 EMA:

$$ DEA = EMA_9(DIF) $$

DEA 是 DIF 的 9 周期 EMA,有些地方叫 Signal Line(信号线)。它的角色是作为 DIF 的移动基线。

DIF 本身波动比较大——毕竟它是两条 EMA 的差,价格稍有变化 DIF 就跟着动。DEA 是 DIF 的平滑版本,相当于给了一条参考线:DIF 当前是高于自己的近期均值,还是低于自己的近期均值。

这样就有了两条线之间的交叉。

金叉(Golden Cross):DIF 从下方穿越 DEA 到上方。数学上就是 \(DIF_t \gt DEA_t\) 且 \(DIF_{t-1} \le DEA_{t-1}\)。

死叉(Death Cross):DIF 从上方穿越 DEA 到下方。

我之前一直把「金叉」和「DIF 穿越零轴」混在一起。后来才发现这是两件完全不同的事。DIF 穿越零轴意味着 EMA₁₂ 和 EMA₂₆ 交叉——短期趋势相对长期发生了翻转。而 DIF 穿越 DEA 只是 DIF 相对自己的近期均值产生了交叉,不一定伴随零轴穿越。

金叉可以发生在零轴上方(DIF 和 DEA 都为正),也可以发生在零轴下方(都为负)。位置不同,含义也有差别。

卡住我的一个地方
#

学到这里,公式和概念看起来都不复杂。接下来就是 Histogram。

$$ H_t = DIF_t - DEA_t $$

Histogram 是 DIF 和 DEA 的差值,在图上通常画成柱状图。

然后我看到了一张常见的解读表:

DIFHistogram常见解读
> 0> 0短期趋势偏强,近期动能偏强
> 0< 0短期趋势仍偏强,但近期动能减弱
< 0< 0短期趋势偏弱,近期动能偏弱
< 0> 0短期趋势仍偏弱,但近期动能改善

DIF 的正负我能理解——它反映快慢 EMA 的相对位置。但 Histogram 那一列让我觉得哪里不对。

表上说 Histogram > 0 就是「动能偏强」,< 0 就是「动能减弱」。可是动能增强或减弱,不应该看柱子的长度以及长度如何变化吗?光看正负号就够了?

比如 Histogram 连续五天都是正数,但每天都在变短——从 1.2 缩到 0.8 再缩到 0.3。按表格的分类,五天都是「动能偏强」。但柱子在缩短,不正好说明动能在减弱吗?

后来我发现,这张表混淆了三个不同层面的信息。

Histogram 的符号
#

$$ H_t \gt 0 \iff DIF_t \gt DEA_t $$

符号说的是 DIF 相对于 DEA 的位置。\(H \gt 0\) 意味着 DIF 在 DEA 上方,\(H \lt 0\) 意味着 DIF 在 DEA 下方。\(H = 0\) 就是金叉或死叉的瞬间。

符号告诉你的是一种位置关系,不是「动能正在增强」或「动能正在减弱」。

Histogram 的绝对值
#

$$ |H_t| = |DIF_t - DEA_t| $$

绝对值衡量的是 DIF 偏离 DEA 的距离——DIF 跑在 DEA 前面多远,或者落后多远。\(|H|\) 大,说明缺口大;\(|H|\) 小,说明两者靠得近。

Histogram 的变化量
#

$$ \Delta H_t = H_t - H_{t-1} $$

这才是真正反映偏离趋势的量。\(\Delta H \gt 0\) 表示 Histogram 在增长(正柱在变长,或负柱在缩短),\(\Delta H \lt 0\) 表示 Histogram 在缩小(正柱在缩短,或负柱在变长)。

用一组跟 EMA 递推一致的数值来看。DEA 使用 \(\alpha = 2/(9+1) = 0.2\),递推公式 \(DEA_t = 0.2 \times DIF_t + 0.8 \times DEA_{t-1}\)。假设 DIF 先快速上升,然后逐渐放缓:

时刻DIFDEAH = DIF − DEAΔH
t₁1.000.600.40—
t₂1.500.780.72+0.32
t₃2.201.061.14+0.42
t₄2.401.331.07−0.07
t₅2.301.520.78−0.29
t₆2.101.640.46−0.32

表中 DEA 的值可以用递推公式验证。比如 \(DEA_{t_2} = 0.2 \times 1.50 + 0.8 \times 0.60 = 0.78\),\(DEA_{t_3} = 0.2 \times 2.20 + 0.8 \times 0.78 = 1.064 \approx 1.06\)。数值四舍五入到两位小数。

这组数字里,DIF 从 t₁ 到 t₆ 始终为正——短期趋势一直在长期趋势上方。Histogram 也始终为正——DIF 一直高于 DEA。按四象限表的分类,六个时刻全部落在「短期趋势偏强,近期动能偏强」。

但 ΔH 讲了一个不同的故事。t₁ 到 t₃,ΔH 为正,柱子在变长。从 t₄ 开始,ΔH 转负,柱子开始缩短。仅看符号会把六个时刻归为同一类,但实际上 t₄ 之后 DIF 的上升已经在放缓,DEA 在追赶 DIF,两者之间的缺口在收窄。

Histogram 的四种变化模式:正柱变长、正柱缩短、负柱变长、负柱缩短

所以更精确的解读需要区分三层:

维度回答的问题
符号 sgn(H)DIF 在 DEA 上方还是下方?
绝对值 \(\|H\|\)DIF 偏离 DEA 有多远?
变化量 ΔH这个偏离在扩大还是收缩?

回到那张四象限表。它把 DIF 的符号和 Histogram 的符号放在一起,确实给出了四种组合。但如果到此为止,结论只停留在「符号」这一层——说「Histogram > 0 就是动能偏强」,省略了长度和变化方向的信息。

这里顺带提一个容易混淆的地方。「柱子长度」和「连续多根柱子的累计面积」不是一个概念。单根柱子的长度是 \(|H_t|\),累计面积是连续多根柱子的绝对值之和(或带符号的面积)。有人用「红柱面积大于绿柱面积」来判断一段时间的趋势强弱,这和看单根柱子的长度变化是不同的分析维度。

还有一种容易让人困惑的组合:DIF < 0,但 Histogram > 0。

这完全可能。假设 \(DIF = -1.0\),\(DEA = -1.5\),那 \(H = -1.0 - (-1.5) = 0.5 \gt 0\)。DIF 是负的——快线还在慢线下方,整体趋势偏弱。但 Histogram 是正的——DIF 在往上走,超过了自己的平滑基线 DEA。虽然趋势还没有翻转(DIF 没有穿过零轴),但下行的速度在放缓,DIF 正在向零轴靠近。

Histogram 的正负反映的是 DIF 相对自己均线的位置,不是整体趋势的方向。整体趋势的方向要看 DIF 与零轴的关系。

另外提一下:很多国内行情软件显示的 MACD 柱状图,用的公式是 \(MACD柱 = 2 \times (DIF - DEA)\),和国际标准定义差一个常数因子 2。这不影响符号和变化方向的判断,但看绝对数值时需要注意来源。

价格还在涨,Histogram 怎么缩了
#

理解了 Histogram 的三层含义之后,之前困扰我的那个问题就有了答案。

想象一辆车从静止开始加速。速度在增大,加速度是正的。然后加速度开始减小——从 10 m/s² 降到 5 m/s²——速度还在增加,但增加得越来越慢了。最终加速度降到 0 时,速度达到峰值。

MACD 的逻辑有类似的层次感:

  • 价格本身对应位置。
  • DIF 有点像「平滑后的趋势速度」。
  • Histogram 有点像「趋势速度的变化趋势」。

但这个类比需要严格划界。

DIF 不是价格的一阶导数。 导数是对时间做极限运算,DIF 是两条有限窗口 EMA 的差。直觉类似,数学上不是同一个东西。

Histogram 不是价格的二阶导数。 同理,\(\Delta H\) 也不是未来价格加速度的预测值。

类比用来建立直觉是可以的,拿来做严格推理就不行了。

理解了这一层,「价格创新高但 MACD 下降」就不奇怪了。

假设价格在过去几个月持续上涨。最初涨幅很大,EMA₁₂ 和 EMA₂₆ 的差距拉大,DIF 上升。后来价格涨幅变小——没有下跌,只是涨得更慢了——EMA₂₆ 开始追赶 EMA₁₂,DIF 停止上升甚至回落。价格还在创新高,DIF 却形成了一个更低的高点。

这就是 Bearish Divergence(顶背离):价格创新高,但 DIF 或 Histogram 没有同步创新高。

反方向的情况叫 Bullish Divergence(底背离):价格创新低,但 DIF 或 Histogram 没有同步创新低。

背离经常被解读为趋势即将反转的预警。但有一点必须说清楚:背离只是说价格走势和动能指标没有相互确认,不等于趋势一定会反转。 实际市场中,背离之后趋势继续延伸了很长时间的情况并不少见。背离提供的是一个值得关注的信号,不是一个可以直接执行的交易指令。

从滤波器的角度回头看
#

写到这里,我试着从信号处理的角度重新理解整个计算过程。这部分跟我以前的工程背景有点关系。

EMA 的递推公式 \(y_t = \alpha \cdot x_t + (1-\alpha) \cdot y_{t-1}\) 在信号处理里是一个典型的一阶 IIR 低通滤波器(Infinite Impulse Response Low-Pass Filter)。它抑制输入信号中的高频成分,保留低频趋势——把价格的短期波动磨平。

\(\alpha\) 越小,截止频率越低,滤掉的高频越多,输出越平滑。EMA₂₆ 的 \(\alpha \approx 0.074\) 比 EMA₁₂ 的 \(\alpha \approx 0.154\) 更小,滤掉了更多的短期波动。

DIF = EMA₁₂ − EMA₂₆,是两个不同截止频率的低通滤波结果之差。在信号处理中,两个低通滤波器的差具有带通特性——保留了被 EMA₁₂ 通过但被 EMA₂₆ 抑制的那部分频率成分。直觉上说,DIF 突出的是发生在两个 EMA 周期之间那个时间尺度上的价格变化。

DEA 是对 DIF 再做一次低通滤波。Histogram = DIF − DEA 是 DIF 减去自身的平滑版本,相当于提取 DIF 的变化速度。

这样看下来,MACD 整体是一个两层结构:

  1. 第一层差分:两条不同截止频率的低通滤波结果相减 → DIF
  2. 第二层差分:DIF 减去自身的低通滤波结果 → Histogram
MACD 的信号处理视角:两层低通滤波与差分

每一层都是「当前值 − 平滑值」的操作,在不同时间尺度上强调变化。

这里有一件容易滑过去的事情。

MACD 没有引入任何独立于价格之外的新信息。 它的全部输入是历史收盘价,全部操作是确定性的加权平均与差值。它不能消除滞后性(因为 EMA 本身就是对历史数据的加权),也不可能凭指标预测未来价格。

MACD 做的事情更像是把价格时间序列投影到一个特定的「透镜」上——这个透镜突出了中等时间尺度上的趋势变化,滤掉了更短期的噪声和更长期的缓慢漂移。但透镜不会凭空创造画面中没有的东西。

MACD 怎么用
#

虽然这篇不是交易教程,但既然理解了数学,简单整理一下 MACD 在日线级别 Swing Trading 中常见的几种用法。

零轴:DIF 穿越零轴意味着快慢 EMA 交叉。DIF 从负转正,短期趋势相对长期趋势开始偏强。

金叉与死叉:DIF 上穿 DEA 是金叉,下穿是死叉。零轴上方的金叉通常比零轴下方的被认为更有意义——因为前者发生在整体趋势偏强的背景下。

Histogram 的变化:正柱开始缩短,可能意味着上行动能在减弱,即使趋势还没有反转。负柱开始缩短,可能意味着下行动能在减弱。

背离:价格创新高但 DIF 或 Histogram 没有同步创新高(顶背离),或价格创新低但指标没有同步创新低(底背离)。

这些信号可以辅助分析一些场景。Breakout + Retest 之后,Histogram 的变化能帮助判断突破后的动能是否持续。Double Bottom 形态中,可以观察是否伴随底背离。长时间上涨之后,正柱持续缩短可能是动能衰竭的早期迹象。

但每一个信号都有严格的边界。

金叉不等于买入。 震荡行情中 DIF 和 DEA 反复交叉,每次都跟着交易只会反复止损。

死叉不等于做空。 强势上涨中的回调也会产生死叉。

背离不等于马上反转。 一个背离可以持续很长时间,趋势在背离中继续延伸的情况不少。

MACD 是趋势跟踪和动能分析工具,不是独立的交易系统。价格结构、成交量和基本面信息同样重要。

MACD 不能做什么
#

MACD 的局限性直接来自它的构造方式。

滞后。 EMA 本质是加权历史均值。当价格已经转向时,EMA 还需要若干周期才能反映变化。MACD 的所有信号——金叉、死叉、Histogram 转向——都不可避免地比价格变化本身迟一步。

震荡行情中的 Whipsaw。 价格在一个区间内反复波动、没有明确趋势时,DIF 和 DEA 会反复交叉,产生大量噪声信号。这种环境下 MACD 几乎没有可操作的价值。

不包含基本面信息。 MACD 只看价格,不看盈利、现金流、行业竞争格局。一只公司出现了严重基本面问题的股票,MACD 不会提前告诉你。

参数 12、26、9 不是被证明全局最优的参数。 这组参数是 Appel 最初选定的,在很多市场和时间框架上表现不错,但没有理论证明它们在所有情况下都最优。有些交易者会根据标的特性和交易周期调整参数。

原始 MACD 不适合跨股票比较。 200 元股票的 DIF = 3 和 20 元股票的 DIF = 3 含义完全不同。如果需要跨标的比较,可以看 PPO(Percentage Price Oscillator),它用百分比表达 EMA 之间的差距:

$$ PPO = \frac{EMA_{12} - EMA_{26}}{EMA_{26}} \times 100\% $$

PPO 标准化了价格水平的影响,但这篇不再展开。

写在最后
#

回到最初的困惑。

MACD 的整个计算过程,是对历史收盘价做两层平滑和差分。第一层用两条不同周期的 EMA 之差(DIF)提取中等时间尺度的趋势偏离;第二层对 DIF 再平滑一次得到 DEA,然后用 DIF 减 DEA 得到 Histogram。

Histogram 的正负、长度和变化方向,回答的是三个不同的问题。只看正负号就说「动能强」或「动能弱」,丢掉了长度和变化方向的信息。这也是我对那张四象限表最初觉得不对劲的原因。

这次学下来,我觉得最值得记住的有两点。

MACD 是不同时间尺度上的平滑和差分,不是一个神秘的预测公式。 它的全部输入是历史价格,全部操作是确定性的加权与差值。理解了这一点,就不会期望它做到超出能力范围的事情。

判断当前市场状态,和判断市场状态如何变化,是两件不同的事情。 DIF > 0 说明短期趋势偏强,但不说明偏强的程度在增加还是减少。Histogram > 0 说明 DIF 在 DEA 上方,但不说明两者之间的距离在扩大还是收缩。要回答「变化」的问题,需要看 ΔH,而不仅仅是当前值的符号。

这也解释了为什么价格还在涨、Histogram 却在缩短——涨的速度在放慢,指标比价格本身更早地反映了这种减速。

参考资料
#

Related

从成交量到资金净流入:重新理解股票价格是如何形成的

之前写量化交易系统那篇时提到过 execution 层——每笔 order 多大、对手盘的流动性够不够、是挂盘口还是主动吃价差。当时一笔带过,没有认真想 order book 这一层到底怎么运转。 最近第一次认真看市场微观结构(market microstructure)的一些材料,想搞清楚几个一直模模糊糊的问题。结果发现,不是模糊,是错的。

量化交易不是一个模型:从 Alpha 到执行的完整系统框架

读书时记下的一张系统图 # 2024 年我读过 Rishi K. Narang 的《打开量化投资的黑箱》(Inside the Black Box)。书里把一个典型的量化交易系统拆成几个组成部分——Alpha Model、Risk Model、Transaction Cost Model、Portfolio Construction Model、Execution Model,底下还有 Data 和 Research。

市盈率为什么不等于“多少年回本”?

整理金融基础笔记时,我想弄清楚一句常见说法:20 倍 PE,是否就意味着买进去 20 年回本?按定义算出的倍数,和股东实际收到现金的时间,中间隔着哪些条件? 从一套房子说起 # 一套房子 200 万元,每年租金收入 10 万元,价格是年租金的 20 倍。如果直接用价格除以租金,就会得到“20 年回本”。

夏普比率到底衡量了什么?

整理完风险指标,再看夏普比率时,我关注的是公式里的两个选择:为什么分子减去无风险收益率,分母又为什么选波动率?“收益除以风险”这句简称,把这两件事省掉了。 收益更高,所以更好吗 # 先看两个简化到只剩数字的策略。为了把注意力放在比较上,先假设这段时间的无风险收益率近似为 0,收益和超额收益暂时是同一个数:

风险也不是一个数字:波动率、最大回撤和 VaR 到底在衡量什么?

在收益率那篇里,同样赚了 10%,可能来自完全不同的路径。要继续比较,就得知道风险指标各自省略了什么。 这次复习时,我把波动率、最大回撤和 VaR 放在一起看:它们分别描述收益的不稳定程度、历史上的峰谷跌幅,以及给定概率下的损失阈值。用哪一个,取决于想回答什么问题。