この稿では、暗号資産の売買で最も見落とされやすい“見えないコスト”――スリッページを、
会計的に測り、戦略的に下げるためのスマートルーティング(Smart Order Routing; SOR)を解説します。
CEX/DEXを横断し、手数料・スプレッド・板の厚み・ガス代・失敗確率・MEVリスクまで加味した「総コスト最小化」の実践枠組みを、
アルゴの設計図と具体例で落とし込みます。
スリッページとは何か:見えない手数料の正体
スリッページは「発注時に想定した価格」と「実際の約定価格」の差です。原因は主に、
(1) 板の薄さによる価格インパクト、(2) スプレッドと流動性の偏り、(3) 執行遅延や失敗、(4) ガス代・手数料、(5) フロントランやサンドイッチなどのMEVに起因します。
これらは合算され、事後的な損益を目減りさせます。
実装損失(Implementation Shortfall)で測る
売買の基準価格(発注決定時の市場価格)と、実際の加重平均約定価格(手数料・ガス込み)の差を金額換算したものが実装損失です。
定常的にトラッキングすれば、戦略変更の効果検証が可能になります。
SORの骨子:総コストのリアルタイム最小化
SORは複数の売買場所(CEXの板、DEXのプール群)に同時アクセスし、
「期待約定価格 −(手数料+ガス代+失敗確率コスト+MEV期待損)」が最大になるルートに注文を分配します。
単一会場で大口を一撃約定させるより、小口分割×多会場同時の方が総コストが下がるケースが多く、特にアルトコインで顕著です。
最小化の目的関数(概念図)
Minimize: 総コスト = 価格インパクト + スプレッド + 手数料 + ガス + 失敗再試行コスト + MEV期待損 Subject to: スリッページ許容値, 最大ガス, 1会場あたり最大ノーション, フィル率しきい値, 時間制約
前提知識:CEXの板とDEXのプールは「性質が違う」
CEXは注文板・約定優先で価格形成されます。流動性は板の厚みと隠れ流動性(アイスバーグ等)に依存します。DEXはAMMや集中流動性(v3系)で、
価格インパクトはプールの流動性曲線とトークン量に依存します。従って、同じノーションでも最良の執行先は時々刻々と変わります。
AMMの価格インパクト直感
一定積x*y=k型では、トレード量Δxが大きいほど価格は非線形に悪化します。集中流動性では価格帯ごとの流動性に段差があり、
ルート分割(複数プール跨ぎ)が効きます。SORはこの非線形性を前提に最適な分割比率を探索します。
実践ステップ:準備・執行・検証の3章立て
1. 準備:流動性地図を作る
- 対象銘柄の主要CEX/DEXを列挙し、板の厚み・スプレッド・取引手数料・資金調達率(パーペチュアル)・最小ロット・出金手数料を整理。
- DEXは主要プール(例えばETH/USDCの複数v3プールなど)の流動性分布と、平均ガス、失敗率を記録。
- 時間帯別の出来高・ボラ・板厚の季節性(東京時間・ロンドン時間・NY時間)を週次で可視化。
2. 執行:SOR+アルゴ(TWAP/VWAP/POV)
- TWAP:時間等分で分割。ボラが高い局面で価格インパクトを抑えやすい。
- VWAP:想定出来高プロファイルに合わせて配分。出来高ピークに寄せてスリッページを削る。
- POV:リアルタイム出来高の一定比率で執行。板の急変に合わせて自動で配分を絞る/増やす。
- ハイブリッド:大枠はTWAP、局所はPOVで微調整。DEX側は最大スリッページ許容値を動的制御。
3. 検証:実装損失とKPI
- 実装損失(bps)、フィル率、平均スリッページ、再試行率、失敗時の平均コスト、ガス/ノーション比。
- 基準線:単一会場・成行一撃の結果と比較し、改善幅(bps)を毎週レビュー。
システム設計:モジュールとガードレール
主要モジュール
- マーケットデータ:複数会場の最良気配、板厚、プール状態、ガス推定、失敗率。
- ルーター:会場ごとの「期待コスト」をスコア化し、分配比率を決定。
- エグゼキュータ:指値/成行/ポストオンリー/アイスバーグ(CEX)、スワップ/ルート分割(DEX)。
- リスクガード:スリッページ許容、最大ガス、会場あたり最大ノーション、価格逸脱中断、連続失敗中断。
- MEV耐性:サンドイッチ耐性の有無、保護手数料やバンドル送信の適用可否。
スコアリング(簡易擬似コード)
for venue in venues:
expected_fill_px = venue.best_px_after_impact(qty_split)
fee = venue.taker_fee(qty_split)
gas = venue.gas_cost(qty_split) # CEXでは0扱い可
fail_cost = venue.fail_prob * retry_penalty
mev_cost = venue.mev_risk_score * mev_penalty
score[venue] = expected_fill_px + fee + gas + fail_cost + mev_cost
allocate = argmin(score) # 総コスト最小の組合せ探索(必要なら遺伝的/焼きなまし)
CEX×DEX併用テクニック
- 価格発見はCEX、最終フィルはDEX:価格の安定はCEXが早いことが多い。小口はDEXに流し、ガス/フィル率で最適化。
- 部分約定の許容:1会場での大口一撃を避け、複数会場の合算で加重平均を改善。
- DEX側のスリッページ許容:固定0.3%ではなく、ボラ・流動性・ガスを見て動的に0.05〜0.5%の範囲で更新。
- 再入札戦略:失敗時はルートとサイズを再最適化。価格ドリフトが大きい時は一時停止。
3つの具体例:数字で比較
ケースA:アルトコインを200万円で即時買い
単一CEXで成行一撃:スプレッド拡大時に+30〜80bpsのスリッページ。
SOR:CEX2会場+DEX2プールに25%ずつ分割、うちCEXはポストオンリー指値でタッチ約定、DEXは許容0.15%。
結果、平均で+12〜25bpsまで圧縮。差分はおよそ200万円×(0.80%-0.25%)= 11,000〜11,000円規模の改善。
ケースB:DEXで1,000 USDC→ETH
単一プール直スワップ:価格帯の流動性不足で滑りやすい。
SOR:v3プール3本に分割(60/30/10)+一部はUSDC→WETH→ETH経由。ガスは増えるが価格改善が勝る場合が多い。
許容0.10%で失敗が出るときは0.15%へ段階上げ。平均スリッページは0.12%→0.05%に低下。
ケースC:リバランスでのTWAP執行
5分×12バケットで分割。各バケットでPOV10%を上限に、CEX/DEXのスコア最低会場へ配分。
急な出来高増ではPOVが自動で増分配し、板が薄い時は分配を絞る。結果、実装損失は基準比で約40%縮小。
DEXならではの注意:MEVと失敗率
- サンドイッチ耐性:保護手数料やバンドル送信に対応した経路を優先(未対応ルートはスコアで減点)。
- 失敗率の扱い:失敗は「コスト」です。ガス燃焼+価格ドリフトの期待値をペナルティに反映。
- スリッページ許容の上げすぎに注意:成功率は上がるが、サンドイッチ期待損も拡大。0.05〜0.30%の間で状況別に最適化。
パラメータ最適化:時間帯×ボラ×出来高
東京仲値・ロンドンFIXなど時間帯特性でスプレッドと板厚は変化します。平均ボラが高い時間はTWAP、
出来高ピークはVWAP、突発ニュース時はPOV上限を小さくしてリスクを限定。週次でパラメータを更新し、
「スリッページ/ガス/失敗率」の3軸で多目的最適化を繰り返します。
KPIダッシュボード:改善を“見える化”
- 実測スリッページ(bps、方向別)
- 実装損失(通貨建て/円建て)
- フィル率・再試行率・失敗率
- ガス/ノーション比、手数料/ノーション比
- 会場別貢献度(どの会場が平均価格改善に寄与したか)
よくある失敗と対策
- 固定スリッページ0.5%のまま:市場状態に応じた動的制御に切り替える。
- 単一会場一撃:分割・多会場配分で加重平均を改善。
- 失敗率を無視:失敗は期待コスト。ルーティングのスコアに組み込む。
- ニュース直後に成行連打:POV上限を絞る、待機ルールを設ける。
ミニチェックリスト:明日からの運用
- 対象銘柄の主要会場ごとに「最良気配・板厚・手数料・ガス・失敗率」を表形式で常時更新。
- スリッページ許容値は0.05–0.30%で動的制御。成功率と期待損のトレードオフを毎週見直す。
- TWAP/VWAP/POVのハイブリッド。出来高ピークに配分を寄せる。
- 失敗時はルートとサイズを再最適化。連続失敗で自動停止。
- KPIダッシュボードで実装損失を必ず可視化。基準線(単一会場一撃)に対する改善bpsを追う。
付録:簡易ルーティングの疑似コード
def route(order_qty):
candidates = get_all_routes() # CEX板, DEXプールの組合せ
best = None
best_cost = float('inf')
for r in candidates:
px = estimate_avg_fill_price(r, order_qty)
fee = estimate_fee(r, order_qty)
gas = estimate_gas(r, order_qty)
fail = estimate_fail_prob(r) * retry_penalty(order_qty)
mev = estimate_mev_risk(r) * mev_penalty(order_qty)
cost = (px - mid_price) + fee + gas + fail + mev
if cost < best_cost and within_slippage(r):
best = r; best_cost = cost
return best
まとめ
スリッページは「管理すれば下げられるコスト」です。SORで会場横断・小口分割・
アルゴ執行を組み合わせ、総コスト最小化を習慣化してください。
大きなエッジは複雑なモデルではなく、地味な“継続計測と反復改善”から生まれます。


コメント