ADX / DMI(平均方向性指数)
ADX / DMI は、相場にトレンドが出ているか、出ているならどちらの方向か、その強度はどれくらいかを分けて数値化する指標群です。レンジ相場とトレンド相場でエントリー戦略を切り替えるためのレジーム判定軸として使います。単体のシグナルではなく、上位足の ADX と下位足のセットアップを組み合わせるのが実践的です。

架空データによるイメージ図(実際の相場データではありません)。下段が +DI、-DI、ADX。トレンド期に ADX が 25 を超え、レンジで低下する例。
定義
DMI(Directional Movement Index)は J. Welles Wilder Jr. が1978年の New Concepts in Technical Trading Systems で発表した指標群です。方向性の有無(+DM / -DM)、方向性の強度(+DI / -DI)、方向性の総合強度(ADX)の3段階で構成されます。
Directional Movement(+DM / -DM)
前日比の高値差、安値差から、当日の方向性ムーブを取り出します。
- +DM:UpMove(ただし UpMove > DownMove かつ UpMove > 0 のとき)、それ以外は 0
- -DM:DownMove(ただし DownMove > UpMove かつ DownMove > 0 のとき)、それ以外は 0
インサイドバー( かつ )では +DM も -DM も 0 になります。両方が正になることはありません(排他条件)。
True Range(TR)
Wilder は TR を DMI の分母に使います。定義は ATR と同じです。
Wilder 平均(平滑化)
Wilder の平滑は の EMA と数学的に等価です。
初期値は最初の 個の単純合計(または算術平均)を使います。pandas の ewm(alpha=1/n, adjust=False) が最も近い挙動です。
Directional Indicator(+DI / -DI)
+DI と -DI はそれぞれ 0 から 100 の範囲を取り、上下方向のムーブがどれだけ強いかを表します。
Directional Index(DX)
DX は方向を持ちません(上下 DI の乖離度)。片側 DI が支配的な期間ほど DX は高くなります。
Average Directional Index(ADX)
DX を Wilder 平均で平滑した値が ADX です。ADX が本来の目的関数になります。
- ADX は 0 から 100
- 方向を持たない(上下どちらのトレンドでも高くなる)
- ADX の「レベル」と「傾き」を別々に読む
パラメータと期間
| パラメータ | 標準 | 意味 |
|---|---|---|
n | 14 | Wilder 平均の期間(+DM / -DM / TR / DX すべて) |
| 平均法 | Wilder | pandas では ewm(alpha=1/n, adjust=False) |
| 価格 | H/L/C | 高値、安値、終値。始値は使わない |
Wilder の原典設定(14)は今も業界標準です。派生として次を使うこともありますが、意識される値の主流は 14 です。
| 時間足 | ADX 期間 | 主な用途 |
|---|---|---|
| 5分 | 14 | 短期ブレイク後の追随判定(東京仲値通過後の 5〜15 分) |
| 15分 | 14 | デイトレのレジーム判定(レンジ / トレンド切り分け) |
| 1時間 | 14 | 当日方向の骨格。上位足フィルタとして |
| 4時間 | 14 | スイング環境のトレンド強度 |
| 日足 | 14 | 週次以上の方向感 |
シグナル
ADX 閾値
Wilder 原典と現代実務での使い分けです。
| ADX 帯 | 状態 | 実務判断 |
|---|---|---|
| < 20 | レンジ | 逆張り優位。トレンドフォロー系は待機 |
| 20〜25 | 移行期 | エントリー保留。方向確定待ち |
| 25〜40 | 明確なトレンド | トレンドフォロー最適。押し目、戻り目狙い |
| > 40 | 強トレンド | 追随可だが過熱、巻き戻し警戒 |
| > 50〜60 | 過熱 | 逆張りではなく利確、追随の縮小 |
Wilder 自身は「ADX > 25 = trending」を提唱しましたが、通貨ペアと時間足で閾値は変わります。USD/JPY 日足では ADX が 30 を超える局面は年に数回程度です。
+DI / -DI クロス
+DI が -DI を上抜けたら買い、下抜けたら売り、というのが古典的な使い方です。ただし単体では騙しが多くなります。
- +DI > -DI かつ ADX 上昇:上方向のトレンド発生、継続
- -DI > +DI かつ ADX 上昇:下方向のトレンド発生、継続
- +DI が -DI をクロスするだけで ADX 低位(< 20)なら騙し多発
ADX の傾き
レベル以上に傾きが重要です。
- ADX 上昇かつ高い水準:トレンド継続
- ADX 下降かつ高い水準からの下落:トレンド終盤、巻き戻し
- ADX 低位横ばい:レンジ継続
- ADX 低位からの上昇初動:ブレイク候補
極端値からの反転
ADX が 40〜50 の高値圏から明確に下降するのは、トレンド終了の初期兆候になります。トレンドフォローポジションの利確を検討するタイミングです。
USD/JPY での使いどころ
USD/JPY は時間帯によりトレンド発生の場所が変わります。ADX のレベルは時間足で解釈を変えます。
東京時間(JST 09:00〜15:00)
東京時間は基本レンジです。日足 ADX が低位の局面が長く続きます。
- 15分足 ADX < 20 が典型。レンジトレード優位
- 東京仲値(09:55)前後の急変で 5分足 ADX が一時的に跳ねるが、通過後に沈静化することが多い
- 東京時間だけ見て ADX 低位を「トレンドなし」と結論しない。ロンドン以降で反転することがある
ロンドンオープン(JST 16:00)
ロンドン勢の参入で東京レンジが破れます。ADX が低位から急上昇するタイミングです。
- 15:30〜16:30 に 15分足 ADX が 20 から 25 へ上昇するのがブレイク初動候補
- +DI / -DI どちらが優勢かで方向を確認する
- ADX が既に高い(> 30)状態でロンドン入りするなら、東京中に方向が付いていた継続シナリオ
- ロンドン序盤の初動を逆張りしない(ADX 上昇局面)
NYオープン(JST 22:30)
NY オープンは指標発表と重なることが多くなります。ADX の解釈は指標の有無で分かれます。
- 指標なしの日:ロンドン時間の方向を継続することが多い
- 指標日:発表前は ADX 低下、発表後に急上昇
- 指標直後の +DI / -DI クロスだけで判断しない。次の 15分足終値を確認する
- ロンドンから NY への連続トレンドが続いている場合、ADX > 30 でも押し目狙いは有効
日足レベルの ADX
日足 ADX は月次の相場環境として機能します。
- 日足 ADX < 20:レンジ相場(2週間から数か月続くことがある)
- 日足 ADX > 25:明確な週次トレンド。トレンドフォロー戦略が回りやすい環境
- 日足 ADX > 40:稀。強い一方向の展開(介入警戒、ファンダ材料が強い局面など)
- 日足 ADX と下位足の ADX を組み合わせ、「上位足でトレンド、下位足で押し目」の重なりを作る
落とし穴
- +DI / -DI クロス単体でのエントリー:ADX 低位でのクロスは騙し多発。ADX が 20 を超えているかを必ず確認する
- Wilder 平均と単純平均の混同:SMA や EMA()で計算すると別物になる。Wilder は 。pandas なら
ewm(alpha=1/n, adjust=False)を使う - 初期値の欠落:Wilder 平均は最初の 期間で確定値にならない。実装時に最初の 期間は使わない(warm-up 期間)
- 閾値 25 を絶対視する:25 は原典由来だが、通貨ペア、時間足、時代で最適点は異なる。USD/JPY 日足では 22〜28 の間で運用検討
- ADX 高値圏だからエントリー:ADX が既に高いときは終盤に近い可能性がある。傾き(下降し始めていないか)を確認する
- DX 計算での 0 割れ:+DI と -DI の和が非常に小さい(ほぼ 0)期間があると DX 計算が不安定になる。実装で分母 0 の保護を入れる
- 異なる時間足でパラメータをそろえない:15分足で 、日足で を使うと物理的な意味(期間)が異なる。時間足ごとに用途を分ける
- レンジ判定の遅れ:ADX は Wilder 平均後の Wilder 平均なので、実際のレジーム変化から数本遅れる。エントリー確認には他指標との重なりが必要
- 多通貨ペアでの一律運用:EUR/USD と USD/JPY では ADX の普通の水準が異なる。ペアごとに過去分布を確認する
- 教科書シグナルの実データ有意性:検証では ADX フィルタは移動平均系ルールで有意な改善を出さなかった。ADX はレジーム判定の補助として使い、エントリーシグナルとして単体依存しない
Python 実装スケッチ
import numpy as npimport pandas as pd
def wilder_smoothed(series: pd.Series, n: int) -> pd.Series: """Wilder 平均 (α = 1/n) を pandas の ewm で表現。""" return series.ewm(alpha=1.0 / n, adjust=False, min_periods=n).mean()
def adx_dmi( high: pd.Series, low: pd.Series, close: pd.Series, n: int = 14,) -> pd.DataFrame: up_move = high.diff() down_move = -low.diff()
plus_dm = np.where((up_move > down_move) & (up_move > 0), up_move, 0.0) minus_dm = np.where((down_move > up_move) & (down_move > 0), down_move, 0.0)
prev_close = close.shift(1) tr = pd.concat( [ (high - low), (high - prev_close).abs(), (low - prev_close).abs(), ], axis=1, ).max(axis=1)
plus_dm_s = wilder_smoothed(pd.Series(plus_dm, index=high.index), n) minus_dm_s = wilder_smoothed(pd.Series(minus_dm, index=high.index), n) tr_s = wilder_smoothed(tr, n)
plus_di = 100.0 * plus_dm_s / tr_s.replace(0.0, np.nan) minus_di = 100.0 * minus_dm_s / tr_s.replace(0.0, np.nan)
di_sum = plus_di + minus_di dx = 100.0 * (plus_di - minus_di).abs() / di_sum.replace(0.0, np.nan) adx = wilder_smoothed(dx, n)
return pd.DataFrame( { "plus_di": plus_di, "minus_di": minus_di, "dx": dx, "adx": adx, } )adjust=False を明示することで、pandas の EMA を Wilder 平均に一致させます。min_periods=n で warm-up 期間を NaN として残します。分母 0 は replace(0.0, np.nan) で保護します。
参考
- J. Welles Wilder Jr., New Concepts in Technical Trading Systems, Trend Research, 1978
- Investopedia — “Average Directional Index (ADX)”
- Investopedia — “Directional Movement Index (DMI)”
- StockCharts — “ADX: The Trend Strength Indicator”
- pandas documentation —
pandas.Series.ewm