執行最適化の実務:TWAP・VWAP・POVで“滑らない”発注を設計する

取引手法
同じ数量を買うとしても、どのように市場へ出すかでリターンは数%単位で変わります。この記事では、個人でも再現できる執行最適化の基礎として、TWAP(時間加重平均)VWAP(出来高加重平均)POV(参加率)の3手法を徹底解説し、暗号資産やFXで実際に使える具体設計・ミニ実装・検証方法まで網羅します。

ターゲット読者は、裁量トレードでも発注コストを減らしたい方、ボット運用の基礎を固めたい方、または数量が増えて「滑り」板の薄さが課題になり始めた方です。

スポンサーリンク
【DMM FX】入金

なぜ執行がアルファになるのか

相場観が当たっていても、高く買って安く売る発注になれば収益は削られます。執行コストは概ね以下の和です。

  • スプレッド(bid-ask 差)
  • 手数料(taker/maker)
  • 市場インパクト(自分の発注が価格を動かす)
  • 機会損失(待ち過ぎで取り逃す)

測定には実装短縮(Implementation Shortfall; IS)が基本です。目標価格 P_0 に対し、実際の約定加重平均価格を P_exec、方向を side(買い=+1、売り=-1)とすると、IS = side × (P_exec - P_0)。買いなら小さいほど良い(P_execが安いほど良い)という指標です。

3つの基本アルゴの違い

TWAP(Time-Weighted Average Price)

指定した時間窓を等間隔で分割し、均等数量を機械的に発注します。特徴はシンプルさと実装容易性。出来高が不均一な時間帯(例:早朝の板が薄い時間)では相対的に目立ちやすくなる点に注意。

VWAP(Volume-Weighted Average Price)

市場全体の出来高パターンに合わせて割当数量を変える手法です。出来高が多い時間帯に比率を寄せるため、目立ちにくくインパクトを抑えやすい。一方で、出来高推定がブレると過不足が発生します。

POV(Participation of Volume)

板に流れる現在進行形の出来高の一定割合(例:5%)で追随します。市場の流れに合わせて自動で速くなったり遅くなったりするため、イベントや急変に対して適応的。急な出来高枯れには時間超過リスクがあるため、最長実行時間最小進捗のガードを必ず入れます。

どれをいつ使うか:判断チャート

ボラティリティ × 流動性で分岐するのが実務的です。

  • 低ボラ・高流動性:VWAP(市場のリズムに合わせる)
  • 中ボラ・中流動性:POV(参加率で適応)
  • 高ボラ・低流動性:TWAP + 厳格なリミットガード(急騰急落での暴走回避)

暗号資産では、ロンドン時間の立ち上がり(日本時間夕方)に出来高が膨らみやすく、VWAP/POVが機能しやすい一方、CPIやFOMC直前直後はスプレッド拡大と板の抜けが頻発するため、発注を止める・サイズを落とすのが定石です。

発注ガードレール(絶対に入れるべき安全装置)

  1. 価格ガード:基準価格からの乖離上限(例:買いは+0.15%まで)。成行は避け、リミット(指値)+ 期限で。
  2. 時間ガード:最大実行時間(例:60分)と、進捗のSLA(例:10分で20%以上)。
  3. 参加率上限(POVのみ):システム暴走で市場を追いかけ過ぎないよう、上限(例:8%)。
  4. 板厚しきい値:板が薄いときは自動で休止/縮小。
  5. 再試行とキャンセル:未約定は必ずキャンセル&リプレース。ドリフトを放置しない。
  6. キルスイッチ:急変(例:5分でATRの2倍変動)で即時停止。

実装短縮(IS)の測り方:ミニ例

例:BTCを100万円分、基準価格P_0 = 10,000,000円で買い開始。結果、加重平均P_exec = 10,015,000円で買えた。買いなのでIS = + (10,015,000 - 10,000,000) = +15,000円。サイズが大きいほど効くので、同じ相場観でも執行の巧拙がパフォーマンス差になります。

ステップ・バイ・ステップ:あなたの最初のTWAP

  1. を決める(例:30分)。
  2. 数量をN等分(例:30本なら1分ごとに等量)。
  3. 各本でリミットを板の最良気配±オフセットに置く(例:買いはベストアスク-0.02%)。
  4. 期限(例:20秒)で未約定はキャンセルし、次の本へ繰越。
  5. 合計のISと約定率を記録。成行一括と比べてどれだけ改善したかを可視化。

これだけで、特にアルト/薄い時間帯でのすっぽ抜け不必要な滑りが激減します。

VWAPの実務:出来高カーブの推定

VWAPは、各時刻の市場出来高の見積りが肝です。CEXの過去データや、DEXならスワップ出来高の時間分布を集計し、正規化カーブ(その日の割合)を作ります。実行中は逐次の実出来高で比率を微修正し、終盤の過不足を解消します。

シンプルな近似でも効果は出ます:「東京午前は薄く、ロンドン立ち上がりで厚く、NY序盤は厚い」。日次のボリューム・プロファイルを3~4区間に分け、配分重みを手で決めるだけでも実務水準に近づきます。

POVの実務:参加率で“市場と同化”する

POVは、最新の出来高に対して一定の比率で発注します(例:participation=5%)。実装は、1~5秒間隔で直近出来高を推定し、必要発注量 = participation × 直近出来高を限度に、板のトップに薄く指し入れていく、という流れです。

注意点は3つ:(1)上限参加率(2)最大スリッページ(3)タイムアウト。POVは事件に強い反面、枯れたときに終わらないので、時間ガードは必須です。

測定と改善:ダッシュボード設計

  • IS(円/%):基準に対する超過コスト。
  • 実効スプレッド2 × |約定価格 – 中間価格|
  • 到達率:指定時間内に完了した比率。
  • 隠れ在庫:板2~5段目の厚みを推定し、一括成行の仮想損失と比較。
  • キャンセル率:キャンセル&リプレースの適切さの指標。

改善は一度に一個。オフセット幅、期限、参加率などパラメータを1つだけ動かし、前後30~50ケース平均で有意差を確認します。

ケーススタディ:3つの典型

ケースA:BTC/USDT、ロンドン立ち上がりでの買い(VWAP)

30分間に10等分。過去の分布では前半3:後半7。指値はアスク-0.01%で置き、20秒でリプレース。結果、ISは+0.03%に収まり、成行一括の+0.11%より明確に改善。

ケースB:アルトの薄い時間帯、サイズを目立たせない(TWAP)

60分を60分割、板厚しきい値を設け、薄いときは自動休止。キルスイッチは5分ATR×2。ベンチマークは中間価格。板を壊さない設計で、約定率はやや落ちるがISは安定。

ケースC:イベント前のポジ調整(POV=3%)

直近出来高の3%で売り。最大スリッページは-0.15%、時間上限15分。乱高下でも追い過ぎないため、テールリスクを抑えつつ退出。

取引所・商品ごとの注意点

  • 暗号資産(CEX):taker/maker手数料体系とリベートを必ず勘定。板表示の遅延差があるとPOVが空振りする。
  • DEX(AMM)価格インパクトが式で明示される。小割りにするほどインパクトは指数関数的に減るが、ガス代とMEVの被弾確率が上がる。
  • FX:ブローカーによっては板情報が限定的。中間価格の計算やリクオート挙動を把握しておく。

ミニ実装:MQL4で等間隔TWAP(学習用)

以下はMT4の学習用EAの最小骨格です。等間隔に小口の指値を置き、期限でキャンセル&リプレースします(ロットやリスクはデモ環境で検証してください)。


//+------------------------------------------------------------------+
//| Simple TWAP Executor (for learning)                              |
//+------------------------------------------------------------------+
#property strict
input int   TwapMinutes = 30;
input int   Slices      = 30;
input double LotPerSlice= 0.01;
input int   ExpireSec   = 20;
input double OffsetPips = -1.0; // buy: negative => better than ask
datetime startTime;
int OnInit() {
  startTime = TimeCurrent();
  return(INIT_SUCCEEDED);
}
void OnTick() {
  // time management
  int elapsed = (int)(TimeCurrent() - startTime);
  int totalSec= TwapMinutes * 60;
  if(elapsed > totalSec) return;
  int sliceIdx = MathMin(Slices-1, (int)((double)elapsed/totalSec * Slices));
  // check open orders for this magic
  // (省略: 実稼働ではMagicNumber管理、未約定のキャンセル&リプレース、滑り/スプレッド検査)
  // price guard
  double ask = NormalizeDouble(Ask, Digits);
  double price= NormalizeDouble(ask + (OffsetPips * Point), Digits);
  // place limit buy if none for this slice (学習用の簡略ロジック)
  // (省略: 実稼働では1スライス1注文の管理テーブルを持つ)
  // Example:
  // int ticket = OrderSend(Symbol(), OP_BUYLIMIT, LotPerSlice, price, 2, 0, 0, "TWAP", 12345, 0, clrNONE);
}
    

注意:本コードは教育用のスケルトンです。実運用には、エラーハンドリング、MagicNumber管理、未約定キャンセル、価格乖離ガード、最大損失制御など多数の保護を実装してください。

VWAP・POVの実装ヒント

  • VWAP:未来の出来高は推定なので、逐次補正(後半の不足を埋める)を入れる。
  • POV:参加率 × 直近出来高を上限に、板トップ±数ティックへ置く。出来高が0なら休止。
  • いずれも:キャンセル&リプレースの周期は短くし過ぎない(板を荒らす)。

DEXでの応用:ガス・MEV・価格インパクトの三すくみ

AMMでは、短時間に小口×多数は価格インパクトを減らす一方、ガス総額MEV被弾の確率を引き上げます。1回あたりのスワップ額トランザクション本数の最適点を探る必要があります。保護手数料(MEV保護ルート)を使えるアグリゲータを選ぶのも有効です。

チェックリスト:動かす前に

  • ベンチマーク(中間価格 or 参照価格)を明確化。
  • IS/スプレッド/到達率のログ設計は先に作る。
  • 価格・時間・参加率の三重ガードを設定。
  • イベントカレンダー(CPI/FOMC等)で停止ウィンドウを事前に設定。
  • 最初は小サイズで、ケース30~50の平均で評価。

よくある失敗と対策

失敗1:期限なし指値の放置 — ドリフトで買い逃し/売り逃し。期限&リプレースを徹底。

失敗2:成行多用 — 速いが高コスト。リミット+妥協幅へ。

失敗3:POVの追い過ぎ — 出来高急増時に過大サイズ。参加率上限を入れる。

失敗4:検証なしでパラメータ変更 — 1要素ずつA/B比較、ログ必須。

発展:マルチ会場とスマート・ルーティングの入口

単一会場の最適化に慣れたら、マルチ会場での価格×板厚×手数料×レイテンシの同時最適化へ。まずは簡易ルール(到着価格 + 手数料 + 想定滑りの最小会場)から入り、後にキュー位置や実充足率を加味します。

まとめ:執行は“地味なアルファ”

相場観の当否に関わらず、執行の巧拙は恒常的に効くアルファ源です。TWAP/VWAP/POVという3本柱を土台に、ガードレールと測定の仕組みを持てば、誰でも再現性の高い改善を積み上げられます。まずはログから始め、スプレッドとISを毎回記録しましょう。

コメント

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