コンテンツにスキップ

損切りの設計

損切りは、負けを認める価格ではなく、トレード仮説が崩れた価格です。 このページでは USD/JPY を中心に、損切り位置をチャート構造、ボラティリティ、許容損失額から一貫して設計する方法を整理します。 直近スイング高値と安値、ATR ベース、%証拠金ベース、トレーリングストップ、ブレークイーブン移行を使い分け、エントリー前に最大損失を固定し、ロットを逆算し、利が乗った後の撤退ルールまで先に決める局面で使います。

前提

損切りは「負けを認める価格」ではなく、トレード仮説が崩れた価格です。 USD/JPY の買いなら、価格が想定した支持帯を割った時点で仮説は崩れます。 USD/JPY の売りなら、価格が想定した抵抗帯を上抜けた時点で仮説は崩れます。

USD/JPY では通常、1 pip は 0.01 円で扱います。

1 pip=0.01 JPY per USD1\ \text{pip} = 0.01\ \text{JPY per USD}

USD/JPY が 150.00 のとき、100,000 USD のポジションに対する 1 pip の価値は概算で以下になります。

JPY 口座の場合:

pip valueJPY=100,000×0.01=1,000 JPY\text{pip value}_{JPY} = 100{,}000 \times 0.01 = 1{,}000\ \text{JPY}

USD 口座の場合:

pip valueUSD100,000×0.01150.00=6.67 USD\text{pip value}_{USD} \approx \frac{100{,}000 \times 0.01}{150.00} = 6.67\ \text{USD}

したがって、USD/JPY で 100,000 USD を建て、30 pips 逆行して損切りする場合、JPY 口座の損失は概算で 30,000 円になります。

30 pips×1,000 JPY=30,000 JPY30\ \text{pips} \times 1{,}000\ \text{JPY} = 30{,}000\ \text{JPY}

pip の価値やロットは pip 価値計算ツールポジションサイズ計算ツール で確認できます。

損切り設計の順序

損切りは次の順に決めます。

  1. エントリー根拠を決める
  2. 仮説が崩れる価格を決める
  3. スプレッド、滑り、ノイズ分のバッファを加える
  4. 損切り幅を pips に変換する
  5. 有効証拠金に対する許容損失率からロットを逆算する
  6. 利が乗った後のトレーリングとブレークイーブン移行を決める

この順序を崩してはいけません。 先にロットを決めると、損切り位置が感情的に近くなります。

直近スイング高値と安値ベース

直近スイングを使う損切りは、最も実践的なチャート構造ベースの損切りです。

定義

買いの場合、損切りは直近スイング安値の下に置きます。

Slong=LswingbS_{long} = L_{swing} - b

売りの場合、損切りは直近スイング高値の上に置きます。

Sshort=Hswing+bS_{short} = H_{swing} + b

ここで、

  • SlongS_{long}: 買いポジションの損切り価格
  • SshortS_{short}: 売りポジションの損切り価格
  • LswingL_{swing}: 直近スイング安値
  • HswingH_{swing}: 直近スイング高値
  • bb: バッファ

バッファは固定 pips ではなく、最低限以下を含めます。

b=max(bmin,βATRt)b = \max(b_{min}, \beta \cdot ATR_t)

USD/JPY の 1H 足なら、目安は以下でよいでしょう。

スタイルバッファ目安
スキャル2-5 pips
デイトレ5-10 pips
スイング10-25 pips

ただし、米 CPI、FOMC、日銀会合、為替介入警戒局面ではこの目安は使えません。 イベント前後はスプレッドと滑りが拡大し、通常のバッファでは足りません。

スイングの確認

厳密には、kk 本前後の安値より低い足をスイング安値とします。

Li=min(Lik,,Li,,Li+k)L_i = \min(L_{i-k}, \ldots, L_i, \ldots, L_{i+k})

ただし、この定義は右側 kk 本の確定を待つため、リアルタイムでは遅れます。 バックテストでこのスイングをそのまま使うと先読みになります。 実運用では、次のように過去本数だけで判定します。

買いの場合:

Ltpast=min(Ltm,,Lt1)L^{past}_t = \min(L_{t-m}, \ldots, L_{t-1})

売りの場合:

Htpast=max(Htm,,Ht1)H^{past}_t = \max(H_{t-m}, \ldots, H_{t-1})

現在足を含めず、確定済みの過去足だけを見ます。 これが先読みを避ける基本です。

USD/JPY 例

USD/JPY を 150.20 で買います。 直近スイング安値が 149.82、バッファが 8 pips の場合、損切りは 149.74 になります。

Slong=149.820.08=149.74S_{long} = 149.82 - 0.08 = 149.74

損切り幅は 46 pips です。

Dpips=150.20149.740.01=46D_{pips} = \frac{150.20 - 149.74}{0.01} = 46

この買いの仮説は「149.82 付近の押し安値が維持される」というものです。 149.74 に到達したら、仮説は崩れたものとして撤退します。

ATR ベース

ATR ベースの損切りは、現在のボラティリティに応じて損切り幅を自動調整する方法です。 レンジが狭い日は近く、値幅が大きい日は遠くなります。

True Range

True Range は次の最大値で定義します。

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

ここで、

  • HtH_t: 当期高値
  • LtL_t: 当期安値
  • Ct1C_{t-1}: 前期終値

ATR は True Range の平滑平均です。 Wilder 式では初回 ATR を単純平均で作り、その後は次の再帰式で更新します。

ATRt(n)=(n1)ATRt1(n)+TRtnATR_t(n) = \frac{(n - 1)ATR_{t-1}(n) + TR_t}{n}

一般的な初期値は n=14n = 14 です。 これは魔法の数字ではありません。 1H 足のデイトレなら 14、4H 足のスイングなら 14 または 20、日足の中期運用なら 14 または 20 から検証します。

損切り価格

買いの場合:

Slong=PentrykATRtS_{long} = P_{entry} - k \cdot ATR_t

売りの場合:

Sshort=Pentry+kATRtS_{short} = P_{entry} + k \cdot ATR_t

ここで kk は ATR 倍率です。

スタイルATR 倍率
短期逆張り0.8-1.2
デイトレ順張り1.5-2.0
スイング順張り2.0-3.0
指標、中銀イベント跨ぎ原則として新規回避

USD/JPY 1H の ATR(14) が 0.22 円、150.00 で買う場合、k=1.5k = 1.5 なら損切りは 149.67 になります。

Slong=150.001.5×0.22=149.67S_{long} = 150.00 - 1.5 \times 0.22 = 149.67

損切り幅は 33 pips です。

Dpips=150.00149.670.01=33D_{pips} = \frac{150.00 - 149.67}{0.01} = 33

ATR ベースの使いどころ

ATR ベースは、明確な直近スイングがないブレイクアウト、移動平均反発、短期トレンドフォローに向きます。 価格構造が明確な場面では、直近スイング損切りを優先します。 ATR は「構造の代替」ではなく「ノイズ幅の推定」です。

%証拠金ベース

%証拠金ベースの損切りは、正確には「有効証拠金に対する許容損失率」からロットまたは損切り幅を逆算する方法です。 価格位置を証拠金だけで決めてはいけません。 証拠金は資金管理、スイングと ATR は価格設計です。

許容損失額

有効証拠金を EE、1回の許容損失率を ρ\rho とします。

Rmoney=E×ρR_{money} = E \times \rho

例えば、有効証拠金が 1,000,000 円、1回の許容損失率が 1% なら、許容損失額は 10,000 円です。

Rmoney=1,000,000×0.01=10,000R_{money} = 1{,}000{,}000 \times 0.01 = 10{,}000

USD/JPY のロット逆算

JPY 口座で、USD/JPY のポジション数量を QQ USD、損切り幅を DpipsD_{pips} とします。 1 pip は 0.01 円なので、損失額は次になります。

LossJPY=Q×Dpips×0.01Loss_{JPY} = Q \times D_{pips} \times 0.01

許容損失額から最大数量を逆算します。

Qmax=RmoneyDpips×0.01Q_{max} = \frac{R_{money}}{D_{pips} \times 0.01}

例として、有効証拠金 1,000,000 円、許容損失率 1%、損切り幅 40 pips なら、最大数量は 25,000 USD です。

Qmax=10,00040×0.01=25,000Q_{max} = \frac{10{,}000}{40 \times 0.01} = 25{,}000

このとき 100,000 USD を建ててはいけません。 40 pips の損切りで 40,000 円を失い、1回の損失が 4% になります。 このロット逆算は ポジションサイズ計算ツール でも確認できます。

必要証拠金との関係

レバレッジを LevLev、USD/JPY レートを PP とすると、必要証拠金は概算で次になります。

MarginJPY=Q×PLevMargin_{JPY} = \frac{Q \times P}{Lev}

有効証拠金に対する使用率は次になります。

MarginUsage=MarginJPYEMarginUsage = \frac{Margin_{JPY}}{E}

損失率と証拠金使用率は別物です。 証拠金使用率が低くても、損切り幅とロットが大きければ1回の損失は大きくなります。 逆に、損失率が小さくても証拠金使用率が高すぎれば、連敗時や急変時に余力が消えます。

実務では次の2つを同時に満たします。

LossE×ρLoss \le E \times \rho MarginUsageMmaxMarginUsage \le M_{max}

MmaxM_{max} は保守的に 20-40% 程度に抑えます。 複数ポジションを同時に持つ場合は、相関を考慮して合算します。 USD/JPY、クロス円、日経連動のリスクを別々に見てはいけません。 必要証拠金の水準は 必要証拠金計算ツール証拠金維持率計算ツール で確認できます。

トレーリングストップ

トレーリングストップは、含み益が伸びた後に損切り価格を有利方向へ引き上げる方法です。 買いではストップを上げます。 売りではストップを下げます。 逆方向には動かしません。

ATR トレーリング

買いの場合:

St=max(St1,HtentrykATRt)S_t = \max(S_{t-1}, H^{entry}_t - k \cdot ATR_t)

売りの場合:

St=min(St1,Ltentry+kATRt)S_t = \min(S_{t-1}, L^{entry}_t + k \cdot ATR_t)

ここで、

  • HtentryH^{entry}_t: エントリー後の最高値
  • LtentryL^{entry}_t: エントリー後の最安値
  • St1S_{t-1}: 前回ストップ
  • StS_t: 更新後ストップ

買いのストップは必ず上がるか据え置きです。 下げてはいけません。 売りのストップは必ず下がるか据え置きです。 上げてはいけません。

スイングトレーリング

買いでは、上昇トレンド中の高値更新後にできた押し安値の下へストップを移します。

St=max(St1,Lhigher lowb)S_t = \max(S_{t-1}, L_{higher\ low} - b)

売りでは、下降トレンド中の安値更新後にできた戻り高値の上へストップを移します。

St=min(St1,Hlower high+b)S_t = \min(S_{t-1}, H_{lower\ high} + b)

スイングトレーリングは、ATR トレーリングより遅いですが、トレンドを長く持ちやすい方法です。 USD/JPY の日足、4H 足の順張りでは、スイングトレーリングのほうが利益を伸ばしやすくなります。

固定 pips トレーリング

固定 pips のトレーリングは単純ですが、USD/JPY では相場環境に弱い方法です。 東京時間の狭いレンジと米 CPI 後の値幅を同じ 20 pips で扱うと、どちらかで必ず破綻します。 固定 pips を使うなら、時間帯とイベントを分けて検証します。

ブレークイーブン移行

ブレークイーブン移行は、含み益が一定以上になった後、損切りを建値付近へ移す方法です。 目的は「負けを消すこと」ではなく、初期リスクを回収して次の値幅を狙うことです。

R 倍率で管理する

初期リスクを RR とします。

R=PentryS0R = |P_{entry} - S_0|

買いで、価格が mRmR だけ有利に動いたら、ストップを建値へ移します。

PtPentry+mRP_t \ge P_{entry} + mR

売りでは次になります。

PtPentrymRP_t \le P_{entry} - mR

mm は 1.0 から 1.5 が実務的です。 0.5R で建値移行すると早すぎます。 USD/JPY は節目で一度戻してから伸びる動きが多く、早い建値移行は勝ちトレードを消してしまいます。

コスト込みの建値

建値は約定価格そのものではありません。 スプレッド、手数料、スワップ、想定滑りを含めます。

買いの場合:

SBE,long=Pentry+cS_{BE,long} = P_{entry} + c

売りの場合:

SBE,short=PentrycS_{BE,short} = P_{entry} - c

ここで cc はコストを価格単位に直した値です。 USD/JPY でコストが 1.5 pips なら、c=0.015c = 0.015 です。

建値移行は、価格が +1R に到達した瞬間ではなく、ローソク足が確定し、直近構造が維持された時点で実行します。 ティックだけで機械的に移すと、ノイズで刈られます。

使い分け

方法強み弱み主な用途
直近スイング仮説崩壊点が明確損切り幅が広くなりやすい押し目買い、戻り売り
ATRボラティリティに追随構造を無視しやすいブレイク、MA反発
%証拠金口座破綻を防ぐ価格根拠にならないロット決定
トレーリング利益を伸ばすレンジで削られるトレンド相場
ブレークイーブン初期リスクを消す早すぎると期待値低下+1R 以降の管理

最も安定する設計は、次の組み合わせです。

  1. 直近スイングで仮説崩壊点を決める
  2. ATR でバッファが妥当か確認する
  3. 有効証拠金の許容損失率でロットを決める
  4. +1R から +1.5R で建値移行を検討する
  5. 以後はスイングまたは ATR でトレーリングする

USD/JPY での使いどころ

東京時間

東京時間は仲値前後で一方向に走り、その後に反転しやすい時間帯です。 損切りを直近高値、安値のすぐ外に置くと、仲値フローで刈られやすくなります。 東京時間の短期トレードでは、スイング損切りに 3-8 pips の追加バッファを置きます。

ロンドン時間

ロンドン初動は東京レンジの高値、安値を試しやすい時間帯です。 レンジブレイクで入る場合、ATR ベースの損切りが機能しやすくなります。 ただし、ブレイク足の高値買い、安値売りは損切り幅が広がります。 初動後の押し戻りを待つほうがロットを適正化しやすくなります。

ニューヨーク時間

米指標、米金利、株式市場の動きで USD/JPY は急変しやすい時間帯です。 CPI、雇用統計、FOMC では、通常の ATR が過去の静かな時間帯を含むため過小評価になりやすくなります。 イベント直前の新規エントリーでは、ATR ベースの損切りは信頼しません。

日銀と為替介入警戒

USD/JPY は日銀会合、財務省発言、為替介入警戒でギャップ的に動くことがあります。 ストップ注文は損失を限定する道具ですが、指定価格での約定を保証しません。 介入警戒局面では、ロットを落とすことが最優先です。

Python 実装スケッチ

from __future__ import annotations
import numpy as np
import pandas as pd
PIP_SIZE_USDJPY = 0.01
def true_range(df: pd.DataFrame) -> pd.Series:
"""
df must contain columns: high, low, close.
Index must be sorted ascending.
"""
high = df["high"].astype(float)
low = df["low"].astype(float)
close = df["close"].astype(float)
prev_close = close.shift(1)
ranges = pd.concat(
[
high - low,
(high - prev_close).abs(),
(low - prev_close).abs(),
],
axis=1,
)
return ranges.max(axis=1, skipna=True)
def wilder_atr(df: pd.DataFrame, n: int = 14) -> pd.Series:
"""
Wilder-style ATR:
- first ATR is the simple average of the first n True Range values
- subsequent ATR is ((n - 1) * previous_atr + current_tr) / n
This avoids the common mismatch where pandas ewm(alpha=1/n)
starts from the first TR instead of Wilder's SMA seed.
"""
if n <= 0:
raise ValueError("n must be positive")
tr = true_range(df)
atr = pd.Series(np.nan, index=df.index, dtype=float)
if len(tr) < n:
return atr
atr.iloc[n - 1] = tr.iloc[:n].mean()
for i in range(n, len(tr)):
atr.iloc[i] = ((n - 1) * atr.iloc[i - 1] + tr.iloc[i]) / n
return atr
def atr_stop_price(
entry_price: float,
atr_value: float,
side: str,
k: float = 1.5,
) -> float:
"""
Return initial ATR-based stop price for USD/JPY.
side:
- "long": buy USD/JPY, stop below entry
- "short": sell USD/JPY, stop above entry
"""
if side not in {"long", "short"}:
raise ValueError("side must be 'long' or 'short'")
if atr_value <= 0:
raise ValueError("atr_value must be positive")
if k <= 0:
raise ValueError("k must be positive")
distance = k * atr_value
if side == "long":
return entry_price - distance
return entry_price + distance
def stop_distance_pips(entry_price: float, stop_price: float) -> float:
return abs(entry_price - stop_price) / PIP_SIZE_USDJPY
def position_size_usdjpy_jpy_account(
equity_jpy: float,
risk_fraction: float,
stop_pips: float,
) -> float:
"""
Return max USD notional for a JPY account.
Loss JPY = USD notional * stop_pips * 0.01
"""
if equity_jpy <= 0:
raise ValueError("equity_jpy must be positive")
if not 0 < risk_fraction < 1:
raise ValueError("risk_fraction must be between 0 and 1")
if stop_pips <= 0:
raise ValueError("stop_pips must be positive")
risk_jpy = equity_jpy * risk_fraction
return risk_jpy / (stop_pips * PIP_SIZE_USDJPY)
def required_margin_jpy(
usd_notional: float,
usdjpy_price: float,
leverage: float,
) -> float:
if usd_notional <= 0:
raise ValueError("usd_notional must be positive")
if usdjpy_price <= 0:
raise ValueError("usdjpy_price must be positive")
if leverage <= 0:
raise ValueError("leverage must be positive")
return usd_notional * usdjpy_price / leverage
# Example:
# df = pd.read_csv("USDJPY_1H.csv", parse_dates=["time"], index_col="time")
# df["atr14"] = wilder_atr(df, n=14)
#
# entry = 150.00
# atr_value = df["atr14"].iloc[-1]
# stop = atr_stop_price(entry, atr_value, side="long", k=1.5)
# stop_pips = stop_distance_pips(entry, stop)
# size_usd = position_size_usdjpy_jpy_account(
# equity_jpy=1_000_000,
# risk_fraction=0.01,
# stop_pips=stop_pips,
# )
# margin = required_margin_jpy(size_usd, usdjpy_price=entry, leverage=25)

実装では、現在形成中の足を使いません。 ATR もスイングも、確定済み足だけで計算します。 未確定足の高値、安値を使うと、バックテストと実運用が一致しません。

落とし穴

  • 損切りを近づけてロットを上げない: ロットを増やすために損切りを近づけると、ノイズで刈られる。損切り位置が先、ロットが後である。
  • ストップ注文は約定価格を保証しない: ストップ価格に到達すると市場注文化するタイプでは、急変時に指定価格から滑る。
  • スプレッドを無視しない: USD/JPY の買いは ask で入り、bid で決済される。チャート表示が bid なら、買いの損切りは見た目より早く約定しやすい。
  • ATR を過信しない: ATR は過去の平均値幅であり、将来のイベント値幅を予測しない。CPI、FOMC、日銀会合、介入警戒では過小評価になりやすい。
  • スイング判定で先読みしない: 左右 kk 本で確定するスイングは、右側 kk 本が終わるまで見えない。バックテストでは使用可能時刻を遅らせる。
  • 建値移行を早くしすぎない: +0.5R 程度で建値に移すと、USD/JPY の通常の押し戻りで撤退させられる。最低でも +1R、できれば構造確認後に移す。
  • トレーリングをレンジで使わない: レンジ相場ではトレーリングが高値掴み、安値掴みの連続を作る。MA の傾き、ADX、上位足の高安更新でトレンドを確認する。
  • 必要証拠金と最大損失を混同しない: 必要証拠金が少ないことは、損失が小さいことを意味しない。損失はロットと損切り幅で決まる。
  • 複数ポジションの相関を無視しない: USD/JPY 買い、EUR/JPY 買い、GBP/JPY 買いは別トレードではなく円売りリスクの集中である。
  • 損切りを遠ざけない: エントリー後に不利方向へ損切りを動かす行為は、設計を破壊する。許される更新は有利方向のみである。

参考