ドル円『仲値フロー』システムトレード完全実装ガイド:東京9:55〜10:05の需給を狙う

FX

本稿では、東京時間の「仲値」決定(通常9:55頃)前後に発生しやすい実需フローの偏りを定量化し、裁量に依存しない売買ルールとして実装する方法を、データの取り方からバックテスト、実運用まで具体的に解説します。対象は主にUSD/JPYですが、EUR/JPYやGBP/JPYにも応用可能です。

要約(まず結論)

  • 仲値フローは実需のカバー(輸入企業のUSD買い/輸出企業のUSD売り)に起因し、9:30〜10:05の一部区間で方向性バイアスが生まれます。
  • 勝てるかは「いつでも」ではなく、条件選別(祝日・四半期末・要人発言・ボラ環境・窓開けの有無・アジア時間の先行トレンド)に依存します。
  • 最もシンプルな基本戦略は、9:35〜9:45にシグナルを判定し、9:46〜9:50に仕掛け、10:00±2分で手仕舞い。反転(フェード)は10:01〜10:10を狙います。
  • バックテストは5分足で十分。ただしスプレッド・スリッページのモデリングと「10:00:00約定の取り扱い」を厳密に。
  • ロバスト化はフィルタ×サイズ調整(ATR・出来高・ティック速度)で行い、パラメータはウォークフォワードで更新します。

仲値とは何か/優位性の源泉

多くの国内銀行は9:55前後に当日適用の対顧客レートを決めます。企業や機関の実需フローは、その前後で集中しがちです。カバー取引の偏りが短時間の需給歪みを作り、統計的なバイアスとして観測されます。

一方で以下の条件では優位性が薄れます。

  1. 重要指標(日本CPI、失業率、全米雇用、米CPI、FOMC声明)や要人発言が9:30〜10:10に重なる日。
  2. 日本・英国・米国の主要市場が祝日で流動性が低い日。
  3. 為替介入が観測・警戒される局面、もしくは前日からの大相場直後。
  4. アジア時間序盤に窓開けと一方向の過伸長がすでに起きている日。

データとシグナル設計

基本データ

  • タイムフレーム:5分足(代替で1分足)。
  • 期間:最低でも直近2〜3年。季節性と四半期末効果を含めるため。
  • 使用値:OHLC、ティック数、可能なら出来高代替(ブローカー配信のtick volume)。

シグナル群

以下を標準化(z-score)して合成し、SignalScoreとして使います。

  1. ティック方向バランス(9:30〜9:45):上昇ティック割合 − 下降ティック割合。
  2. 直近レンジ位置:9:30〜9:45の高安に対する価格の相対位置(0〜1)。上側に張り付くほど買い優位。
  3. ティック速度:単位時間あたりのティック数。加速はトレンド継続寄与。
  4. 前場先行トレンド:7:00〜9:30の累積変化方向。過伸長なら逆張り重み。
  5. 株式先行指標:日経先物/CFDの寄付き方向とボラ。

フィルタ群(トレード回避条件)

  • 高インパクト指標が9:30〜10:10に存在。
  • 平均スプレッド > 0.4pips、もしくは瞬間拡大が連発。
  • 前日対比で実効ボラ(ATR)が平常の2σ超。
  • 前時間帯(9:00〜9:30)に方向が5σ以上の一方通行。

ルール定義(基本版/ブレイク版/フェード版)

基本版(先回り・反復向け)

  1. 9:35にシグナル群を計算。SignalScore >= +S なら買い、<= −Sなら売り、それ以外は見送り。
  2. 9:46〜9:50の間で成行(もしくはリミット)で建玉。
  3. 手仕舞いは10:00〜10:02で全決済。到達前に逆行幅が−SLに達したらカット。
  4. ロットはATRベースで調整(size = k * risk_budget / ATR)。

ブレイク版(加速追随)

  1. 9:50〜9:55で直近レンジを上抜け/下抜け。ティック速度が閾値超で成行エントリー。
  2. 10:05で時間決済、もしくはトレイリング。

フェード版(反転狙い)

  1. 10:00〜10:01に短期の過伸長(3〜5分でx pips以上)を検知。
  2. 10:01〜10:03に逆方向でエントリー、10:08〜10:10で利確。失敗時は−SLで撤退。

ポジションサイズとリスク管理

  • 固定金額リスク:1トレードの想定損失を口座残高の0.25〜0.5%に固定。
  • ATR連動:ATR(14, 1分)のx倍をSLに。ボラが高い日は自動的にサイズ縮小。
  • 連敗制御:2連敗で当日停止。再開条件も明記。
  • 相関リスク:クロス円の同時ポジションは合算ボラで制限。

ブローカー選定・インフラ

  • 平均スプレッド(USD/JPY)0.2〜0.3pips台、配信遅延が小さいこと。
  • 約定能力:ニュースで滑らないこと。約定拒否・再クオートが少ないこと。
  • API:MT5またはFIX相当。VPSは東京ロケーションで遅延3ms以下がベター。

バックテストの正しい作り方

  1. データ:5分足+tick volume。1分足が取れるなら尚良い。
  2. コスト:スプレッドは可変でモデル化。イベント時拡大を反映。
  3. 執行バイアス排除:9:50のブレイク検知→同バーの高値/安値で約定とするのはNG。次バー始値かスリッページを上乗せ。
  4. 検証法:2年分を訓練、直近半年をアウト・オブ・サンプル。四半期ごとにウォークフォワード更新。

検証結果例(ダミー例/イメージ)

期間:2023/1〜2025/6。条件:基本版、S=0.6、SL=3.5pips、TP=時間決済。

指標
年率換算リターン +17〜24%
最大ドローダウン −6〜8%
勝率 56〜60%
PF 1.25〜1.45
平均保有時間 12分

※上記は手法構造の妥当性を示すための参考レンジです。実際の結果はブローカーや執行品質で大きく変動します。

実装例(Python + MetaTrader5)

import MetaTrader5 as mt5
import pandas as pd
import numpy as np
from datetime import datetime, timedelta, timezone

SYMBOL = "USDJPY"
tz = timezone(timedelta(hours=9))

def connect():
    assert mt5.initialize(), "MT5 init failed"
    # 必要に応じてログイン処理を追加

def get_rates(symbol=SYMBOL, minutes=120):
    end = datetime.now(tz)
    start = end - timedelta(minutes=minutes)
    rates = mt5.copy_rates_range(symbol, mt5.TIMEFRAME_M1, start, end)
    df = pd.DataFrame(rates)[["time","open","high","low","close","tick_volume"]]
    df["time"] = pd.to_datetime(df["time"], unit="s").dt.tz_localize("UTC").dt.tz_convert(tz)
    return df

def calc_signal(df):
    # 9:30〜9:45の範囲でティック方向バランスとレンジ位置を算出
    s = df.set_index("time")
    window = s.between_time("09:30", "09:45")
    if window.empty: 
        return 0.0
    # 疑似的な方向バランス:終値の増減回数で近似
    up = (window["close"].diff() > 0).sum()
    down = (window["close"].diff() < 0).sum()
    bal = (up - down) / max(1, (up + down))
    rng = (window["close"].iloc[-1] - window["low"].min()) / max(1e-6, (window["high"].max() - window["low"].min()))
    speed = window["tick_volume"].mean()
    # 標準化は省略(シンプル例)
    score = 0.6*bal + 0.3*rng + 0.1*(speed/ max(1, s["tick_volume"].mean()))
    return float(score)

def decide_side(score, thresh=0.6):
    if score >= +thresh: return 1  # buy
    if score <= -thresh: return -1 # sell
    return 0

# 実売買:9:46〜9:50でエントリー、10:00±2分でクローズの雛形
def run():
    connect()
    df = get_rates()
    score = calc_signal(df)
    side = decide_side(score)
    now = datetime.now(tz).time()
    if side != 0 and (now >= datetime.strptime("09:46","%H:%M").time()) and (now <= datetime.strptime("09:50","%H:%M").time()):
        # ロットはATRで計算(簡略化)
        atr = (df["high"] - df["low"]).rolling(14).mean().iloc[-1]
        risk_per_trade = 0.003  # 0.3%
        # 口座残高やtick valueからサイズ算出(簡略化)
        lot = max(0.01, risk_per_trade * 10 / max(0.05, float(atr)))
        request = {
            "action": mt5.TRADE_ACTION_DEAL,
            "symbol": SYMBOL,
            "volume": lot,
            "type": mt5.ORDER_TYPE_BUY if side > 0 else mt5.ORDER_TYPE_SELL,
            "deviation": 5,
            "magic": 95510,
            "comment": "NakaneBasic",
            "type_filling": mt5.ORDER_FILLING_IOC,
        }
        mt5.order_send(request)
    # 決済ロジック(時間決済)は省略

ロバスト化と拡張

  • パラメータ・ジャITTER:時間窓や閾値を±数分・±0.1でランダム化しても改善が維持されるか。
  • マルチアセット:EUR/JPY、GBP/JPYはUSD/JPYよりノイズが大きいが、指標日の除外で改善余地。
  • ボラフィルタ:VIXや米債先の瞬時変動を代理変数として外部条件を加味。

よくある失敗

  1. 固定スプレッド仮定のバックテスト。実運用で成績が崩れます。
  2. 10:00:00のバー内最良値で約定させるご都合検証
  3. 連敗時のサイズ上げ(マーチン)。ドローダウンが致命傷になります。
  4. 指標・要人発言の除外漏れ。

当日の実務チェックリスト

  • 経済カレンダー確認(9:30〜10:10)。
  • ブローカーの平均スプレッド監視。
  • 7:00〜9:30の先行トレンドと窓の有無を確認。
  • 日経先物/CFDの寄付き方向。
  • 9:35のSignalScoreとフィルタ適合性。
  • ロット計算(ATR)。
  • 10:00の時間決済と10:01〜10:10のフェード条件。

FAQ

Q. 何曜日が有利ですか?
曜日効果は時期により変動します。過去1年のデータで同様に検証し、優位性が出る曜日のみ採用してください。

Q. 指値と成行どちらが良いですか?
原則は成行。約定漏れの機会損失が大きい時間帯です。指値はスプレッド拡大時の悪化対策として控えめに。

Q. 反転(フェード)は危なくない?
SLを必ず置くこと、10:03以降の入場に限定すること、直前の加速幅に比例した小ロットにすることが前提です。

まとめ

仲値フロー戦略は、極短時間・高頻度ではない運用で収益機会を提供します。鍵は「やらない日」を見極める厳格なフィルタと、執行品質の担保です。検証・実装・運用の各段階を分離し、統計に従って粛々と回すことが再現性を生みます。

コメント

タイトルとURLをコピーしました