MACD 是如何计算的:公式、参数和所需数据
在计算之前先了解 MACD 是什么
MACD 是“移动平均收敛发散”(Moving Average Convergence Divergence)的缩写。它不是某个时间点上的单一价格数值,而是通过对价格序列的移动平均值进行组合而生成的一种衍生时间序列。
MACD 通常由以下部分定义:
- 同一基础价格序列(最常见的是收盘价)的两个移动平均值:“快”平均线和“慢”平均线。
- 一个由两者差值构成的衍生序列(即 MACD 线)。
- 对 MACD 线进行平滑处理后得到的平均值(即信号线)。
- 可选的直方图,用于显示 MACD 与其信号线之间的差距。
由于 MACD 是基于历史数据推导得出的,因此其计算需要一组一致的历史价格数据以及统一的移动平均计算规则。
核心公式(计算机制)
要计算 MACD,你需要一个价格序列 (P_t)(例如每个周期的收盘价),其中 (t=1,2,\dots)。然后你计算两个指数移动平均(EMA),通常称为:
- 周期为 (n_{fast}) 的 EMA_fast
- 周期为 (n_{slow}) 的 EMA_slow
常用的 EMA 递推公式为: [ \text{EMA}t(n) = \alpha \cdot P_t + (1-\alpha) \cdot \text{EMA}{t-1}(n) ] 其中平滑因子为 [ \alpha = \frac{2}{n+1} ]
第一步:计算 MACD 线
[ \text{MACD}_t = \text{EMA}t(n{fast}) - \text{EMA}t(n{slow}) ]
这个减法操作体现了“收敛/发散”的含义:当快 EMA 高于慢 EMA 时,差值为正;当低于时,差值为负。
第二步:计算信号线
接下来,使用另一个周期为 (n_{signal}) 的 EMA 对 MACD 线进行平滑处理: [ \text{Signal}_t = \text{EMA}t(\text{MACD}(n), n{signal}) ] 以递推形式表示为: [ \text{Signal}t = \beta \cdot \text{MACD}t + (1-\beta) \cdot \text{Signal}{t-1} ] 其中 [ \beta = \frac{2}{n{signal}+1} ]
第三步(可选):计算直方图
直方图通常定义为 MACD 线与信号线之间的差值: [ \text{Histogram}_t = \text{MACD}_t - \text{Signal}_t ]
该直方图有助于更直观地观察 MACD 是高于还是低于其平滑后的参考线。
参数和数据要求(你需要决定的内容)
要正确复现 MACD,必须明确每个输入参数和计算惯例。
1) 价格序列定义
- (P_t) 使用哪种价格:收盘价、典型价格,或其他字段。
- 时间步长:日线、小时线等。
即使公式相同,选择不同的 (P_t) 也会导致最终指标结果不同。
2) 周期长度
你需要选择:
- (n_{fast}):快 EMA 的周期
- (n_{slow}):慢 EMA 的周期
- (n_{signal}):信号 EMA 的周期
一个关键的实际要求是:你必须有足够的历史数据来一致地初始化 EMA。不同软件在初始化 EMA 时可能略有差异,尤其是在序列开始阶段。
3) EMA 初始化
EMA 递推需要一个初始值(例如,第一个 EMA 值可能设为第一个观测价格,或使用初始窗口的简单平均值)。你的选择会影响早期的 MACD 值。
如果你比较两个图表工具,即使它们使用相同的可见参数,也可能在起始阶段看到微小差异。
4) 所有步骤的一致性
一旦你确定了:
- 价格序列 (P_t)
- EMA 定义
- 参数周期长度 那么在计算 MACD 线以及将其平滑为信号线时,应使用相同的计算惯例。
实证或示例:一个简单的自我验证计算
以下是一个你可以用任意数据集进行验证的完整示例结构。(未提供具体数值,因为结果取决于你的输入序列和初始化方式。)
假设你有一个历史价格序列 (P_1, P_2, \dots)。
- 选择周期 (n_{fast})、(n_{slow}) 和 (n_{signal})。
- 计算 (\alpha = \frac{2}{n_{fast}+1}),并逐期计算 (\text{EMA}t(n{fast}))。
- 计算 (\alpha_{slow} = \frac{2}{n_{slow}+1}),并逐期计算 (\text{EMA}t(n{slow}))。
- 对每个 (t),设定: [ \text{MACD}_t = \text{EMA}t(n{fast}) - \text{EMA}t(n{slow})。 ]
- 选择 (\beta = \frac{2}{n_{signal}+1}),并计算: [ \text{Signal}_t = \beta \cdot \text{MACD}t + (1-\beta)\cdot \text{Signal}{t-1}。 ]
- 可选地计算: [ \text{Histogram}_t = \text{MACD}_t - \text{Signal}_t。 ]
一个可快速测试的实质性局限
由于 EMA 对近期数据赋予更高权重,MACD 通常会滞后于价格的快速变化,并可能在价格变动已经发生后才改变符号。你可以通过以下方式测试这一点:
- 使用一段价格急剧跳升的数据,
- 观察需要多少周期后 (\text{MACD}_t) 才能显著反映新水平。
这种滞后是平滑处理的固有特性,而非“预测”能力的缺失。
局限性和失效模式(可能出现的问题)
一旦计算惯例固定,MACD 的计算在机械上是明确定义的,但在实际应用中仍可能产生误导。主要局限包括:
1) 初始化和早期序列差异
如果不同工具使用不同的 EMA 起始规则,早期的 MACD 和信号线值可能会不同。
失效模式:在比较不同平台或导出数据时,发现 MACD 值不一致。
2) 参数敏感性
改变 (n_{fast})、(n_{slow}) 或 (n_{signal}) 会影响指标行为:
- 较短周期反应更快,但对噪声更敏感
- 较长周期更平滑,但响应更慢
失效模式:在一组参数下理解的信号,在另一组参数下可能不再适用。
3) 价格输入选择
如果你为 (P_t) 使用不同的价格字段,整个指标都会改变。
失效模式:“相同的 MACD 设置”但因价格定义不同而产生不同的曲线。
4) 对衍生线的误解
MACD 是移动平均的输出结果,它并不直接衡量未来价格。
失效模式:将 MACD 特征视为独立确定信号,而不是价格的历史变换结果。
5) 市场状态影响(震荡 vs 趋势)
在波动剧烈、盘整的市场中,移动平均线可能反复收敛和发散,导致 MACD 在信号线周围频繁震荡。
失效模式:由于平滑过程反复响应交替的短期波动,可能出现看似矛盾的读数。
验证与下一步问题
要独立验证你自己的 MACD 计算:
- 确认你的 (P_t) 定义和时间步长。
- 使用标准 EMA 递推公式 (\alpha = \frac{2}{n+1}) 和你选择的初始化方法。
- 计算 (\text{MACD}_t = \text{EMA}t(n{fast}) - \text{EMA}t(n{slow}))。