コンテンツにスキップ

ATR(Average True Range, 真の値幅)

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

価格の下にATRを表示したイメージ。トレンド期に上昇し、レンジで低下する。

架空データによるイメージ図(実際の相場データではありません)。下段が ATR。ボラティリティが拡大する局面で上昇し、収縮で低下する例。

定義

ATR は Wilder が1978年の New Concepts in Technical Trading Systems で発表した、ボラティリティの絶対値尺度です。前日終値を含む「真の値幅」を Wilder 平均で平滑します。

True Range(TR)

TR は3つのうちの最大値です。ギャップ(前日終値との差)を組み込むのが、単純な高安差(Range)との違いになります。

TRt=max(HtLt, HtCt1, LtCt1)\text{TR}_t = \max\left(H_t - L_t,\ |H_t - C_{t-1}|,\ |L_t - C_{t-1}|\right)

  • 高安差 HtLtH_t - L_t:当日の値幅
  • 前日終値からの上方向ギャップ HtCt1|H_t - C_{t-1}|:前日終値から当日高値
  • 前日終値からの下方向ギャップ LtCt1|L_t - C_{t-1}|:前日終値から当日安値

FX は24時間市場のため、ギャップは基本的に週末をまたぐときだけ発生します(月曜寄付と金曜クローズ)。日中足では HLH - L と TR がほぼ一致することが多くなります。

Wilder 平均

TR を Wilder 平均(α=1/n\alpha = 1/n)で平滑した値が ATR です。

ATRt=ATRt1+TRtATRt1n\text{ATR}_t = \text{ATR}_{t-1} + \frac{\text{TR}_t - \text{ATR}_{t-1}}{n}

初期値は最初の nn 個の TR の単純平均です。pandas では ewm(alpha=1/n, adjust=False) が対応します。

ATRt=TR~t(α=1/n)\text{ATR}_t = \widetilde{\text{TR}}_t\quad (\alpha = 1/n)

ATR の性質

  • 常に非負:TR は非負なので ATR も非負
  • 方向を持たない:上下どちらのボラティリティも同じように高める
  • 単位は価格:USD/JPY なら円(例:ATR = 0.85 なら 85 pips)
  • 時間足に依存:15分足 ATR と日足 ATR は別物として扱う

パラメータと期間

パラメータ標準意味
n14Wilder 平均の期間
平均法Wilderpandas では ewm(alpha=1/n, adjust=False)
価格H/L/C高値、安値、終値。始値は使わない

USD/JPY の時間足別の目安です(2020〜2025 平均、参考値。実際の相場環境で変動します)。

時間足期間平均的 ATR(pips)主な用途
5分143〜8短期スキャルの損切幅、東京仲値通過後の値幅期待値
15分148〜15デイトレのストップ幅、ロンドンオープン初動の目安
1時間1420〜40当日のレンジ想定、日中トレーリング
4時間1440〜90スイングの利確幅、週内の値幅期待値
日足1460〜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時間トレーリングへ

ポジションサイジング

Lot=口座残高×リスク%損切幅 (pips)×pip 価値\text{Lot} = \frac{\text{口座残高} \times \text{リスク\%}}{\text{損切幅 (pips)} \times \text{pip 価値}}

  • 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:000.4〜0.6 倍東京朝の閑散帯
09:00〜10:001.5〜2.0 倍東京仲値ラッシュ
10:00〜14:000.6〜0.9 倍東京昼のレンジ
15:00〜16:000.8〜1.2 倍ロンドン参入前
16:00〜18:001.5〜2.5 倍ロンドンオープン
21:30〜24:001.5〜3.0 倍NY オープンと指標
00:00〜06:000.5〜0.8 倍NY 引け後から東京前

15分足で n=14n=14 の 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 の混同HLH - L だけで計算すると週明けのギャップを取り込めない。TR は必ず前日終値との差も比較する
  • Wilder 平均と単純平均の混同:SMA(TR, 14) は SMA-ATR になる。Wilder ATR とは値も反応速度も異なる。pandas では ewm(alpha=1/n, adjust=False) を使う
  • 初期値の欠落:Wilder 平均は最初の nn 期間で値が安定しない。実装で warm-up として最初の n×2n \times 2 期間は 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 np
import 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