Bot 戦略ログ 開発ログ

🛠️開発記録#269(2025/8/2)高頻度MM戦略のスケールアイデア【Part.2】

高頻度MMbotのスケーリングアイデアを8つまとめました。

今回の記事で扱うのは以下の4つです。

・オプション Γ(ガンマ)スキャルピング
・Statistical / Pairs Arbitrage
・DEX Concentrated-LP Rebalancing
・MEVプライオリティトレード

オプション Γ(ガンマ)スキャルピング ― 実装ガイド

目的:Γ > 0(価格変動に対して収益が凸)のポートフォリオを構築し、
underlying が動くたびに 秒〜分足のデルタヘッジ を回して “ガンマを刈り取る”
(=小さな値動きでも確定利益を積む)


1. 基本概念をおさらい

記号意味実務での解釈
Δ(デルタ)価格変動¹次感度今この瞬間の方向性リスク
Γ(ガンマ)Δ の感度“曲率” ⇒ ポジが凸なら動くほど儲かる
Θ(シータ)時間価値減衰Δヘッジで削れない “時間コスト”
ν(ベガ)IV 変化感度IV クラッシュで Γ収益が吹き飛ぶ

戦略コア

  1. Γ > 0 を確保(例:ATM オプション買い/ロング straddle/strangle)
  2. underlying が ±Δp 動くたびに、Δ をゼロに戻す(現物 or 先物で反対ポジ)
  3. 得られた スキャルピング α = Σ(Δhedge * Δp) が Θ を上回れば勝ち

2. システム全体図

graph LR
    P(Price Feed) --> D(Delta-Gamma Engine)
    O(Option Greeks Feed) --> D
    D -->|"hedge order"| R(Route Executor)
    D -->|"quote RFQ"| Q(RFQ Handler)
    R --> E(Exchange Adapter)
    Q --> E
    E --> I(Inventory Manager)
    I --> D
    M(Metrics & Alert) --> D
    M --> I

RFQ Handler は大口ヘッジを Paradigm / 0x で一括決済するときに使用。


3. モジュール詳細

モジュール主責務実装ポイント
Price Feedunderlying の tick (50 ms WS)MMで使用中のものを再利用
Option Greeks FeedΔ, Γ, Θ, ν を 250 ms 毎に pullDeribit private/get_positions
Delta-Gamma EngineΓ>0 ポート構築・Δヘッジ頻度決定アルゴ: target_Δ = 0; target_Γ ≥ Γ_min
Route Executor指値/IOC/Block Order でヘッジdual-leg ロジックそのまま
RFQ Handlersize>block_thresh で RFQ発行Paradigm, WOO Block, 0x RFQ
Inventory Manager在庫上限 & Cash/Collateral 管理hot-wallet=在庫モデル
Metrics & AlertΓ収益, Θコスト, IVリスクを SlackPrometheus/Grafana 共通基盤

4. Gamma ポジの作り方(3パターン)

手法Γ確保Θコスト流動性メモ
ATM Straddlebuy ATM Call + Put。同数。
Wing Stranglebuy OTM Call + Put。Θ小。
Calendar Spread (long near, short far)◎ (net Γ>0)横軸勝負。要 ν管理。

Γ_min は資本の 20–30 delta equivalent を目安。


5. Delta-Hedge アルゴリズム

def hedge_loop():
    while True:
        u_px = price_feed.last()
        greeks = option_feed.greeks()        # {'delta':-, 'gamma':-, ...}
        d_err = greeks['delta'] + inv.delta  # net Δ
        if abs(d_err) > cfg.delta_band:
            qty = -d_err / 1      # 1 = Δ per contract for underlying
            route_executor.exec_market(qty)  # or IOC limit
        time.sleep(cfg.hedge_interval_ms/1000)
  • delta_band:±0.3 % notional / ±n Δ でトリガ。
  • hedge_interval_ms:50–500 ms(板厚次第で可変)。
  • 在庫キャップ|inv.delta| < cap, |inv.gamma| < 1.5×target.

6. IV クラッシュ & 流動性断絶へのガード

リスクシグナルアクション
IV クラッシュiv_zscore < -2 or 24h ν PnL < -Θ*0.5Γポジ 20 %削減(RFQで一括売却)
板枯れbid_depth < depth_min for 3 shedge_interval ×2, 指値スプレッド拡大
モニタ停止feed latency > 1 sCircuit Breaker: all new hedges OFF

νリスクsell wing options (vega hedge) or long upside call spread で抑える。


7. RFQ 併用フロー

  1. size > block_thresh(例:> BTC 10 Δ相当)
  2. rfq = {"side":"SELL","inst":"BTC-PERP","qty":Δ_eq} → Paradigm WS
  3. best_quote ← 200 ms 集約 → accept → block trade
  4. Route Executor で反対 legs を同時に閉じる

ブロック MM で説明した Quote Engine をそのまま流用可。


8. KPI & 監視指標

KPI (rolling 24 h)目標Alert
Γスキャルピングα / Θ≥ 1.3 ×< 1.0 ×
net Δ 偏差≤ 0.3 % notional> 0.5 %
ν PnL> 0< 0
RFQ フィル率≥ 40 %< 20 %
最大 DD< -5 %≥ -5 %

Slack 通知例:

[GammaBot] ✅ α/Θ = 1.42 | Γ 380 | νPnL +0.004 BTC | Δ 0.02 %
[GammaBot] ⚠️ νPnL -0.002 BTC (<0)

9. PoC 14 日ロードマップ

マイルストーン
1–2Price & Greeks feed scaffolding(Deribit)
3Gamma Portfolio Builder(straddle/strangle)
4–5Delta-Hedge loop + inventory limits
6RFQ Handler接続(Paradigm Dev environ)
7–8Backtest (past 30 d) → α/Θ >1 判定
9–10Shadow Mode(Δ size 0)→ latency & fill check
11小ロット live (資本 0.5 %)
12–14IV crash / liquidity guard tune, KPI dashboard

TL;DR

  1. Γ>0 ポジ(ATM straddle など)を構築。
  2. 秒〜分足 で Δ が外れたら underlying で即ヘッジ
    → スキャルピング α 獲得。
  3. Θコスト + ガス/手数料 + νリスク を常時計測し、
    α/Θ > 1.3 が続く限りロール継続。
  4. 流動性不足や大口決済は RFQ で一撃処理。
    モジュールはほぼ MM で使っている dual-leg 発注・在庫キャップ・モニタリング の再利用で済む。
    まずは小資本で PoC を回し、α/Θ と νドローダウン が許容範囲か数字で確認する。

Statistical / Pairs Arbitrage ― 実装ガイド

目的:複数銘柄の過剰乖離を分単位で検知し、平均回帰(Mean-Revert)の瞬間に 両建て で抜く。
基本フロー

  1. ペア発掘(日次) → リアルタイム乖離検知(rolling z-score) → 同時発注(µs-級)
  2. ポジ解消:スプレッド 0 回帰 or 時間切れ/ストップに達したらイグジット

1. 全体アーキテクチャ

graph LR
    D(Data Collector) --> F(Feature Store)
    F --> P(Pairs Finder)
    P --> S(Signal Engine)
    FT(Feed Taker) --> S
    S -->|"long / short"| R(Route Executor)
    R --> E(Exchange Adapter)
    E --> I(Inventory Service)
    I --> S
    B(Backtest Engine) --> P
    B --> S
    M(Metrics Alert) --> S
    M --> I

2. データ収集 & Feature Store

項目設定実装ヒント
粒度1 s or 5 s mid-price(高ボラなら 100 ms)MM の PriceFeed をリサンプリング
保管columnar Parquet, partition = symbol/datePyArrow & DuckDB → 秒単位でも高速
特徴量log-return, z-score, rolling std(30 min)追加で volume, skew if spot & perp

3. ペア発掘ロジック(毎日 00:05 UTC)

3-1. PCA ファクタモデル

X = np.stack([log_price[s] for s in universe], axis=1)
X = (X - X.mean(0)) / X.std(0)
pca = PCA(n_components=k).fit(X)
residual = X - pca.inverse_transform(pca.transform(X))
corr = np.corrcoef(residual.T)
  • k:説明分散 80–90 %(典型的に 3-4)
  • 上位 corr < -0.2(負相関大) or > 0.8 を候補へ。

3-2. 距離メトリクス & Cointegration

  • ADF test p-value ≤ 0.05
  • Hurst exponent < 0.5
  • Mahalanobis distance < thresh → 類似歩調。

自動再計算:全ペア数 nC2 ⇒ n≈50 の universe でも ~ 1 250 ペア。DuckDB + NumPy で 30 s 内に完了。


4. シグナル生成(Signal Engine)

def spread(s1, s2):
    beta = hedge_ratio[s1,s2]          # from linear regression
    return log_price[s1] - beta*log_price[s2]

z = (spread_now - roll_mean) / roll_std
entry = abs(z) > z_entry       # e.g. 2.0
exit  = abs(z) < z_exit or t > max_hold
パラメータ典型値コメント
z_entry2.0–2.5過剰乖離検知
z_exit0.5平均回帰確認
max_hold60 min流動性喪失避け
  • 自適応バンドroll_std は 30 min EWMA、分単位で更新。
  • スリッページ調整edge_adj = z * roll_std - est_slip。edge_adj < 0 なら skip。

5. Route Executor(発注)

  1. 同時注文POST /batchOrders or multi-call SDK
  2. 注文種別:IOC / FOK、slippage ≤ 0.05 % wrapped
  3. レイテンシ最短化
    • 原資 MM Trader の gRPC 発注パイプを再利用
    • 同一 NUMA→socket pinning → µs 低減

6. Inventory & Risk

ルール具体設定
max_notional_per_pair≤ 2 % 総資本
max_open_pairs10–20
drawdown_stopDD pair ≤ -1 % → 強制 exit
diversification極端な β 重複を避ける(PCA ローディング上限 0.3)

ポジションクローズは Inventory Service で一括管理。


7. バックテスト & Online Refit

  • Backtest Engine(既存 MM の tick-sim 再利用)
    • 仮想委託 x-ray:fill ルール=BestBid|Ask ± slip。
    • パフォ指標:Sharpe > 1、Win_rate > 55 %、roll-maxDD < -5 %。
  • Walk-Forward:30 d train → 7 d test → 日次リフィット。

8. KPI & Monitoring

指標目標Slack Alert
Sharpe (30 d)≥ 1.2< 0.8
Hit rate≥ 55 %< 45 %
Avg Slippage≤ 0.05 %> 0.1 %
Max DD pair> -3 %≤ -3 %
Latency order→fill< 150 ms> 300 ms

9. PoC 14 日ロードマップ

Dayマイルストーン
1–2Collector + Feature Store pipeline (1 s bar)
3–4Pair Finder(PCA + ADF) + Daily cron
5–6Signal Engine(z-score) + unit tests
7Route Executor hook(reuse MM Trader)
8–9Historical backtest (30 d) → param tune
10–11Shadow mode:0 size / latency & fill stats
12Live min-notional 0.5 % 資本
13–14KPI dashboard + risk guards (DD stop, slip alert)

TL;DR

  1. 日次:PCA & cointegration で “今日の仲良しペア” を生成。
  2. 分単位:z-score が±2σを超えた瞬間、同時両建て → 平均回帰でクローズ。
  3. MMの高速発注・在庫管理 をそのまま流用し、Fill レイテンシ < 150 ms を確保。
  4. Backtest → Shadow → 小ロット運用で Sharpe > 1、Win_rate > 55 % が続くかを検証して本格投入へ。

DEX Concentrated-LP Rebalancing ― 実装ガイド

目標:Uniswap v3/v4・Pancake v3・Hyperliquid LPD などの CLMM (Concentrated-Liquidity Market Maker) で、
1️⃣ ズレクオート(Dynamic Spread)+ 2️⃣ 帯幅の自動再配置 を実行し、
手数料 APR を極大化しながら impermanent loss (IL) を最小化する。
新課題は ガス最適化 (L1/L2 差異)IL 事前シミュレーション

DEX Concentrated-LP Rebalancing の “そもそも”

視点内容一言で
どこでUniswap v3/v4・Pancake v3・Hyperliquid LPD など CLMM (Concentrated-Liquidity Market Maker) 型プール「価格帯を自分で決める流動性プール」
何を① 帯域(レンジ)を設定して流動性を置く → ② 価格が帯域を外れたら burn → 新しい帯域へ再配置 を自動で繰り返す「板読みMMを LP 帯に変換し、常に“価格の近く”に流動性を張り直す」
狙い1) 手数料収入を最大化(スプレッドを狭めて出来高を集める)
2) Impermanent Loss(IL) を抑える(価格乖離が進む前に撤退)
「手数料>IL を保ち続ける」
武器MMで使う
‐ スプレッド決定ロジック → 帯幅(k σ)
‐ 板厚・ボラ計測 → 再配置タイミング
既存 MM アルゴを“帯”に置き換えるだけ
課題<ul><li>ガス代:L1 は高い→リバランス頻度を抑制 or L2 へ</li><li>IL:急騰急落時に焼かれる→シミュレーションと自動退出</li></ul>コストとILが敵

仕組みを流れで見る

  1. 価格フィード取得
    • CEX や DEX オラクルで現在価格とボラσを 1 s〜1 min 間隔で取得
  2. 帯域を決定
    • 例:現在価格P、幅 = k σ (k=1〜1.5)
    • → 下限 P·(1-幅), 上限 P·(1+幅) に mint して流動性を集中
  3. 手数料を稼ぐ
    • 価格が帯域内に留まる間、トレードが起こるほど手数料が積み上がる
  4. ドrift検知 & 再配置
    • Mid が帯域中心から 20-30 % ずれたら burn → 新帯域へ mint
    • Uniswap v4 Hook や multicall で 1 Tx にまとめガス節約
  5. ILモニタ
    • シミュレーションで「手数料 < 予想IL」なら離脱 (一度トークン化)
  6. ガス/ROI ガード
    • ガスコスト / 見込み手数料 < 0.2 など閾値を満たすときだけ実行

何が嬉しいの?

従来 (固定幅 LP)Concentrated-LP Rebalancing
広い帯域に資金を薄く撒く → APR が希薄価格の近くに資金を濃く置く → 高 APR
価格乖離が進むほど IL が拡大外れたら即 burn → IL を限定
ほぼ放置だが ROI 低い自動再配置で手間はコード任せ

抑えておくリスク

  1. 急激な価格ジャンプ
    → 再配置が間に合わず IL が跳ね上がる
  2. ガス高騰
    → リバランス頻度を落とす / L2 へ逃がす
  3. 出来高低下
    → 手数料が稼げず、IL だけ抱える “負けパターン” に
  4. スマコン更新(Uniswap v4など)
    → Hook 仕様変更で bot が動かなくなる

まとめ

DEX Concentrated-LP Rebalancing は

板読み MM の「スプレッド調整」と「在庫リバランス」を
そのまま CLMM の「帯幅」と「再配置」に置き換え、
手数料で IL を上回らせる自動 LP 戦略

です。
CLMM の “自分で価格帯を決められる” 性質を活かし、常に市場の中心に流動性を集中させることで
薄利 MM より高 APR を狙いつつ、ボラが大きく動けば即帯域を移動して損失を限定します。


1. システム全体

graph LR
    P(Price Feed) --> B(Band Manager)
    V(VOL & Skew Feed) --> B
    G(Gas Oracle) --> X(Tx Router)
    B -->|"mint / burn bands"| X
    D(Data Lake) --> S(IL Simulator)
    B --> S
    X --> A(DEX Adapter)
    A --> I(Inventory & Fees)
    I --> B
    M(Metrics & Alert) --> B
    M --> I

2. モジュール詳細

モジュール主要責務実装ポイント
Price Feed100 ms mid-price(CEX best bid/ask or TWAP oracle)既存 MM PriceFeed を再利用
VOL & Skew Feed1 min EWMA σ, order-flow skewUniswap v4 Hook “TimeConcentrate” 参照 GitHub
Band Manager価格帯・幅の計算、mint/burn決定dynamic_spread → [P-w/2, P+w/2]
Gas OraclebaseFee, priorityFee, L2 gasPriceEIP-1559 or L2 RPC
Tx Routerbatch mint/burn, multicall, fee-tier 選択L2 なら multicall3 でガス削減
DEX AdapterUniswap v3/v4, Pancake v3, Hyperliquid LPDv4 では Hook 経由で一括実行 arrakis.finance
IL Simulatorforward Monte-Carlo & closed-form ILformula ΔIL = (2√r / (1+r)) – 1 cointracker.io
Inventory & Fees現在 LP ポジ・未収手数料・ガス残高LP-token 窓口をホットウォレット化
MetricsAPR, IL%, gas/fee ratio, rebalance PnLPrometheus → Grafana

3. バンド設計アルゴリズム

def compute_band(mid, vol, skew, cfg):
    # 1. width from vol  (1σ ≈ vol * sqrt(dt))
    width = cfg.k_sigma * vol * math.sqrt(cfg.dt)
    # 2. dynamic skew adjustment (buy/sell pressure)
    shift = cfg.skew_coef * skew          # skew ∈ [-1,1]
    lower = mid * (1 - width) * (1 - shift)
    upper = mid * (1 + width) * (1 + shift)
    return round_tick(lower), round_tick(upper)
パラメータ典型値解説
k_sigma1.0-1.5“1σ-1.5σ” 幅で 70-85 % 滞留
dt4 h市場状態が変わるまでの平均時間
skew_coef0.15order-flow skew を ±15 % シフト

MM の dynamic spread パラメータを width に写像しているだけ。


4. 自動 Rebalance フロー

ステップ条件アクション
1. Monitor`mid - band_center
2. Re-computecompute_band() で新帯域mint concentrated LP 新帯域
3. Gas Guardgas_cost/new_band_fee > roi_minif True → skip / delay
4. Fee Harvestuncollected_fees > fee_threshclaim fees 同 tx で複合

Uniswap v4 の Hooks を使えば burn+mint+fee-claim を 単一 Tx にまとめられ、
ガス削減 & MEV 保護が可能 Medium


5. ガス最適化 (L1 vs L2)

テクニックL1 (ETH)L2 (Arb, OP, zk)
Multicallmulticall3 で 10-20 % 削減ほぼ必須、Tx 数削減
Bundler / BuilderFlashbots + 1559可。baseFee 抑制効果小
Batch Range Update15-30 bps ガス削減negligible gas, 速度優先
TimeConcentrate Hook+α ガス増無視できる

実践指針:L1 では 4 h 毎、L2 では 1 h 毎 のリバランスが一般的。


6. Impermanent-Loss (IL) シミュレーション

  1. インパーマネント・ロス(IL)の準閉式準閉式:IL(r) = (2 * sqrt(r) / (1 + r)) - 1
    ・r はポジションを組んだ価格 P₀ に対する、現在価格 Pₜ の比率 r = Pₜ / P₀
    sqrt(r) は r の平方根です
    返り値は負の値(=損失)になる。手数料収入が IL を上回れば総合計でプラスになる見込み。
    cointracker.io
  2. Monte-Carlo
    • Generate GBM paths with σ=vol over horizon T.
    • For each path compute IL & fee income.
    • Decide k_sigma such that E[fee] - E[IL] > roi_target.
  3. Hook-based off-chain preview (Uniswap v4):
    • simulate() returns fee + IL vs gas before broadcasting.

7. リスク & ガードレール

リスクモニタ変数ガードレール
急騰急落 (“gap”)`ΔP
Long-tail ILIL_sim > IL_maxwiden band or exit
Gas SpikebaseFee > base_threshfreeze rebalances
Low Volumefees_per_hour < fee_minwiden band, harvest only

8. KPI

指標目標Alert
Fee APR (net)≥ 20 %< 12 %
IL / Fee Ratio≤ 0.6> 0.8
Avg Rebalance Gas / Fee≤ 0.2> 0.3
Band Utilization (time in-range)≥ 80 %< 60 %

Slack 通知例:

[CL-LP] ✅ APR 24.3 % | In-range 83 % | IL/Fee 0.55 | Gas/Fee 0.18
[CL-LP] ⚠️ Gas spike 220 gwei, rebalances paused

9. PoC 14日ロードマップ

DayDeliverable
1–2Price & vol feed + Band Manager prototype
3Gas Oracle + Tx Router (v3/v4)
4–5IL Simulator (closed-form & Monte-Carlo)
6One-click burn+mint Hook (Uniswap v4 Devnet)
7–8Backtest vs static LP (30 d) → param tune
9–10Shadow on L2 testnet, auto-gas / fee log
11Mainnet L2 pilot (0.3 % 資本)
12–14KPI dashboard, alert rules, ROI review

TL;DR

  1. Dynamic Spread → Band Width に単純マッピングし、mid±kσ のレンジで LP。
  2. Price drift > tol ごとに burn→mint をワンショット Tx(Uniswap v4 Hook or multicall)。
  3. リバランス前に IL シミュレーションGas / Fee ロジック を回し、
    Expected Fee – (IL + Gas) がプラスのみ実行。
  4. L1 は 4 h 周期/L2 は 1 h 周期が目安。
    まずは L2 テストネットで Shadow → 小口 live。
    Fee APR > 20 % & IL/Fee ≤ 0.6 を 2 週間キープできれば本格投入へ。

MEVプライオリティトレード― 実装ガイド

— “μs級オーダーループ” を EVM Tx + Private Bundle に置き換え、サンドイッチ/バックランで α を取る —

「MEV プライオリティトレード」とは?

要素意味キーワード
MEV (Maximal Extractable Value)ブロックを作る側 (バリデータ・ビルダー) が 「どのトランザクションをどの順番で入れるか」を操作することで、ガス手数料やブロック報酬を超えて追加で抜き取れる価値取引の 並べ替え/挿入/除外 ethereum.org
Priority Trade (プライオリティ取引)その MEV を取るために、取引の掲載順位を買いに行く行為全般
検索者(bot)は「ガスを吊り上げる」「ビルダーに私設バンドルを賄賂付きで送る」などで 自分の tx を優先実行させる。
Priority Gas Auction (PGA)、Flashbots Private Bundle MEV WikiFlashbots Docs

ざっくり言えば 「“並べ替え権” をお金で奪い合う短期トレード手法」 が MEV プライオリティトレードです。


どんな種類がある?

大分類ブロック内での相対位置典型シナリオ価値の出どころ
フロントラン (Front-run)被害者 tx の大口スワップの手前で同方向成行→直後に利確被害者のスリッページ
バックラン (Back-run)被害者 tx のプール価格が歪んだ瞬間を追従 → 次ブロックで戻り取り価格歪みα
サンドイッチ前+後の 2 txBuy⇢Victim Buy⇢Sell で往復取り両側スリッページ
PGA アービトラージ任意 (競り勝つまで)複数 bot が同じ裁定を見つけ、優先ガス競争で抜くプール間価格差
JIT 流動性Swap の直前で Mint, 直後で BurnCLMM(集中LP) に一瞬だけ入る手数料+α
清算スナイプ清算 tx の直後レバ強制決済を横取り清算報酬
オラクル操作系オラクル更新の推し上げ→清算→戻す清算/価格差

これらはすべて 「順番さえ取れれば無リスク or 超低リスク」 なので、
bot 同士が PGA(ガス吊り上げ戦) に陥りやすい仕組みです Collective Shift


仕組み:何を“買って”いるのか?

  1. 公開メンプール (lit route)
    ガス価格 -→ max gas ≒ 期待α まで入札競争。
  2. プライベートバンドル (dark route)
    ビルダーへ ブロック内挿入順位 を“賄賂”付き発注。
    • Flashbots Relay / Titan / bloXroute などを利用 Flashbots Docs
  3. Validator/Bundler がより高い贈与 (priority fee) を優先し、
    順番権を落札した bot が α(裁定利益) − 手数料 を獲得。

どうして“μs級 HFT ロジック”が効くのか?

  • 取引探索:メンプールから平均 10 ms 以内 に価格インパクトを推測
  • バンドル生成:50 ms 未満で gas, nonce, access list を計算
  • 送信:ローカルノード IPC → Builder Relay へ TCP keep-alive
    → ブロック締切まで 100–200 ms の余裕を確保

この速度要件は、あなたが既に使っている HFT-MM の μs級オーダーループ と共通で、
“REST 注文 → EVM Raw tx” に置換するだけで PoC が動きます。


価値だけでなくリスクも“大”

リスク説明主な対策
ガス焼損PGA で α を超える入札をして赤字になる期待 α /gas 比をシミュレータでチェック
規制・ToS違反UI が front-run 禁止、証券法上の市場操作に該当プロトコルごとに ToS/Ethics ガードを実装
ユーザ反感 / センサリング被害者からリライト訴訟、Builder の blacklistPrivate Order-flow (MEV-Share) を尊重
技術衝突Reorg・同梱失敗で取りっぱぐれBundle revert 条件を設定し損失ゼロ化

まとめ

  • MEV=「ブロック内並べ替えで抜ける追加価値」
  • プライオリティトレード=「その価値を取る順番権を買う競り」
  • 主な手口は Front / Back / Sandwich / PGA / 清算 / JIT など、
    すべて “取引順序 × μs レイテンシ” が勝敗を分けます。
  • 技術は 既存 HFT-MM の高速オーダーループ+ガス入札ロジック の組み合わせで流用可能。
  • ただし 規制・倫理ライン が曖昧な領域も多く、
    ToS と法規制を踏まえた撤退基準 をコードに埋め込むのが実運用の鍵。


1. 戦略概要

狙い必要シグナル収益源
サンドイッチ(Sandwich)ユーザ成行の前後に買→売/売→買を挟みスリッページを奪取①入射Tx が価格を±x bps以上動かす予測
②対面ペアの板厚
被害者のスリッページ
バックラン(Back-run)価格を動かすTxの直後で方向一致ポジを取り、次Tickで利確①ターゲットTxで価格歪み
②1–2 blkで元値回帰しやすい銘柄
Price-impact α + AMM手数料リベート

コアは order-flow 予測 × レイテンシ競争。既存 MM の µs ループを「pendingTxストリーム → Bundle送信」に差し替えれば PoC が動くようになる。


2. システム構成

graph LR
    M(Mempool Sniffer) --> C(Classifier)
    S(MEV-Share / Private OF Stream) --> C
    C -->|"victim tx & trade plan"| B(Bundle Builder)
    G(Gas Oracle) --> B
    B -->|"bundle"| R(Builder Relay)
    R --> N(Local Node RPC)
    N --> P(PnL Tracker)
    P --> A(Alert)
    E(Ethics Guard) --> C
    E --> B
  • Mempool Sniffer:geth/parity RPC の txpool.content + p2p gossip
  • MEV-Share:Flashbots private order-flowイベント Flashbots Docs
  • Builder Relayhttps://relay.flashbots.net など Flashbots Docs
  • Ethics Guard:規制・ToSフィルタ(後述)


3. オーダーフロー予測

ステップロジック実装ヒント
Tx 解読decode_input(data) → swap, addLiquidity…0x/UniV3 ABI キャッシュ
価格インパクト推定impact = size / depth(level)AMM なら Δx=... 公式
被災者判定impact > cfg.min_bps & 💸 ≥ min_notional帯域外はスキップ
方向決定Buy→Sand(Buy先行-Sell後) / Back(Buy後)ルックアップテーブル

並列化:Rust or C++ で tx feed → lock-free queue。
レイテンシ目標< 25 ms でバンドル構築。


4. Bundle Builder & Gasマネジメント

bundle = [
  my_front_tx,   # sandwichの場合
  victim_tx,     # 要同一nonce除外
  my_back_tx
]

bundle_params = {
  "txs": [tx.raw for tx in bundle],
  "block": current_block + 1,
  "minTimestamp": now,
  "maxTimestamp": now + 1200,   # 20 min
  "revertingTxHashes": []       # front/backが失敗したらbundle反転
}
relay.send_bundle(bundle_params)
  • gas_limitsimulate() → +10 %。
  • priority_feetip_coef * sqrt(pending_tx) 動的計算。
  • baseFee上限eth_feeHistory → 95%tile 超なら skip。

失敗 Tx は Bundle Cache API で即再利用 Flashbots Docs


5. レイテンシ最適化 Tips

レイヤ手法
ネットワーク100 GbE → buildersへ常時 TLS keep-alive
ノードgeth --txpool.nolocals --cache=4096 --http=false --authrpc.addr=... (IPC直結)
プロセスSniffer → Classifier → Builder を同 NUMA ソケットに配置し busy-spin
コードSIMD memcmp で ERC-20 アドレスフィルタ / 逐次 branch-less

6. Ethics & Regulation Checklist

項目必須アクションソース
OFAC/制裁リストBuilder/Relay が OFAC準拠か確認;Tx 先アドレスを SDN 再走査Figment
EU/ESMA 提言Market-manipulation懸念あり → 月次レポート保存esma.europa.eu
取引所 ToSDEXによっては“sandwich禁止”条項 → 黙認不可プロトコルdocs
1inch Network
Sushi Labs
ユーザ保護MEV-Shareなど“公開”ルートを尊重;private orderflowは侵襲しないFlashbots Docs
撤退基準①法改正・警告②Builderブラックリスト入り③hit_rate<20% ④net_PnL<0%/週

Ethics Guard コンポーネントで Txごとに K/KYC リスト & ToS 非遵守チェック → NGなら skip。

「“sandwich(=front-running)の禁止条項」が明記されている代表的な DEX ToS 例

DEX/UI条文抜粋該当条項の主旨
1inch Network Interface (2025-07-08版)“You agree not to … use … front-running tools, sniper or arbitrage bots …1inch Networkインターフェース経由で自動 bot や front-running(=サンドイッチを含む)に利用すること自体を禁止。
Sushi.com Terms of Service (2024-10版)“Use the Services for market manipulation (such as … front running …) is prohibited.” sushi.comサービスを通じた front-running/サンド行為を “市場操作” として明確に禁止。

ポイント

  • “サンドイッチ攻撃” は法的には front-running の一形態なので、ToS では front-running tool / market-manipulation の一括禁止でカバーされるケースが多い。
  • CoW Swap や 1inch Fusion など “MEV-resistant” を謳う UI は ToS で明確に攻撃を禁じる一方、Uniswap v3/v4 のように 禁止を明文化していない UI もある(代わりに MEV FAQ でリスクを啓蒙)。

どう読み替えればよいか

  1. ToS で front-running が禁止 ⇒ サンドイッチも不可
    • bot 実装者側はインターフェースを迂回(オンチェーン直接呼び出し)しても、規約違反リスクを完全に排除できるとは限らない。
  2. ToS に禁止記載がない ⇒ “黙認” ではなく自己責任
    • コントラクト自体は permissionless でも、UI/ブランド側の利用規約違反で API Key BAN 例もある。

実運用では 「利用 UI の ToS+各国規制」 を二重に確認し、リスク低減のために

  • Private Tx Relay(Flashbots Protect / MEV-Share)
  • Intent-based DEX(CoW Swap など)
    を併用するのが無難。

7. PnL & KPI

KPI (24 h rolling)目標Alert
Hit rate (bundle inclusion成功率)≥ 40 %< 25 %
Net α / gas≥ 1.5 ×< 1.0 ×
Bundle delay (incl.block-send.block)1 blk> 2 blk
Failed bundle ratio< 15 %> 30 %
Reg-flag events0≥ 1

PnL Tracker が Flashbots/Relay receipts + eth_getTransactionReceipt でガス・報酬を集計。


8. PoC 14 日ロードマップ

Dayマイルストーン
1-2Local geth + mempool sniffer + bundle send demo
3-4Classifier α1 (swapOnly) → impact > X bps 検知
5-6Bundle Builder + Relay (simulate pass≥90 %)
7PnL Tracker + Slack 通知
8-9Shadow Mode:0 ETH bundles → inclusionラグ測定
10-11Mainnet pilot (gas-capped)・Ethics Guard稼働
12-14KPI dash、撤退基準・自動pause 実装、回帰テスト

TL;DR

  1. Mempool + MEV-Share で order-flow を先読みし、
  2. 25 ms 以内に private bundle を組んで Relay へ送信、
  3. Gas / BaseFee / Ethics Guard を通過したものだけ実行、
  4. KPI が hit≥40 %、α/gas≥1.5、規制違反0 を維持できなければ自動撤退。

既存 MM の µsオーダーループEVM bundle に差し替えるだけで PoC は作れる。
ただし 規制・道義的ライン を事前に文書化し、“やめ時” を自動化してから本格運用へ移行する必要あり。

付録:MEV プライオリティトレードの体系図

軸 ❶:取りに行く価値 (Value)
軸 ❷:抽出手段 (How it is extracted)
軸 ❸:ブロック内での位置関係 (tx ordering)

下表は研究・Flashbots 文献で頻出の分類を三軸で整理し、「優先ガス競争=Priority Trade」 に該当するものを網羅しています。

大分類サブタイプオーダー位置代表的な tx パターン価値源主なリスク出典
① Ordering-Only(Value-Diverting)Front-run
・Displacement
・Replacement
・Suppression
Victim 1 txスリッページ・手数料UI ToS違反/市場操作arXivSpringerLink
Back-runVictim 1 tx価格歪みαフィル率低cow.fi
SandwichVictim 前+後2 tx前+後 α明確な被害・規制リスクblocknative.com
Gas Priority Auction (PGA)前 / 後 (競り勝ち)1 txArbitrage差額ガス焼損
② Value-Creating & Diverting(State Change 利用)DEX アービトラージ任意1 tx または Multi-hopプライス差Revert率arXiv
Liquidation Sniping清算直前1 tx清算報酬Gas spike
JIT Liquidity (CLMM)Swap に Mint、 に Burn2 tx手数料 + αSlip逆行
③ Cross-Layer / Oracle-DrivenOracle Manipulation
(Push / Pull)
Oracle 更新 2 tx不当利得・清算Revert/追徴
Time-Bandit Reorg― (reorg)ブロック再編Block報酬 + MEV検閲・規制arXiv
④ NFT / Airdrop 特化Mint SnipingMint直前1 tx即時フロア差額高競争
⑤ Cross-Chain MEVHTLC Front-run / Bridge ArbitrageChain A→B2 tx (各チェーン)レート差・手数料クロス再orgResearchGate

位置づけ早見

flowchart TD
    %% ───── Nodes ─────
    VD[Value-Diverting]
    ORD["Ordering Only\n(Sand / Front / Back)"]
    PGA[PGA]
    VDC["Value-Diverting &\nValue-Creating\n(Arb, Liq, JIT)"]
    SCM[State-Change MEV]

    %% ───── Edges ─────
    VD  --> ORD
    VD  --> PGA
    ORD --> PGA
    PGA --> VDC
    VDC --> SCM

各カテゴリの “Priority Trade” 共通要件

要件技術要素既存 MM 資産の流用
Order-Flow 事前観測Public mempool/MEV-Share feed, builder hintsμs級 observer → tx classifier
Bundle 構築 & Gas BidFlashbots Relay / MEV-Builder, dynamic tipオーダーループ→EVM Raw tx
レイテンシ最小化Local full-node IPC, busy-spin queueMM 高速 I/O ランタイム
撤退基準hit_rate, α/gas, Reg flagRisk engine (circuit breaker)

倫理・規制フレームと紐付け

グレー度該当タイプ典型的規制・ガイドライン
低 (Value-Creating)DEX アービトラージ/清算“正常化取引” として黙認されやすい
Back-run/JIT流動性利用 UI の ToS & MEV-Share との整合
高 (Value-Diverting)Front-run/Sandwich/Suppression市場操作・利用規約違反の可能性大

実装ロードマップへの落とし込み例

  1. フェーズ0: DEXアービトラージ/Liquidation(低グレー度)から実装
  2. フェーズ1: Back-run+JIT流動性 → Private order-flow優先
  3. フェーズ2: Sandbox環境で Front/Sandwich を実験、Ethics Guard と撤退ラインを自動化

参照した主なソース

  • Flashbots Research “MEV Transaction Taxonomy” (2024) arXiv
  • 1inch・Sushi ToS の front-running禁止条項例 SpringerLink
  • BitQuery / CoW Docs MEV attack explanations (front/back/sandwich) Bitquerycow.fi
  • Cross-chain MEV (front-run in atomic swaps) 新規論文 2025-06 ResearchGate

-Bot, 戦略ログ, 開発ログ