本稿では、東京時間の「仲値」決定(通常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前後に当日適用の対顧客レートを決めます。企業や機関の実需フローは、その前後で集中しがちです。カバー取引の偏りが短時間の需給歪みを作り、統計的なバイアスとして観測されます。
一方で以下の条件では優位性が薄れます。
- 重要指標(日本CPI、失業率、全米雇用、米CPI、FOMC声明)や要人発言が9:30〜10:10に重なる日。
- 日本・英国・米国の主要市場が祝日で流動性が低い日。
- 為替介入が観測・警戒される局面、もしくは前日からの大相場直後。
- アジア時間序盤に窓開けと一方向の過伸長がすでに起きている日。
データとシグナル設計
基本データ
- タイムフレーム:5分足(代替で1分足)。
- 期間:最低でも直近2〜3年。季節性と四半期末効果を含めるため。
- 使用値:OHLC、ティック数、可能なら出来高代替(ブローカー配信のtick volume)。
シグナル群
以下を標準化(z-score)して合成し、SignalScoreとして使います。
- ティック方向バランス(9:30〜9:45):上昇ティック割合 − 下降ティック割合。
- 直近レンジ位置:9:30〜9:45の高安に対する価格の相対位置(0〜1)。上側に張り付くほど買い優位。
- ティック速度:単位時間あたりのティック数。加速はトレンド継続寄与。
- 前場先行トレンド:7:00〜9:30の累積変化方向。過伸長なら逆張り重み。
- 株式先行指標:日経先物/CFDの寄付き方向とボラ。
フィルタ群(トレード回避条件)
- 高インパクト指標が9:30〜10:10に存在。
- 平均スプレッド > 0.4pips、もしくは瞬間拡大が連発。
- 前日対比で実効ボラ(ATR)が平常の2σ超。
- 前時間帯(9:00〜9:30)に方向が5σ以上の一方通行。
ルール定義(基本版/ブレイク版/フェード版)
基本版(先回り・反復向け)
- 9:35にシグナル群を計算。SignalScore >= +S なら買い、<= −Sなら売り、それ以外は見送り。
- 9:46〜9:50の間で成行(もしくはリミット)で建玉。
- 手仕舞いは10:00〜10:02で全決済。到達前に逆行幅が−SLに達したらカット。
- ロットはATRベースで調整(
size = k * risk_budget / ATR
)。
ブレイク版(加速追随)
- 9:50〜9:55で直近レンジを上抜け/下抜け。ティック速度が閾値超で成行エントリー。
- 10:05で時間決済、もしくはトレイリング。
フェード版(反転狙い)
- 10:00〜10:01に短期の過伸長(3〜5分でx pips以上)を検知。
- 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以下がベター。
バックテストの正しい作り方
- データ:5分足+tick volume。1分足が取れるなら尚良い。
- コスト:スプレッドは可変でモデル化。イベント時拡大を反映。
- 執行バイアス排除:9:50のブレイク検知→同バーの高値/安値で約定とするのはNG。次バー始値かスリッページを上乗せ。
- 検証法: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や米債先の瞬時変動を代理変数として外部条件を加味。
よくある失敗
- 固定スプレッド仮定のバックテスト。実運用で成績が崩れます。
- 10:00:00のバー内最良値で約定させるご都合検証。
- 連敗時のサイズ上げ(マーチン)。ドローダウンが致命傷になります。
- 指標・要人発言の除外漏れ。
当日の実務チェックリスト
- 経済カレンダー確認(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以降の入場に限定すること、直前の加速幅に比例した小ロットにすることが前提です。
まとめ
仲値フロー戦略は、極短時間・高頻度ではない運用で収益機会を提供します。鍵は「やらない日」を見極める厳格なフィルタと、執行品質の担保です。検証・実装・運用の各段階を分離し、統計に従って粛々と回すことが再現性を生みます。
コメント