ADX 是如何计算的?
直接答案:ADX 的计算流程
ADX(平均趋向指数)是通过价格变动逐层构建的:(1)计算每个周期的方向性移动和真实波幅,(2)对这些序列进行平滑处理,(3)计算方向性指标(+DI 和 −DI),(4)根据它们的关系计算 DX,(5)对 DX 进行平滑处理得到 ADX。
一个常见且标准的定义使用回溯周期长度,通常记为 n(通常为 14,但该方法支持其他值)。ADX 的数值取决于所选的 n 值以及实现中使用的平滑规则。
机制:定义与逐步公式
为了在不假设实时数据的情况下描述计算过程,假设你有一系列按时间排序的 K线/柱状图。对于每个柱 t,你需要它的 最高价、最低价 和 收盘价(或至少是如下定义的最高价/最低价/收盘价)。
1) 计算真实波幅(TR)
真实波幅捕捉了价格变动的幅度,包括跳空。对于柱 t 相对于 t−1:
- TR(t) = max( High(t) − Low(t), |High(t) − Close(t−1)|, |Low(t) − Close(t−1)| )
此定义使得当当前范围较宽或价格相对于前一个收盘价出现跳空时,TR 值更大。
2) 计算方向性移动:+DM 和 −DM
方向性移动将上涨和下跌分开:
- UpMove(t) = High(t) − High(t−1)
- DownMove(t) = Low(t−1) − Low(t)
一个典型规则是:
- +DM(t) = 如果 UpMove(t) > DownMove(t) 且 UpMove(t) > 0,则为 UpMove(t),否则为 0
- −DM(t) = 如果 DownMove(t) > UpMove(t) 且 DownMove(t) > 0,则为 DownMove(t),否则为 0
这种“非此即彼”结构确保每一步只让主导方向贡献。
3) 对 TR、+DM 和 −DM 进行平滑
ADX 并非直接从原始 TR 和 DM 计算得出,而是使用平滑步骤。许多实现使用韦尔德式平滑(一种常见方法),这相当于一种特定的递归移动平均。
设 SmoothedTR(t) 为平滑后的 TR,同理 Smoothed+DM(t) 和 Smoothed−DM(t)。
对于周期 n 的韦尔德式平滑,递归公式通常如下:
- SmoothedTR(t) = SmoothedTR(t−1) − (SmoothedTR(t−1) / n) + TR(t)
- Smoothed+DM(t) = Smoothed+DM(t−1) − (Smoothed+DM(t−1) / n) + +DM(t)
- Smoothed−DM(t) = Smoothed−DM(t−1) − (Smoothed−DM(t−1) / n) + −DM(t)
初始化很重要:实现通常在积累足够柱数以建立初始总和或 n 周期平均值后才开始平滑序列。
4) 计算 +DI 和 −DI
方向性指标将平滑后的方向性移动转换为相对于平滑 TR 的值:
- +DI(t) = 100 × Smoothed+DM(t) / SmoothedTR(t)
- −DI(t) = 100 × Smoothed−DM(t) / SmoothedTR(t)
5) 计算 DX(方向性指数)
DX 描述了一个方向对另一个方向的主导程度:
- DX(t) = 100 × |+DI(t) − −DI(t)| / (+DI(t) + −DI(t))
如果 +DI(t) + −DI(t) 为零(在横盘或无方向移动及某些数据/起始条件下可能发生),实现必须处理除零问题。
6) 对 DX 进行平滑以得到 ADX
最后,ADX 是 DX 在周期 n 上的平滑移动平均(再次通常为韦尔德式):
- ADX(t) = 在选定长度 n 上对 DX(t) 的平滑平均值
在实践中,第一个 ADX 值是在一个预热期后产生的(通常是在积累足够多的 DX 点之后)。不同平台可能选择略有不同的初始化约定,这会导致微小差异。
通过小规模示例验证(含明确假设)
没有实时数据时,完整的数值示例将是任意的。相反,这里提供一个紧凑的 计算模板,你可以将其应用于自己的 OHLC 柱。
假设你有连续的柱,并选择了一个周期 n。从第二个柱开始(因为需要 t−1):
- 使用 High(t)、Low(t) 和 Close(t−1) 计算 TR(t)。
- 使用高低价差计算 +DM(t) 和 −DM(t)。
- 使用所选平滑规则和正确初始化构建平滑值 SmoothedTR(t)、Smoothed+DM(t)、Smoothed−DM(t)。
- 计算 +DI(t) 和 −DI(t)。
- 计算 DX(t)。
- 对 DX(t) 进行平滑以形成 ADX(t)。
独立验证时必须明确的假设:你的数据源(确切的 OHLC 值)、你选择的 n 以及 你的平滑规则 必须与你要检查的实现一致。即使公式“标准”,预热和平滑细节也可能不同。
如果你想确认两个系统是否计算出相同的 ADX,请导出相同的 OHLC 序列,使用相同的 n,使用相同的 TR/DM 定义,并在比较最终 ADX 之前验证中间序列(+DM/−DM、+DI/−DI、DX)。
需要注意的局限性和失效模式
ADX 常被描述为“趋势强度”指标,但这种解释有其局限性。主要问题来自数据敏感性和方向性移动的行为方式。
1) ADX 依赖于平滑和初始化
由于 ADX 使用平滑后的 TR/DM 和平滑后的 DX,结果可能在以下情况下发生变化:
- 你更改 n,
- 你更改平滑方法(或初始化约定),或
- 你的平台以不同方式处理边缘情况(例如早期柱、除零)。
这是跨平台比较数值时的关键失效模式。
2) 高值并不保证方向优势
ADX 是根据方向性主导的幅度计算的,而不是根据确定的方向。即使整体环境后来发生变化,只要一个方向持续主导,ADX 也可能相对较高。
这很重要,因为方向性移动的后续变化可能使之前的 ADX 行为信息量减少。
3) 震荡或区间行情可能产生误导性的强度读数
方向性移动的定义仍可能在小而不规则的波动中产生重复的主导。在某些“横向但波动”的条件下,ADX 可能上升,即使没有持续稳定的趋势结构。
这意味着 ADX 最好被视为衡量价格变动特征的指标,而不是独立的决策规则。
验证:如何独立检查你的 ADX 计算
要使用上述公式链自行验证 ADX 计算:
- 选择一个特定的 n 并记录下来。
- 使用一个一致的 OHLC 数据集,并确认你有按时间对齐的 最高价、最低价、收盘价。
- 使用相同的条件逻辑精确计算 TR、+DM 和 −DM。
- 应用与参考一致的相同平滑规则和初始化。
- 计算 +DI、−DI、DX,然后将 DX 平滑为 ADX。
- 先比较中间输出;如果这些匹配,最终 ADX 极有可能一致。