コンテンツにスキップ

執行と実効コスト

「USD/JPY 0.2 銭」は最良気配時の広告値であり、あなたの注文が実際にその価格で執行された保証ではありません。 このページは、公称スプレッドではなく、実効コスト分布(実効スプレッド、スリッページ、約定拒否時の機会損失、スワップ非対称性)として業者の取引コストを評価する枠組みを与えます。 時間帯、イベント、注文サイズ、注文種別で層化した実効分布を計測し、平均ではなく p90/p95/p99 と拒否率まで含めて評価するのが正しい姿勢です。 業者選定、バックテストのコスト仮定、短期売買の期待値評価に使います。 特にスキャルパーやデイトレーダーの収益は、この分布の尾に強く依存します。

前提の見直し

多くの入門記事は「スプレッドが狭い業者が有利」と書きます。 これは半分正しく、半分誤りです。

  • スプレッド公称値は広告値または最良気配時の Ask - Bid。業者が広告する数値。
  • スプレッド実効値は、成行注文の約定価格を同時点の中値と突き合わせて測る値。あなたが実際に払っているコスト。
  • 両者の乖離は、時間帯、注文サイズ、注文種別、市場状況で大きく変わる。

外為どっとコムの 2026 年 7 月公表資料でも、広告 USD/JPY 0.2 銭に対し、対象期間の最大値は 12.0 銭、広告適用時間の提示率は 99.53% と示されています。 広告値だけを見ると、この尾部リスクを見落とします。

実効スプレッドの定義

約定 i について、方向を side_i = +1(買い)または -1(売り)、参照中値を M_i = (Bid_i + Ask_i) / 2 とします。

  • 片道実効コスト:ci=sidei(Pexec,iMi)c_i = \text{side}_i \cdot (P_{\text{exec},i} - M_i)
  • 往復換算実効スプレッド:ESi=2ciES_i = 2 c_i

買いなら高く買うほど正、売りなら安く売るほど正、改善約定(指値より有利に約定)なら負になります。

公称値との乖離は Gapi=ESiQSi\text{Gap}_i = ES_i - QS_i、ここで QSi=AskiBidiQS_i = Ask_i - Bid_i です。

集計は平均だけでなく、中央値、p75、p90、p95、p99、最大値、マイナス比率、通貨ペア別、注文サイズ別で必ず出します。 平均は尾を隠します

時間帯別スプレッド拡大

最低限、次のバケットで層化します。

バケット特徴典型的な広告除外要因
03:00-09:00 JSTNY 引け → 東京早朝日本業者の広告適用除外時間になりやすい
09:00-10:00 JST東京入り、仲値前後実需フローで急変
16:00-18:00 JST欧州勢参加開始ロンドン初動
21:00-25:00 JSTロンドン/NY 重複流動性は厚いが指標発表で急変
NY 17:00 (JST 07:00) 前後ロールオーバー、日次メンテスワップ付与境界

BIS 2025 統計では OTC FX が 1 日 9.6 兆ドル、上位 4 拠点(英、米、シンガポール、香港)に約 75% が集中しています。 時間帯別の板の厚みは、この金融センターの稼働時間と強く結びつきます。

指標発表時の計測

米雇用統計、CPI、FOMC、日銀、ECB を発表時刻 T0 として、以下の窓で分けます。

内容
[-15, -5]発表前の平常値からの乖離
[-5, -1]直前の板薄化
[-1, +1]発表瞬間の破壊的乖離
[+1, +5]反応の初期方向
[+5, +15]二次反応

各窓で QSES、スリッページ、約定拒否率を、通常同時刻の平均との差分で比較します。 平均差の t 検定より、分位点差、ブートストラップ信頼区間、外れ値頻度差を見る方が実務的です。

スワップポイントの非対称性

スワップは通常 買 +x / 売 -y で提示され、x ≠ y です。 非対称コストは、同じ通貨ペアを両建てまたは売買反転したときに x+(y)x + (-y) がゼロにならない部分です。

日次コストの扱いは次の通りです。

SwapAsymCostd=PaydReceived\text{SwapAsymCost}_d = |\text{Pay}_d| - \text{Receive}_d

10 Lot あたり表示の業者が多いので、取引数量に比例換算します。 プラス受取、マイナス支払い、日々変動する点は明示します。

長期保有ほどこの非対称性がボディブローとして効きます。 年単位で見ると、公称スプレッドより大きなコストになるケースがあります。

スリッページの計測

以下の列を注文ごとに保存します。

client_send_ts, server_ack_ts, quote_ts,
bid, ask, mid,
side, order_type, limit_or_tolerance,
requested_price, exec_price, filled_qty,
rejected, reject_reason, latency_ms

スリッページは次のように定義します。

  • 買い:Slip=PexecPreq\text{Slip} = P_{\text{exec}} - P_{\text{req}}
  • 売り:Slip=PreqPexec\text{Slip} = P_{\text{req}} - P_{\text{exec}}

正なら不利、負なら有利です。 「順スリップ/逆スリップ」という用語は業者間で定義が揃わないため、統計上は adverse / favorable に分けます。

板取り成行 vs 指値

  • 板取り成行は「即時性を買う」ため、板の厚み不足とレイテンシで不利スリップが出る。計測は walked_book_cost = VWAP_exec - top_of_book_at_send をサイズ別に取る。
  • 指値は価格上限を決めるため不利スリップは限定されるが、未約定、部分約定、機会損失が発生する。比較する際は「約定した注文だけ」でなく、未約定後の一定時間後価格 Mt+ΔM_{t+\Delta} に対する機会損失を含めなければ公平でない。

約定拒否とリクオートの実態

  • リクオート:価格再提示(通常はより不利な価格)
  • 約定拒否:注文不成立

発生条件は、許容スリップ超過、価格失効、LP 側 last look、急変、低流動性、大口、業者の執行方式に依存します。 国内業者の一部は「有利方向のスリップは成立、不利方向は不成立」の非対称仕様を約款に明記しています(成行の逆スリップ抑制を謳う一方で、実質的に不利な相場で不成立が増える構造)。

Cartea et al. の last look 論文(arXiv:1806.04460)は、ディーラーが事後的に不利な取引を拒否できる構造をモデル化しています。 ECN 業者でも last look が入る場合があり、「ECN = 透明」は業者ごとに検証が必要です。

拒否率の統計手順

  1. 全発注を母集団とする:reject_rate=rejected/submitted\text{reject\_rate} = \text{rejected} / \text{submitted}
  2. ロジスティック回帰または GAM で Pr(reject)=f(spread,r1s,r5s,size,pair,session,event_dummy,tolerance,latency)\Pr(\text{reject}) = f(\text{spread}, |r_{1s}|, |r_{5s}|, \text{size}, \text{pair}, \text{session}, \text{event\_dummy}, \text{tolerance}, \text{latency})
  3. 拒否された注文をコストゼロ扱いにしない。拒否後に再発注したなら、最初の中値から最終約定までの差を実効コストに入れる。

通信レイテンシと VPS

  • 光ファイバは概ね 1km あたり 5.0-5.5 マイクロ秒。東京から欧米サーバへの RTT は物理的に数十から百数十 ms 級。
  • VPS は「自分に近い場所」ではなく「取引サーバに近い場所」に置く。
  • 国内店頭 FX で価格配信や注文サーバが東京近郊なら東京 VPS。MT4/MT5 ブリッジや LP が LD4(ロンドン)、NY4(ニューヨーク)なら欧米 VPS が有利な場合がある。
  • ping(ICMP)は粗い近似で、実際の注文経路とは異なる。実測は client_send_ts → server_ack_ts → exec_ts を発注ログで測る。

実効コストの合成式

単位を pips または円/1万通貨に統一して、往復換算で次のように書けます。

EffectiveCost=ES+adverse_slipfavorable_slip+commission+swap_asymper_holding+rejection_opp_cost\text{EffectiveCost} = \overline{ES} + \overline{\text{adverse\_slip}} - \overline{\text{favorable\_slip}} + \text{commission} + \text{swap\_asym}_{\text{per\_holding}} + \text{rejection\_opp\_cost}

二重計上を避けるため、次のいずれかで統一します。

  • (A) 実効スプレッドを「約定価格 vs 中値」で定義し、スリッページを別途カウント
  • (B) スリッページを「発注時表示価格 vs 約定価格」で定義し、実効スプレッドと分離

どちらでもよいですが、混在させません。

再現可能な集計ステップ

  1. すべての気配を 100ms または tick 単位で保存
  2. 全注文の発注、受信、約定、拒否ログを保存
  3. 約定ごとに最も近い発注直前気配、サーバ受信直前気配、約定直前気配を結合
  4. QSESslippagelatencyreject を計算
  5. 通貨ペア、売買、注文種別、数量、時間帯、イベント窓で層化
  6. 平均、中央値、p90/p95/p99、拒否率、改善率、不利率を出す
  7. 業者間比較では同じ時刻、同じサイズ、同じ注文種別だけを比較(異なる条件の比較は無意味)
  8. バックテストには広告スプレッドではなく、時間帯別、イベント別の実測分布から保守分位点でコストを入れる

落とし穴

  • 平均で語る:平均スプレッドが 0.3 銭でも、p99 が 5 銭あるなら、スキャルピングは実質的にその尾で成績が決まる。
  • VPS で「レイテンシ 1ms」を鵜呑み:ICMP ping と実発注 RTT は違う。
  • ゼロカット = 追証なしを安全と誤解:ゼロカットは業者の裁量履行に依存する。オフショアでは約款条項次第で無効化される(オフショア業者)。
  • スワップの非対称性を無視:キャリー狙いの長期保有では、スワップ非対称率が実効コストの大部分を占める。
  • 拒否をコストゼロで扱う:拒否率を分子から外すのは、統計上の重大なバイアス。

実効コスト評価の姿勢

短期売買(スキャルピング、デイトレ)は p95/p99p_{95} / p_{99} と拒否後再発注コストが収益を削ります。 長期保有(スイング、キャリー)はスワップ受払差が静かに効きます。

自分の平均保有時間と平均取引頻度で、支配的なコストが何かを特定してから、それを最小化する業者、時間帯、注文種別を選びます。 「平均スプレッド最狭」を追うのは、多くの場合、最適化する対象を間違えています。

参考