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)
- 方向變動:
- +DM = 今日最高 − 昨日最高(為正且大於 −DM 時取值,否則為 0)
- −DM = 昨日最低 − 今日最低(為正且大於 +DM 時取值,否則為 0)
- 真實波幅 TR = max(最高 − 最低, |最高 − 昨收|, |最低 − 昨收|)
- 用 Wilder 平滑(α = 1/N 的指數平均)對 +DM、−DM、TR 做 N 週期平滑。
- 方向指標:
- +DI = 100 × 平滑(+DM) / 平滑(TR)
- −DI = 100 × 平滑(−DM) / 平滑(TR)
- DX = 100 × |+DI − −DI| / (+DI + −DI)
- 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 數據。