ADX指标详解:平均趋向指数如何衡量趋势强度

  1. iTick
  2. 技术分析
ADX指标详解:平均趋向指数如何衡量趋势强度 - iTick
ADX指标详解:平均趋向指数如何衡量趋势强度

ADX指标详解:平均趋向指数如何衡量趋势强度

大多数指标告诉你市场往哪个方向走,而 ADX(Average Directional Index,平均趋向指数) 回答的是另一个往往更有用的问题:趋势有多强? ADX 由 J. Welles Wilder 于 1978 年提出,帮助交易者判断何时使用趋势跟踪策略、何时远离震荡行情。

ADX 衡量什么

ADX 属于 Wilder 的 趋向指标系统(DMI),包含三条线:

  • +DI(正向指标): 上涨力量
  • -DI(负向指标): 下跌力量
  • ADX: +DI 与 -DI 差值的平滑平均,表示趋势强度,与方向无关

ADX 取值 0–100,不表示方向——ADX 上升既可能是上涨趋势增强,也可能是下跌趋势增强。方向请看 +DI 与 -DI。

ADX 数值解读

ADX含义
20 以下趋势弱或无趋势,区间震荡
20 – 25趋势可能开始形成
25 – 40趋势确立
40 – 50强趋势
50 以上极强趋势,可能过度延伸

这些阈值只是参考。许多交易者把 ADX > 25 作为使用趋势策略的最低条件。

ADX 计算步骤(周期 N = 14)

  1. 方向变动:
    • +DM = 今日最高 − 昨日最高(为正且大于 −DM 时取值,否则为 0)
    • −DM = 昨日最低 − 今日最低(为正且大于 +DM 时取值,否则为 0)
  2. 真实波幅 TR = max(最高 − 最低, |最高 − 昨收|, |最低 − 昨收|)
  3. 用 Wilder 平滑(α = 1/N 的指数平均)对 +DM、−DM、TR 做 N 周期平滑。
  4. 方向指标:
    • +DI = 100 × 平滑(+DM) / 平滑(TR)
    • −DI = 100 × 平滑(−DM) / 平滑(TR)
  5. DX = 100 × |+DI − −DI| / (+DI + −DI)
  6. ADX = DX 的 N 周期 Wilder 平滑值

ADX 交易策略

1. 趋势过滤: 仅在 ADX 高于 25 时采用均线或突破信号,可过滤掉大量震荡期假信号。

2. DI 交叉: ADX 升至 20–25 以上时,+DI 上穿 −DI 为潜在做多信号,反之为做空信号。

3. 震荡策略切换: ADX 低于 20 时,从趋势跟踪切换到 RSI、KDJ 指标 等均值回归工具。

4. 趋势衰竭: ADX 从 40–50 以上拐头向下,通常意味着趋势动能减弱——应收紧止损,而不是自动反手。

用 Python 计算 ADX

      import requests
import pandas as pd

TOKEN = "YOUR_API_TOKEN"
url = "https://api.itick.org/stock/kline"
params = {"region": "US", "code": "NVDA", "kType": 8, "limit": 400}
headers = {"accept": "application/json", "token": TOKEN}
df = pd.DataFrame(requests.get(url, params=params, headers=headers, timeout=10).json()["data"])
df = df.rename(columns={"h": "high", "l": "low", "c": "close"}).astype({"high": float, "low": float, "close": float})

def adx(df, n=14):
    up = df["high"].diff()
    down = -df["low"].diff()
    plus_dm = up.where((up > down) & (up > 0), 0.0)
    minus_dm = down.where((down > up) & (down > 0), 0.0)
    prev_close = df["close"].shift()
    tr = pd.concat([df["high"] - df["low"],
                    (df["high"] - prev_close).abs(),
                    (df["low"] - prev_close).abs()], axis=1).max(axis=1)
    wilder = lambda s: s.ewm(alpha=1 / n, adjust=False).mean()
    atr = wilder(tr)
    plus_di = 100 * wilder(plus_dm) / atr
    minus_di = 100 * wilder(minus_dm) / atr
    dx = 100 * (plus_di - minus_di).abs() / (plus_di + minus_di)
    return plus_di, minus_di, wilder(dx)

df["+di"], df["-di"], df["adx"] = adx(df)
df["trend"] = (df["adx"] > 25) & (df["+di"] > df["-di"])
print(df[["close", "+di", "-di", "adx", "trend"]].tail())

    

OHLC 数据来自 iTick 历史行情数据API,同一函数可用于外汇、黄金、指数和加密货币。

ADX 的局限

  • 经过多层平滑,属于滞后指标。
  • 单独使用无法判断方向。
  • 行情快速反转时,价格已转向而 ADX 可能仍处高位。

请把 ADX 当作提升其他信号质量的过滤器,而非独立交易系统。

常见问题

ADX 多少算好? 一般高于 25 表示存在可交易趋势,低于 20 表示区间震荡。

ADX 用什么周期? Wilder 原始的 14 周期是标准设置,周期越短反应越快但噪音越大。

ADX 是领先还是滞后指标? 滞后指标——它在趋势开始后确认趋势强度。

用可靠数据驱动你的指标

准确的最高价、最低价和收盘价是计算真实波幅与 ADX 的基础。免费获取 iTick API Key,获取全球股票、外汇、期货与加密货币 OHLCV 数据。