最近一直在学美股的技术分析。前面接触了 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 > 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 的差值,在图上通常画成柱状图。
然后我看到了一张常见的解读表:
| DIF | Histogram | 常见解读 |
|---|---|---|
| > 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 先快速上升,然后逐渐放缓:
| 时刻 | DIF | DEA | H = DIF − DEA | ΔH |
|---|---|---|---|---|
| t₁ | 1.00 | 0.60 | 0.40 | — |
| t₂ | 1.50 | 0.78 | 0.72 | +0.32 |
| t₃ | 2.20 | 1.06 | 1.14 | +0.42 |
| t₄ | 2.40 | 1.33 | 1.07 | −0.07 |
| t₅ | 2.30 | 1.52 | 0.78 | −0.29 |
| t₆ | 2.10 | 1.64 | 0.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,两者之间的缺口在收窄。
所以更精确的解读需要区分三层:
| 维度 | 回答的问题 |
|---|---|
| 符号 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 整体是一个两层结构:
- 第一层差分:两条不同截止频率的低通滤波结果相减 → DIF
- 第二层差分:DIF 减去自身的低通滤波结果 → Histogram
每一层都是「当前值 − 平滑值」的操作,在不同时间尺度上强调变化。
这里有一件容易滑过去的事情。
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 却在缩短——涨的速度在放慢,指标比价格本身更早地反映了这种减速。
参考资料#
- Gerald Appel, Technical Analysis: Power Tools for Active Investors, FT Press, 2005
- Thomas Aspray, “MACD Histogram”, Technical Analysis of Stocks & Commodities, 1986
- StockCharts.com — MACD (Moving Average Convergence/Divergence Oscillator): https://school.stockcharts.com/doku.php?id=technical_indicators:moving_average_convergence_divergence_macd