ATR(Average True Range, 真の値幅)
ATR は、通貨ペアの当該時間軸におけるボラティリティを絶対値(pips や円)で数値化する指標です。損切幅、利確幅、ポジションサイズの基準に使います。方向性は持たず、値幅の期待値を表します。時間帯や曜日で強い偏りがあるため、単一の値で運用しないのが実践的です。

架空データによるイメージ図(実際の相場データではありません)。下段が ATR。ボラティリティが拡大する局面で上昇し、収縮で低下する例。
定義
ATR は Wilder が1978年の New Concepts in Technical Trading Systems で発表した、ボラティリティの絶対値尺度です。前日終値を含む「真の値幅」を Wilder 平均で平滑します。
True Range(TR)
TR は3つのうちの最大値です。ギャップ(前日終値との差)を組み込むのが、単純な高安差(Range)との違いになります。
- 高安差 :当日の値幅
- 前日終値からの上方向ギャップ :前日終値から当日高値
- 前日終値からの下方向ギャップ :前日終値から当日安値
FX は24時間市場のため、ギャップは基本的に週末をまたぐときだけ発生します(月曜寄付と金曜クローズ)。日中足では と TR がほぼ一致することが多くなります。
Wilder 平均
TR を Wilder 平均()で平滑した値が ATR です。
初期値は最初の 個の TR の単純平均です。pandas では ewm(alpha=1/n, adjust=False) が対応します。
ATR の性質
- 常に非負:TR は非負なので ATR も非負
- 方向を持たない:上下どちらのボラティリティも同じように高める
- 単位は価格:USD/JPY なら円(例:ATR = 0.85 なら 85 pips)
- 時間足に依存:15分足 ATR と日足 ATR は別物として扱う
パラメータと期間
| パラメータ | 標準 | 意味 |
|---|---|---|
n | 14 | Wilder 平均の期間 |
| 平均法 | Wilder | pandas では ewm(alpha=1/n, adjust=False) |
| 価格 | H/L/C | 高値、安値、終値。始値は使わない |
USD/JPY の時間足別の目安です(2020〜2025 平均、参考値。実際の相場環境で変動します)。
| 時間足 | 期間 | 平均的 ATR(pips) | 主な用途 |
|---|---|---|---|
| 5分 | 14 | 3〜8 | 短期スキャルの損切幅、東京仲値通過後の値幅期待値 |
| 15分 | 14 | 8〜15 | デイトレのストップ幅、ロンドンオープン初動の目安 |
| 1時間 | 14 | 20〜40 | 当日のレンジ想定、日中トレーリング |
| 4時間 | 14 | 40〜90 | スイングの利確幅、週内の値幅期待値 |
| 日足 | 14 | 60〜150 | ポジションサイジング、月次のボラ環境判定 |
上記は普通の日の目安です。指標発表日(FOMC、NFP、CPI)、介入警戒帯、金曜のロンドンフィックス周辺では 1.5〜3 倍になります。
シグナル
ATR はシグナル指標ではなく値幅指標です。単体で売買判断を作らず、他指標の補助に使います。
損切幅の設計
- 短期ブレイクエントリー:損切 = 直近スイングロー ± ATR × 0.5
- 押し目買い、戻り売り:損切 = エントリー ± ATR × 1.5〜2.0
- スイングエントリー:損切 = エントリー ± ATR × 2.0〜3.0
ATR × 定数は「反対方向へどれだけ動けば異常か」の目安です。ATR × 1 は日常的な値幅内なので損切に使うと刈られやすく、ATR × 2 以上を目安にします。
利確幅とリスクリワード
- 利確:損切幅 × リスクリワード比(2:1 なら損切 20pips に対し利確 40pips)
- ATR ベースのトレーリング:Chandelier Exit = 直近 N 本高値 - ATR × 3
- 時間足移行:15分ストップから1時間トレーリングへ
ポジションサイジング
- ATR × k を損切幅として代入する
- リスク% は 1〜2% が標準
- ATR が上昇(ボラ拡大)するほど Lot は小さくなる
- ATR が縮小(ボラ収縮)するほど Lot は大きくなる。スクイーズ後のブレイクで過大リスクにならないよう、ATR 拡大への保険(最大 Lot cap)を設ける
ボラティリティレジーム判定
- ATR が過去 60 本の下位 20%:低ボラ(スクイーズ候補)
- ATR が過去 60 本の上位 20%:高ボラ(指標周辺、イベント発生後)
- ATR の急上昇:レジーム変化の初期兆候
- ATR の急下降:トレンド終盤、エネルギー枯渇
USD/JPY での使いどころ
USD/JPY は時間帯で ATR が明確に変化します。時間帯を分けて ATR を扱います。
時間帯別 ATR 分布(15分足の典型)
| 時間帯(JST) | 相対 ATR | 特徴 |
|---|---|---|
| 06:00〜08:00 | 0.4〜0.6 倍 | 東京朝の閑散帯 |
| 09:00〜10:00 | 1.5〜2.0 倍 | 東京仲値ラッシュ |
| 10:00〜14:00 | 0.6〜0.9 倍 | 東京昼のレンジ |
| 15:00〜16:00 | 0.8〜1.2 倍 | ロンドン参入前 |
| 16:00〜18:00 | 1.5〜2.5 倍 | ロンドンオープン |
| 21:30〜24:00 | 1.5〜3.0 倍 | NY オープンと指標 |
| 00:00〜06:00 | 0.5〜0.8 倍 | NY 引け後から東京前 |
15分足で の ATR は過去 3.5 時間の平均値幅です。時間帯をまたぐと ATR に混ざった値が入ります。時間帯別 ATR を別途集計するのが実務的です。
東京仲値(JST 09:55)
- 09:00〜09:30 の ATR は仲値が効いておらず基準線に近い
- 09:30〜10:00 で急上昇するのが典型
- 損切は仲値通過後の ATR で再計算する
ロンドンオープン(JST 16:00)
- 15:30 時点の ATR × 1.5〜2.0 がロンドン初動の想定値幅
- スクイーズ後のブレイクでは ATR ベース損切だと引っかかりやすいので、直近レンジの構造的な損切と組み合わせる
- ロンドン初動でエントリーする場合、ATR × 1 の狭い損切は騙しで刈られやすい
NYオープン(JST 22:30)と指標発表
- 指標発表前 30 分は ATR が縮小することが多い(待機)
- 指標発表後 5〜10 分で ATR が 3〜5 倍に跳ねる
- 指標発表直後の 1〜2 本を無視して確定値幅を確認するのが安全
- 指標日はポジションサイズを縮小する(通常 Lot ÷ 2 など)
日足 ATR とスイング設計
- 日足 ATR ≈ 100 pips ならスイング利確目標 200〜300 pips
- 日足 ATR ≈ 60 pips なら利確目標 120〜180 pips
- 日足 ATR が過去 3 か月の最低水準ならレンジ相場。スイングよりデイトレ向き
落とし穴
- True Range と Range の混同: だけで計算すると週明けのギャップを取り込めない。TR は必ず前日終値との差も比較する
- Wilder 平均と単純平均の混同:SMA(TR, 14) は SMA-ATR になる。Wilder ATR とは値も反応速度も異なる。pandas では
ewm(alpha=1/n, adjust=False)を使う - 初期値の欠落:Wilder 平均は最初の 期間で値が安定しない。実装で warm-up として最初の 期間は NaN 扱いにする
- 単位の混同:USD/JPY で「ATR = 0.85」と表示されたら 85 pips(1 pip = 0.01 円)。EUR/USD なら「ATR = 0.0060」が 60 pips(1 pip = 0.0001)。桁を間違えると損切幅が 10 倍になる
- 時間帯を無視した ATR 運用:東京昼の ATR を NY 時間で使うと過小、NY 時間の ATR を東京昼で使うと過大になる。時間帯別 ATR の集計が必要
- 指標発表日を平常時と同じ ATR で運用:指標日は ATR × 2〜3 が普通。損切幅を通常運用したまま指標に突入するとロット過大
- ATR ベース損切だけを絶対視する:ATR × 2 の損切がレンジ下限より狭い場合、構造的損切(直近スイングロー)に上書きする
- 多通貨ペアで同じ k を使う:EUR/USD(日足 ATR ≈ 60 pips)と GBP/JPY(日足 ATR ≈ 200 pips)では k=2 の意味が違う。ペアごとの ATR 分布を確認する
- ボラ拡大時に利確を伸ばす誤解:ATR 上昇はイベントノイズによる一時的な値幅拡大の可能性がある。トレンドが本物とは限らない
- 教科書シグナルの過信:検証では ATR ベースのボラティリティフィルタは移動平均系ルールで有意な改善を出さなかった。ATR はリスク管理の絶対値尺度として使い、エントリーシグナルとして単体依存しない
Python 実装スケッチ
import numpy as npimport pandas as pd
def true_range(high: pd.Series, low: pd.Series, close: pd.Series) -> pd.Series: prev_close = close.shift(1) tr = pd.concat( [ (high - low), (high - prev_close).abs(), (low - prev_close).abs(), ], axis=1, ).max(axis=1) return tr
def atr( high: pd.Series, low: pd.Series, close: pd.Series, n: int = 14,) -> pd.Series: tr = true_range(high, low, close) return tr.ewm(alpha=1.0 / n, adjust=False, min_periods=n).mean()adjust=False で Wilder 平均に一致させます。min_periods=n で warm-up 期間を NaN にします。
損切幅とポジションサイジング用のヘルパー例です。
def stop_from_atr( entry_price: float, atr_value: float, direction: str, # "long" or "short" k: float = 2.0,) -> float: if direction == "long": return entry_price - k * atr_value return entry_price + k * atr_value
def position_size( account_balance: float, risk_pct: float, # 0.01 = 1% stop_distance: float, # 損切幅 (価格単位) pip_value_per_lot: float, pip_size: float = 0.01, # USD/JPY) -> float: risk_amount = account_balance * risk_pct stop_pips = stop_distance / pip_size return risk_amount / (stop_pips * pip_value_per_lot)時間帯別 ATR の集計例です。
def atr_by_hour(df: pd.DataFrame, atr_col: str = "atr") -> pd.Series: """15分足など下位足の DataFrame から時間帯別 (JST hour) ATR を集計する。""" return df.groupby(df.index.tz_convert("Asia/Tokyo").hour)[atr_col].mean()参考
- J. Welles Wilder Jr., New Concepts in Technical Trading Systems, Trend Research, 1978
- Chuck LeBeau — “Chandelier Exit”(トレーリングストップの原典)
- Investopedia — “Average True Range (ATR)”
- StockCharts — “ATR”
- pandas documentation —
pandas.Series.ewm