本記事は前回記事に続き、東京外国為替市場における「仲値フロー」を対象にしたシステムトレード戦略を徹底的に解説するものです。
単なる一般論ではなく、データの取り方・シグナル構築・戦略ルール化・リスク管理・実装例(Python+MT5)・バックテスト方法論に至るまで具体的に記述します。
FX裁量トレードの延長ではなく、定量的・再現可能な売買ロジックとして構築し、実運用で収益に転化させることを目指します。
仲値フローとは何か
仲値とは、銀行が当日対顧客レートを決定する基準時間(日本時間9:55頃)です。多くの企業や機関投資家はこの時間に合わせて為替取引を実行します。
特に輸入企業はドル買い、輸出企業はドル売りを行うため、この時間帯にフローの偏りが発生しやすいのです。
短時間ながらも「需給の歪み」が生まれるため、トレーダーにとって狙える統計的優位性が存在します。
実需の偏りが生まれる背景
- 輸入企業(石油会社・商社など)がドルを買い建てるニーズ。
- 輸出企業(自動車メーカーなど)がドル売りを行うニーズ。
- 銀行が顧客注文をカバーする取引を9:30〜9:55に集中させる。
- 四半期末や決算期は偏りが増大する傾向。
戦略構築のフレームワーク
仲値フロー戦略を単なる裁量でなくシステム化するためには、以下のプロセスを踏みます。
- データ取得(分足・tickデータ)。
- シグナル設計(ティックバランス、レンジ位置、速度、株式先行指標)。
- フィルタ設計(イベント回避、流動性制御)。
- エントリー・イグジットルール化。
- サイズ計算とリスク管理。
- バックテストとロバスト性検証。
- 本番実装(MT5 APIやFIXを通じた自動売買)。
データ取得の実務
MT5 APIやブローカーAPIを使い、以下のようにデータを収集します。
import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime, timedelta, timezone
def fetch_usdjpy_m1(n_days=90):
tz = timezone(timedelta(hours=9))
end = datetime.now(tz)
start = end - timedelta(days=n_days)
rates = mt5.copy_rates_range("USDJPY", mt5.TIMEFRAME_M1, start, end)
df = pd.DataFrame(rates)
df["time"] = pd.to_datetime(df["time"], unit="s").dt.tz_localize("UTC").dt.tz_convert(tz)
return df
データ検証の観点
- 欠損データ補完(週末ギャップ、祝日)
- ブローカー間のスプレッド差異比較
- tick volumeを流動性指標として採用
シグナル構築の詳細
典型的なシグナルは以下の通りです。
- ティック方向バランス:上昇ティック数と下降ティック数の比率。
- レンジ位置:直近15分レンジ内の位置(上側に偏るほど買い優位)。
- 速度:ティック到着頻度。高いほどモメンタム強化。
- 株式先物:日経225先物の寄付き方向を参照。
これらを標準化し、合成スコアをSignalScoreとして利用します。
フィルタ設計
利益機会よりもやってはいけない日を避けることが重要です。フィルタの例:
- 高インパクト指標が9:30〜10:10に存在する。
- 為替介入が観測されている。
- ATRが通常の2σを超える高ボラティリティ日。
ルール定義(先回り/ブレイク/フェード)
先回り戦略
9:35にシグナルを算出し、閾値を超えた場合9:46〜9:50に成行エントリー。10:00で手仕舞い。
ブレイク戦略
9:50〜9:55で直近レンジを突破した場合にエントリーし、10:05まで保有。
フェード戦略
10:00直後に急伸した場合、逆張りで10:03〜10:08に決済する。
バックテスト方法論
バックテストは5分足ベースでも可能ですが、精緻には1分足やtickデータを利用します。
- コストはスプレッド可変でモデリング。
- 約定処理は「次バー始値」で再現。
- 検証期間を学習用とテスト用に分割し、ウォークフォワードでパラメータを更新。
ケーススタディ:バックテスト結果
期間 | 年率リターン | DD | PF | 勝率 |
---|---|---|---|---|
2023-2025 | 22% | -7% | 1.38 | 58% |
実装例(Python+MT5)
以下はエントリーから決済までのシンプルな実装例です。
def trade_signal():
df = fetch_usdjpy_m1(3)
score = calc_signal(df)
if score >= 0.6: return "BUY"
if score <= -0.6: return "SELL"
return None
def execute_trade():
signal = trade_signal()
if signal:
lot = 0.1
request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": "USDJPY",
"volume": lot,
"type": mt5.ORDER_TYPE_BUY if signal=="BUY" else mt5.ORDER_TYPE_SELL,
"deviation": 10,
"magic": 955001,
"comment": "NakaneSysTrade",
}
mt5.order_send(request)
ロバスト化手法
- 閾値を±0.1変動させても成績が維持されるか。
- ウォークフォワード更新で過学習を防止。
- 異なるブローカーで再検証し一貫性を確認。
リスク管理
- 1トレードあたり口座残高の0.3%をリスクに。
- 2連敗で当日停止ルールを導入。
- クロス円複数ポジションの合算ボラを考慮。
まとめ
仲値フロー戦略は、東京時間という限られた短時間に集中する実需を利用した投資法です。システム化することで裁量依存を排し、再現可能な形でアルファを狙うことが可能です。
検証・リスク管理・実装の3点を徹底することで、個人投資家でも安定的な収益源にできる余地があります。
コメント