📝

Draft article

This draft is visible to admins and superusers only. Sign in with an authorized account.

← 記事一覧に戻る
July 22, 2026
読了時間: 5分

暗号資産のスマートオーダールーティング: 一つの注文、十二の取引所、NBBOなし

暗号資産のスマートオーダールーティング: 一つの注文、十二の取引所、NBBOなし
#執行
#スマートオーダールーティング
#マーケットマイクロストラクチャー
#流動性フラグメンテーション
#crypto
#quant
#python
#TCA

あなたは400 BTCを買う必要がある。Binanceが最も厚い板を持っている。OKXとBybitはそれぞれ1ティック外側にまずまずのサイズを提示している。Coinbaseはより良い表示価格を提示しているが、それはUSDT建てではなくUSD建てだ。Krakenの最良気配は素晴らしく見えるが、400ミリ秒古い。Upbitはさらに良いが、韓国向けのコンプライアンス承認はそもそも存在しないし、KRWの持ち高もない。この惨状を前にした株式トレーダーなら、スマートオーダールーターに手を伸ばしてそれ以上考えることをやめるだろう。なぜなら株式の世界では、ルーティングの難しい部分は20年前に規制によって配管の中に埋め込まれたからだ。暗号資産の世界では、あなた自身が配管なのだ。統合テープはなく、注文保護ルールもなく、手数料上限もなく、ネッティング決済もない — そして最も根本的には、資本がまだそこに置かれていない場所では取引すらできない。

この記事は、それでもルーターを構築することについて書いている。統合オーダーブックと、それに対する素朴な最良価格ルーティングがなぜ損をするのか。子注文の締め切りの中で実際に解ける凸計画としての配分問題。暗号資産のSORを財務管理と切り離せないものにする資本制約。取引所をまたいだメイカーを意識したルーティング。そして、これらすべてが機能しているかどうかを教えてくれるTCAのフィードバックループ。これはRustによる複雑な裁定取引の執行の工学的な兄弟記事だ — あちらの記事がナノ秒を扱うのに対し、こちらは意思決定を扱う。

株式のSORがタダで手にしているもの

米国株式のルーティングが規制から何を受け継いでいるかを正確に把握しておく価値がある。なぜなら、そのリスト上のすべての項目が、あなたが再構築するか、意識的に持たずに済ませるかしなければならないものだからだ。

Regulation NMS(SEC、2005年)はここで重要な3つのことを行った。ルール611、いわゆるOrder Protection Ruleは、他の取引所で表示されている保護気配より悪い価格での約定 — 「トレードスルー」 — を禁止しており、これによりすべてのブローカーは最良表示価格へルーティングするか、インターマーケット・スイープ注文でそれを掃討するかのいずれかを強制される。ルール610は、保護気配をテイクする際に取引所が請求できるアクセス手数料の上限を1株あたり0.003ドルに定めており、これにより表示価格は取引所間で30ミルの範囲内で比較可能になる。そして統合テープ(SIP群)は、単一の公式な「市場とは何か」への答えであるNational Best Bid and Offerを公表する。

このアーキテクチャに対する学術的な評価は、驚くほどうまく機能しているというものだ。O'Hara and Ye(2011)、"Is market fragmentation harming market quality?"(Journal of Financial Economics 100(3)、459–474)は、フラグメンテーションのレベルが異なる米国株式を調査し、フラグメンテーションが進んだ銘柄ほど取引コストが低く、約定が速く、価格がランダムウォークに近いことを発見した。彼らの要約こそが鍵となる一節だ。米国株式は「複数の入口を持つ単一の仮想市場」として振る舞う。スマートルーターとトレードスルー保護がフラグメントを再び縫い合わせている限り、フラグメンテーションは無害なのだ。Foucault and Menkveld(2008)、"Competition for Order Flow and Smart Order Routing Systems"(Journal of Finance 63(1)、119–158)は、オランダ市場でそのメカニズムを示した。第二の指値注文board(LSEのEuroSETS)がEuronextに対抗して参入した際、統合された板の厚みは増加し、ある取引所での流動性供給は、そのトレードスルー率によって直接的に抑制された — ある取引所を無視するルーターは、その取引所が気配を出すインセンティブを殺してしまう。

この規制された世界においてさえ、統合ビューは短い時間軸では嘘をつく。Ding、Hanna、and Hendershott(2014)、"How Slow Is the NBBO? A Comparison with Direct Exchange Feeds"(Financial Review 49(2)、313–332)は、SIPのNBBOを、同じデータセンター内で取引所の直接フィードから構築したNBBOと比較測定し、活発な銘柄では1秒間に何度も、典型的には1〜2ミリ秒続く乖離を発見した — これは純粋な集約・伝送遅延によるものだ。この数字を覚えておいてほしい。これは、暗号資産では1〜2桁悪化する問題の株式版なのだ。

さて、これをすべて消し去ろう。暗号資産にはSIPが存在しないため、NBBOも存在しない。トレードスルー・ルールもない。ある取引所は喜んで、別の取引所の気配より5ティックも通過した価格であなたを約定させ、誰も何も届け出ない。手数料上限もない。テイカー手数料は、交渉で決まる1ベーシスポイント未満のティアから、リテール向けの10bpsのスケジュールまで幅がある。そのため表示価格順ネット価格順は日常的に食い違う。そして統合クリアリングもない。すべての取引所は、事前入金された残高を持つ独自のサイロだ。あなたがSIPであり、ルーターであり、そしてクリアリングファームでもある — すべて同時に。

統合オーダーブックの構築、そして素朴な最良価格ルーティングが失敗する理由

エンジニアリングの土台部分は地味なものだ。N本のWebSocket L2フィード、取引所ごとのシーケンス番号ギャップ処理、シンボルとティックサイズの正規化、そして建値通貨の正規化(BTC-USDの板とBTC-USDTの板は、1.0とは限らず、時に大きく異なるUSDT/USDレート分だけ差異がある)。正規化した板を一つの価格順ラダーにマージし、すべての気配レベルにその取引所と — 決定的に重要な — そのスナップショットの経過時間をタグ付けする。もしマージした板が取引所ごとの気配経過時間をファーストクラスのフィールドとして持っていないなら、あなたが作ったのはルーターではなくスクリーンセーバーだ。

取引所をまたいだ統合オーダーブック、古い気配と幻の流動性がハイライトされている

素朴なルーターは、このマージされたラダーを貪欲に、つまりネット最良価格から順に歩いていく。これは3つの異なる理由で失敗し、その修正方法が異なるため、これらを区別しておく価値がある。

古い気配とレイテンシの偏り。 あなたが接続する取引所群は、同じレイテンシでデータを届けてはくれない。コロケーションされたフィードは、あなたがそれをもとに行動する時点で3ミリ秒古いかもしれない。別の大陸にある取引所の公開WebSocketは300ミリ秒古いかもしれない。したがってマージされた最良気配は、異なる過去の複合物なのだ。BTCが200ミリ秒で10bps動くのは日常茶飯事だが、そうなると古い取引所の気配は、まさに間違った側で系統的に魅力的に見えてしまう。そこへルーティングすることは、すでに負けたレースを買うことになる。気配は消えており、あなたのIOCは空か部分約定で返ってきて、あなたが再ルーティングする頃には新鮮な取引所はすでに再プライシングを終えている。これはDing–Hanna–Hendershottの1〜2ミリ秒SIP乖離問題そのものだが、あなたの場合の乖離は数百ミリ秒続き、誰も何かを honor する義務を負っていない。

幻の流動性。 取引所をまたいで表示サイズを合計すると過大計上になる。同じマーケットメイカーの在庫が同時に複数の場所で気配を出しているからだ。Van Kervel(2015)、"Competition for Order Flow with Fast and Slow Traders"(Review of Financial Studies 28(7)、2094–2127)は、フラグメント化された株式市場でこれを記録している。ある取引所での約定は、数ミリ秒以内に、競合する取引所での指値注文の大規模なキャンセルを引き起こす — 高速な流動性提供者があらゆる場所で重複したサイズの気配を出し、一つがヒットされたらそのコピーを引っ込めるというモデルが予測する通りだ。暗号資産のマーケットメイカーもBinance/OKX/Bybitをまたいで同じ手口を実行しているため、アクセス可能な統合された厚みは表示されている統合された厚みより実質的に少なく、この不足分は、複数の取引所を(同時にではなく)逐次的にヒットするほど拡大する。もしあなたのルーターが一度に一つの取引所ずつ、各約定確認を待ちながら子注文を送っているなら、あなたは自分自身を刈り取っていることになる。一つの約定が、残りの取引所全体に対してキャンセルせよというシグナルになるからだ。

手数料がラダーの順序を入れ替える。 生の最良価格を提示している取引所が、テイカー手数料7.5bpsを課しているなら、それはしばしば板の中で最悪のネット価格だ。これはあまりに自明に聞こえるが、実際には第一世代の暗号資産ルーター(そして複数のベンダー製品)の多くが「最良表示価格」ルーティングをそのまま実装している。ネット手数料込みの比較は最低限のハードルであり、メイカー・テイカー手数料とリベートの姉妹記事では、取引所ごとの手数料計算、VIPティアの力学、そしてなぜあなたの限界手数料ティア — 表示上の数字ではなく — がルーターに組み込まれるべきなのかを扱っている。

ルーティングの最適化問題

子注文の問題を定式化しよう。あなたは数量 QQ を、成行で、取引所 v=1,,Vv = 1,\dots,V にまたがって今すぐ買わなければならない。Av(x)A_v(x) を、L2スナップショットから得られる、取引所 vv の板を xx ユニット食った後の限界売り価格(非減少のステップ関数)、fvf_v をそのテイカー手数料、λv\lambda_v を取引所 vv における古さと逆選択に対するユニットあたりのペナルティ(後述の通り、あなた自身のマークアウトから較正する)とする。配分 q=(q1,,qV)q = (q_1, \dots, q_V) は以下を解く。

minq0,  vqv=Q    v=1VCv(qv),Cv(qv)=(1+fv)0qvAv(x)dx  +  λvqv.\min_{q \ge 0,\; \sum_v q_v = Q} \;\; \sum_{v=1}^{V} C_v(q_v), \qquad C_v(q_v) = (1+f_v)\int_0^{q_v} A_v(x)\,dx \;+\; \lambda_v\, q_v .

CvC_v は凸関数(非減少関数の積分に線形項を加えたもの)であるため、この問題は凸問題であり、KKT条件がすべてを物語る。あるしきい値 μ\mu が存在し、

Cv(qv)=(1+fv)Av(qv)+λv=μfor every venue with qv>0,C_v'(q_v^*) = (1+f_v)\,A_v(q_v^*) + \lambda_v = \mu \quad \text{for every venue with } q_v^* > 0,

そして何も配分されない取引所については Cv(0)μC_v'(0) \ge \mu となる。言い換えれば、注文を水のようにすべての取引所に注ぎ、実際に取引するあらゆる場所で限界の全込みコストを均等化するということだ。ある取引所が除外されるのは、その最初のユニット — 最良価格に手数料と古さのペナルティを加えたもの — が、他の場所の限界ユニットより悪い場合に限られる。

各取引所のコスト曲線にまたがって限界コストを均等化するウォーターフィリング配分

ステップ関数の板の場合、ウォーターフィリング解は、手数料とペナルティで調整されたマージ済みラダーを貪欲に歩くことで計算される。つまり貪欲な深さ方向の探索自体が誤りなのではない。それが厳密解になるのは、生の表示価格ではなく、ヘアカット済みのサイズを用いてネットの限界コストを貪欲に歩く場合に限る、ということだ。この区別こそが、ルーターとスクリーンセーバーの全差分である。

一般問題の規範的な扱いは、Cont and Kukanov、"Optimal order placement in limit order markets"(Quantitative Finance 17(1)、21–39、2017年;arXiv:1210.1625)にある。彼らは、指値と成行の分割、手数料とリベート、そして執行リスクに対するペナルティを含む、複数の取引所にまたがる注文配置を凸最適化として定式化し、単一取引所の指値/成行分割について明示的な閉じた形の解を導き、複数取引所の場合について、12の取引所にまたがる配分を200ミリ秒未満で計算する確率近似アルゴリズムを与えている。このフレームワークは暗号資産以前のものだが、ほぼそのまま持ち込める。なぜなら、そもそもNBBOの存在を前提にしていなかったからだ — 前提としていたのは、取引所ごとの板、取引所ごとの手数料、そして約定に関する不確実性だけであり、これはまさに暗号資産の状況そのものだ。

成行側(古さのヘアカットを伴う凸ウォーターフィル)の、最小限かつ誠実なスケッチを示す。

import math
from dataclasses import dataclass

@dataclass
class Venue:
    name: str
    asks: list[tuple[float, float]]  # (price, displayed size), sorted
    taker_fee: float                 # fractional, e.g. 0.0002 = 2 bps
    quote_age_ms: float
    kappa: float                     # phantom-liquidity decay rate, 1/ms
    lam: float                       # staleness/toxicity penalty, $ per unit

def allocate(venues: list[Venue], Q: float):
    ladder = []  # (marginal all-in cost, accessible qty, venue)
    for v in venues:
        surv = math.exp(-v.kappa * v.quote_age_ms)  # P(level still there)
        for price, size in v.asks:
            cost = price * (1.0 + v.taker_fee) + v.lam
            ladder.append((cost, size * surv, v.name))
    ladder.sort()

    fills, remaining = {}, Q
    for cost, qty, name in ladder:
        take = min(qty, remaining)
        fills[name] = fills.get(name, 0.0) + take
        remaining -= take
        if remaining <= 1e-12:
            break
    return fills, remaining  # remaining > 0 => book too thin: slice parent

論理としては16行しかない。すべての知性は入力の中に宿っている。κ\kappa(気配の経過時間とともに表示サイズがどれだけ速く蒸発するか)は、送信時点での気配経過時間の関数として、あなた自身のIOC約定率から較正する。λv\lambda_v は取引所ごとのマークアウト(後のセクション)から得る。どちらも推測ではなく、実測されたものだ。

具体例。 3つの取引所にまたがって Q=10Q = 10 BTCを買う場合を考える。

取引所 テイカー手数料 気配の経過時間 売り気配(価格 × サイズ)
A(厚く、新鮮) 2.0 bps 10 ms 87,000 × 3.0; 87,010 × 4.0; 87,025 × 6.0
B(手数料は安いが古い) 1.0 bps 250 ms 86,995 × 1.5; 87,015 × 2.0
C(見出し上は最良、手数料は太い) 7.5 bps 20 ms 86,990 × 2.0; 87,000 × 3.0

生のテープではCが最良の売り気配(86,990)、次いでBとなる。手数料を調整するとラダーは完全に入れ替わる。Cの最良レベルはネットで 86,990×1.00075=87,05586{,}990 \times 1.00075 = 87{,}055 となり、これは画面上で最悪の流動性だ。Bの最良レベルはネットで87,004、Aは87,017となる。Bの表示サイズに30%の古さのヘアカットを適用し(eκ250ms0.7e^{-\kappa \cdot 250\text{ms}} \approx 0.7)、ウォーターフィルを行うと、Bの最初のレベルから1.05 BTC、Aの最初のレベルから3.0、Bの二番目のレベルから1.4、Aの二番目のレベルから4.0、Aの三番目のレベルから0.55となる。全込み平均はBTCあたり87,022.2ドルだ。素朴な最良表示価格ルーター — まずC、次に額面サイズのままB、そしてCの二番目のレベル — は87,038.8ドルを支払うことになる。1.9bps悪く、10 BTCの子注文一つあたり約166ドルの差であり、これが一日を通じてすべての親注文のすべての子注文で複利的に積み重なっていく。そして注目すべき点は、テープ上で最良の表示価格を持っていた取引所が、最適化されたルーターからゼロのフローしか受け取らなかったことだ。暗号資産では、誰もあなたにそこで取引することを強制しない — 「保護気配」を通じたルーティングという概念自体が存在しない — そして正しい配分は、見かけの最良価格を完全に無視することが頻繁にある。

この凸計画がまだ無視しているものは、同時性(すべての取引所向け子注文を同じミリ秒内に発射せよ。さもなければvan Kervelのキャンセルが執行の途中で取引所を再プライシングしてしまう)、離散ロットサイズと最小想定元本(連続解を丸め、貪欲に微調整する)、そして「そもそもスプレッドを跨がない」という選択肢(これは第5節のトピックだ)である。この板ロジックがすべて実行される前に、大きな親注文がどのように時間方向にスライスされるべきかというより深い問い掛けについては、Almgren–Chriss最適執行を参照してほしい。SORが決めるのは子注文がどこへ行くかであり、子注文がいつ発生するかではない。

資本制約: SORは財務管理である

ここまでの議論はすべて、あなたが取引所 vvqvq_v を取引できることを暗黙に前提としていた。株式の世界ではこの前提はタダで手に入る。単一のプライムブローカー、ネッティング決済、今取引して後で資金を動かす。暗号資産の世界では、これがシステム全体を縛る制約になる。取引所は事前入金された残高を要求する — Binance上にあるUSDTでKrakenの売り気配をリフトすることはできない。したがって真の問題はこうなる。

minq0,  qv=QvCv(qv)s.t.qvBv    v,\min_{q \ge 0,\; \sum q_v = Q} \sum_v C_v(q_v) \quad \text{s.t.} \quad q_v \le B_v \;\; \forall v,

ここで BvB_v は取引所 vv でのあなたの利用可能残高(買いなら建値資産、売りならベース資産)である。KKT条件は今や Cv(qv)=μηvC_v'(q_v^*) = \mu - \eta_v となり、ηv0\eta_v \ge 0 は残高上限に対する乗数だ。上限に達している取引所では ηv=μCv(Bv)>0\eta_v = \mu - C_v'(B_v) > 0 となる。そこでの限界の1ドルは、市場全体のウォーターレベルよりも安く執行されるはずなのに、あなたはより高価な取引所へフローを押しやることを強いられているのだ。この乗数は抽象概念ではない。ηv\eta_v とは文字通り、もし取引所 vv に残高がもう1ユニット存在すれば今この瞬間に節約できるドル/ユニットの金額だ。 これをあなたの予測フローにわたって合計すれば、それはリバランス送金に対するあなたの支払い意思額(willingness-to-pay)であり、リバランスの意思決定は、どんな財務システムでも実行できる比較に落とし込まれる。すなわち、以下が成立するときに在庫を動かす。

E ⁣[future childrenηv]  >  transfer fee+expected adverse move during transfer latency.\mathbb{E}\!\left[\textstyle\sum_{\text{future children}} \eta_v \right] \;>\; \text{transfer fee} + \text{expected adverse move during transfer latency}.

右辺は小さくも一定でもない。オンチェーンのBTCは、取引所が着金を認識するまでに2〜6回の承認(20〜60分)を必要とする。ERC-20の送金は数分に加え、市場が忙しい時にちょうどスパイクするガス代がかかる。TRC-20とSolanaのレールはより速く安価だが、普遍的にサポートされているわけではない。そしてすべての取引所が独自の出金処理キューを追加しており、これはボラティリティイベントの最中 — まさにあなたのルーターが在庫を動かしたいと最も強く望む瞬間 — に、数分から数時間へと伸びる。手数料、レイテンシの分布、そして送金中に抱える価格リスクを含む送金コストの完全な計算は、ファンディングレート裁定取引の記事で詳しく展開されており、それはそのままここに転用できる。SORのリバランスは、コスト面も含めて、裁定取引レッグの移動と同一の対象なのだ。

これが、ここで内面化すべき学術的な結論が執行に関する論文ではなく、Makarov and Schoar(2020)、"Trading and Arbitrage in Cryptocurrency Markets"(Journal of Financial Economics 135(2)、293–319)である理由だ。彼らは、2018年初頭に40%を超えた韓国の「キムチプレミアム」を含む、数日から数週間持続する取引所間の価格乖離を記録し、取引コストではこれを説明できないこと、そして資本規制を受けた動きの遅い裁定資本ならそれを説明できることを示した。暗号資産の取引所群は、O'Hara–Yeの言う「複数の入口を持つ単一の仮想市場」ではない。それらは、遅く高コストなパイプでつながれた、部分的に分断されたプールであり、あなたのルーターはそのセグメンテーションの内側で生きている。財務モデルを持たない暗号資産のSORは、株式のSORのコスプレに過ぎない。

高速ループがバランス内で配分し、低速ループが在庫を再配置する様子

実務上、これは2つの時間軸を持つコントローラーになる。高速ループ(ミリ秒単位)は、すべての子注文について、現在の残高内での制約付きウォーターフィルを解く。低速ループ(分から時間単位)は、シャドープライス ηv\eta_v と予測フローの時系列を監視し、ηv\eta_v の持続的な成分が送金コストのハードルを超えたときに送金をスケジュールする — ヒステリシスを伴って。なぜなら、ノイズをもとに取引所間で在庫をピンポンさせることこそが、あなたのエッジをTronネットワークに寄付する方法だからだ。機関投資家のデスクは、オフエクスチェンジ決済(Copper ClearLoop、Ceffu MirrorX)によってこの問題を圧縮する。担保はカストディアンのもとに置かれ、各取引所にミラーリングされる。これは対応取引所については送金レイテンシを劇的に縮小するが — 制約を狭めはするものの消し去りはせず、それ自体のカウンターパーティという項目を新たに持ち込む。

メイカーを意識したルーティングと取引所をまたいだキュー・ゲーム

スプレッドをクロスすることしかしないルーターは、最も安い流動性 — あなた自身の流動性 — を買い残していることになる。Cont–Kukanovのフレームワークにはすでにその答えが含まれている。彼らの単一取引所向けの閉じた形の解は、手数料、キューの位置、執行リスク回避度に基づいて、注文をポストとテイクに分割する。そして複数取引所版はこれを一般化する。すなわち、(メイカー手数料、キューの長さ、子注文の締め切り内での約定確率)が優位な取引所では受動的にポストし、即時性が安価な取引所ではテイクし、そして未約定の受動的な残量は、締め切り時点でテイカー最適化に再投入されるフローとして扱う。

暗号資産特有の2つのひねりが、これを株式版よりも豊かなものにしている。

手数料を追いかけることは、実測済みの罠だ。 Battalio、Corwin、and Jennings(2016)、"Can Brokers Have It All? On the Relation between Make-Take Fees and Limit Order Execution Quality"(Journal of Finance 71(5))は、指値注文を最もリベートの高い取引所にルーティングしていた米国のブローカーが、測定可能なほど悪い執行 — 低い約定率、悪化した実現品質 — をもたらしていたことを示した。理由は、リベート取引所こそ、他のあらゆるリベート狙いの注文も集まる場所だからだ。最も長いキュー、最も逆選択的な約定。暗号資産における類似現象は正確に一致する。最良のメイカーリベートを支払う取引所は、あらゆるマーケットメイカーの受動的な気配を引き寄せる。あなたの注文は厚いキューに加わり、価格があなたをトレードスルーしようとしているまさにそのときに主に約定する。取引所ごとのマークアウト差引後のメイカー経済性(次のセクション)は、しばしばその手数料スケジュールとは逆順にランク付けされる。

レイテンシの偏りは双方向のゲームだ。 van Kervelが防御的キャンセルとして記録したのと同じ取引所間の情報フローは、反対側から見れば攻撃的なシグナルでもある。Binanceの最良気配での約定は、数ミリ秒以内にOKXの対応する水準での約定とキャンセルを予測させる。したがってメイカーを意識したルーターは、(a)自らの指値注文を他の取引所のイベントに基づいて再プライシングしなければならない — ローカルのミッドではなく、取引所横断のマイクロプライスにペグする。さもなければ、それは取引所横断の裁定業者に食い物にされる遅いカウンターパーティになる。そして(b)このゲームを意図的にプレイすることもできる。遅れる取引所でポストし、リードする取引所で約定の瞬間にヘッジするのだ。これが取引所横断のキュー裁定であり、取引所間裁定取引の執行で活用されているのと同じレイテンシ構造が、統計的裁定取引のブックの代わりに執行マンデートの内側に埋め込まれているに過ぎない。運用上の要件は同一だ。取引所Aでの約定イベントと取引所Bへのヘッジ注文は、同じ1桁ミリ秒のコードパスの中に存在しなければならない。さもなければ、そのエッジは誰か他人のものになる。

ルーティング品質の測定: マークアウトとリーグテーブル

株式のルーターはルール605/606の開示によって規律付けられている。あなたのルーターを規律付けるものは、あなた自身のTCA以外に何もない。インプリメンテーション・ショートフォールとTCAのフレームワークがそのスコアボードであり、ここではその中のルーター特有の部分を扱う。

原子的な測定単位は取引所ごとのマークアウトだ。すべての約定について、Δ{100ms,1s,10s,1min}\Delta \in \{100\text{ms}, 1\text{s}, 10\text{s}, 1\text{min}\} に対して t+Δt + \Delta 時点の(統合され、レイテンシ補正された)ミッドプライスを記録し、マイナスが「市場があなたの約定に対して不利に動いた」ことを意味するように符号を付ける。これを全込みのリーグテーブルに集計する。

取引所 テイカー約定シェア 実効スプレッド(bps) 手数料(bps) マークアウト 1秒(bps) 全込みコスト(bps)
A 46% 1.4 2.0 −0.6 4.0
B 31% 1.9 1.0 −2.1 5.0
C 23% 1.2 7.5 −0.4 9.1

手数料の列を見ればBが安い取引所だと分かる。しかし全込みの列を見ればBこそが高価な取引所であることが分かる。その古い気配は、市場がすでにそれを通り抜けつつあるまさにそのタイミングで選択的にあなたを約定させ、1秒マークアウトがその請求書を回収するのだ。この逆転 — 手数料ランキング対実効コストランキング — は、デスクが初めてこのテーブルを作るときに最も一貫して見られる発見であり、まさにこの数字こそがルーターに組み込まれるべきものだ。凸計画の λv\lambda_v ペナルティとはまさに、測定され、平滑化され、更新される、取引所ごとの持続的なマークアウトの欠損分のことなのである。ルーターとTCAは閉ループを形成する。さもなければどちらも機能しない。

方法論的な落とし穴が一つある。稼働中のルーターから構築されたリーグテーブルは、選択バイアスに汚染されている。もしルーターがすでに難しい、情報を持ったフローを厚い取引所へ、簡単なフローを安い取引所へ送っているなら、厚い取引所のマークアウトは不当に悪く見えてしまう。クリーンな解決策は意図的なランダム化だ — 子注文の数パーセントを一様ランダムにルーティングする(これは ε\varepsilon-グリーディなルーターであり、クオンツであれば凸最適化を事前分布に持つバンディットとして認識するだろう)。そうすることで反事実(カウンターファクチュアル)が存在するようになる。これはランダム化されたスライス部分でベーシスポイントのコストがかかるが、残り95%のフローが適切にルーティングされていることを証明できる唯一の方法なのだ。

まとめると、このスタックは以下の要素からなる。レイテンシに誠実な統合オーダーブック。実測された蒸発率と毒性パラメータを伴う、ネット限界コストに対する凸ウォーターフィル。シャドープライスが送金コストを意識した低速ループを駆動する、残高制約付きの高速ループ。キューと取引所横断の情報フローを尊重する受動的な配置。そしてすべてのパラメータにフィードバックする、ランダム化されマークアウトに基づいたTCA。これらの要素のどれ一つとして、単体では深いものではない。しかしシステム全体としては深い — なぜなら暗号資産の世界では、株式とは違って、どの層一つとして規制当局があなたのために構築してくれてはおらず、市場はあなたがそうするまで、永遠に、子注文一つあたり2bpsを課し続けるからだ。

blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

市場の先を行く

ニュースレターを購読して、独占的なAI取引の洞察、市場分析、プラットフォームの更新情報を受け取りましょう。

プライバシーを尊重します。いつでも配信停止可能です。