Enrutamiento inteligente de órdenes en cripto: una orden, doce plazas, sin NBBO
Necesitas comprar 400 BTC. Binance tiene la mayor profundidad. OKX y Bybit muestran cada uno un tamaño decente un tick más amplio. Coinbase cotiza un mejor precio de portada, pero en USD, no en USDT. El top of book de Kraken se ve fantástico y tiene 400 milisegundos de antigüedad. Upbit es aún mejor, pero tu aprobación de cumplimiento para Corea no existe, y tampoco existen tus KRW. Un trader de renta variable que mirara este caos recurriría a un smart order router y dejaría de pensar, porque en renta variable las partes difíciles del enrutamiento se regularon dentro de la plomería hace dos décadas. En cripto, tú eres la plomería. No hay cinta consolidada, no hay regla de protección de órdenes, no hay tope de comisiones, no hay liquidación neteada — y, más fundamentalmente, no hay posibilidad de operar donde tu capital todavía no está sentado.
Este artículo trata sobre construir el router de todos modos: el libro consolidado y por qué el enrutamiento ingenuo al mejor precio contra él pierde dinero, el problema de asignación como un programa convexo que realmente puedes resolver dentro del plazo de una orden hija, la restricción de capital que hace que el SOR en cripto sea inseparable de la gestión de tesorería, el enrutamiento consciente del rol maker entre plazas, y el bucle de retroalimentación de TCA que te dice si algo de esto funciona. Es el hermano de ingeniería de Ejecución de arbitraje complejo en Rust — ese artículo cubre los nanosegundos; este cubre las decisiones.
Lo que el SOR de renta variable obtiene gratis
Vale la pena ser preciso sobre lo que el enrutamiento de renta variable estadounidense hereda de la regulación, porque cada elemento de la lista es algo que debes reconstruir o vivir sin él conscientemente.
Regulation NMS (SEC, 2005) hizo tres cosas que importan aquí. La Regla 611, la Order Protection Rule, prohíbe ejecutar a un precio peor que una cotización protegida mostrada en otra bolsa — un "trade-through" — lo que obliga a cada bróker a enrutar al mejor precio mostrado o a barrerlo con órdenes intermarket sweep. La Regla 610 limita la comisión de acceso que cualquier plaza puede cobrar por tomar una cotización protegida a $0,003 por acción, de modo que los precios mostrados son comparables entre plazas dentro de un margen de 30 mils. Y la cinta consolidada (los SIP) publica un National Best Bid and Offer, una única respuesta oficial a "cuál es el mercado".
El veredicto académico sobre esta arquitectura es que funciona sorprendentemente bien. O'Hara and Ye (2011), "Is market fragmentation harming market quality?" (Journal of Financial Economics 100(3), 459–474), examinaron acciones estadounidenses en distintos niveles de fragmentación y encontraron que las acciones más fragmentadas tenían costos de transacción más bajos y ejecuciones más rápidas, con precios más cercanos a un paseo aleatorio. Su resumen es la frase clave: la renta variable estadounidense se comporta como "un único mercado virtual con múltiples puntos de entrada". La fragmentación es inofensiva cuando los routers inteligentes más la protección contra trade-through vuelven a coser los fragmentos. Foucault and Menkveld (2008), "Competition for Order Flow and Smart Order Routing Systems" (Journal of Finance 63(1), 119–158), mostraron el mecanismo en el mercado holandés: cuando un segundo libro de órdenes límite (el EuroSETS de la LSE) entró en competencia con Euronext, la profundidad consolidada aumentó, y la oferta de liquidez en una plaza se veía directamente amortiguada por su tasa de trade-through — los routers que ignoran una plaza matan su incentivo para cotizar.
Incluso en este mundo regulado, la vista consolidada es una mentira a horizontes cortos. Ding, Hanna, and Hendershott (2014), "How Slow Is the NBBO? A Comparison with Direct Exchange Feeds" (Financial Review 49(2), 313–332), midieron el NBBO del SIP contra un NBBO construido a partir de feeds directos de las bolsas en el mismo centro de datos y encontraron desalineaciones varias veces por segundo en nombres activos, que típicamente duraban de uno a dos milisegundos — pura latencia de agregación y transporte. Mantén ese número en mente: es la versión en renta variable de un problema que es de uno a dos órdenes de magnitud peor en cripto.
Ahora borra todo eso. Cripto no tiene NBBO porque no hay SIP. No hay regla de trade-through: una plaza te ejecutará felizmente a un precio cinco ticks por debajo de la cotización de otra plaza, y nadie presenta nada. No hay tope de comisiones: las comisiones de taker van desde niveles negociados de fracciones de punto básico hasta esquemas minoristas de 10 pbs, así que el orden por precio mostrado y el orden por precio neto discrepan de forma rutinaria. Y no hay compensación consolidada: cada bolsa es su propio silo con saldos prefinanciados. Tú eres el SIP, el router y la firma de compensación, simultáneamente.
Construir el libro consolidado, y por qué el enrutamiento ingenuo al mejor precio falla
La base de ingeniería no tiene nada de glamuroso: N feeds L2 por WebSocket, manejo de huecos de número de secuencia por plaza, normalización de símbolo y de tamaño de tick, y normalización de la moneda de cotización (un libro BTC-USD y un libro BTC-USDT difieren por el tipo de cambio USDT/USD, que no es idénticamente 1,0 y ocasionalmente está muy lejos de serlo). Fusiona los libros normalizados en una escalera única ordenada por precio, etiquetando cada nivel con su plaza y — de forma crítica — la antigüedad del snapshot del que proviene. Si tu libro fusionado no lleva la antigüedad de la cotización por plaza como campo de primera clase, has construido un salvapantallas, no un router.

El router ingenuo recorre esta escalera fusionada de forma codiciosa: primero el mejor precio neto. Falla por tres razones distintas, y vale la pena mantenerlas separadas porque las soluciones son diferentes.
Cotizaciones obsoletas y sesgo de latencia. Tus plazas no entregan datos con la misma latencia. Un feed colocalizado puede tener 3 ms de antigüedad cuando actúas sobre él; un WebSocket público de una plaza en otro continente puede tener 300 ms de antigüedad. El top of book fusionado es, por tanto, un compuesto de pasados diferentes. Cuando BTC se mueve 10 pbs en 200 ms — algo rutinario — las cotizaciones de la plaza obsoleta parecen sistemáticamente atractivas exactamente en el lado equivocado. Enrutar hacia ellas te compra una carrera que ya perdiste: la cotización desapareció, tu IOC vuelve vacío o parcialmente ejecutado, y para cuando vuelves a enrutar, las plazas frescas ya se han reajustado. Este es el problema de desalineación de 1–2 ms del SIP de Ding–Hanna–Hendershott, salvo que tus desalineaciones duran cientos de milisegundos y nadie está obligado a honrar nada.
Liquidez fantasma. Sumar el tamaño mostrado entre plazas sobreestima, porque el mismo inventario de un market maker se cotiza en varios sitios a la vez. Van Kervel (2015), "Competition for Order Flow with Fast and Slow Traders" (Review of Financial Studies 28(7), 2094–2127), documentó esto en renta variable fragmentada: una operación en una plaza va seguida en milisegundos de cancelaciones considerables de órdenes límite en plazas competidoras, exactamente como predice un modelo donde proveedores de liquidez rápidos cotizan tamaño duplicado en todas partes y retiran las copias en cuanto una es ejecutada. Los market makers de cripto ejecutan el mismo libreto en Binance/OKX/Bybit, así que la profundidad consolidada accesible es materialmente menor que la profundidad consolidada mostrada, y el faltante crece con cuán secuencial (en lugar de simultáneamente) golpeas las plazas. Si tu router envía órdenes hijas de una plaza a la vez, esperando la confirmación de ejecución de cada una, te estás granjeando a ti mismo: cada ejecución le señala al resto de la calle que cancele.
Las comisiones reordenan la escalera. Una plaza que muestra el mejor precio bruto con una comisión de taker del 7,5 pbs es a menudo el peor precio neto del libro. Esto suena demasiado obvio para decirlo, y sin embargo el enrutamiento por "mejor precio mostrado" es exactamente lo que implementan la mayoría de los routers cripto de primera generación (y varios productos de proveedores). La comparación neta de comisiones es el umbral mínimo; el artículo hermano sobre comisiones y rebates maker-taker cubre la matemática de comisiones por plaza, la dinámica de niveles VIP, y por qué tu nivel de comisión marginal — no la etiqueta — pertenece al router.
La optimización de enrutamiento
Formalicemos el problema de la orden hija. Debes comprar una cantidad ahora, negociable, entre plazas . Sea el precio ask marginal de la plaza tras consumir unidades de su libro (una función escalonada no decreciente a partir del snapshot L2), su comisión de taker, y una penalización por unidad por obsolescencia y selección adversa en la plaza (calibrada más abajo, a partir de tus propios markouts). La asignación resuelve
Cada es convexa (integral de una función no decreciente, más un término lineal), así que el problema es convexo, y las condiciones KKT cuentan toda la historia: existe un umbral tal que
y para las plazas que no reciben nada. En palabras: vierte la orden entre plazas como agua, igualando el costo marginal total en todo lugar donde operas. Una plaza queda excluida exactamente cuando su primera unidad — mejor precio, más comisión, más penalización por obsolescencia — es peor que la unidad marginal en otro sitio.

Para libros de función escalonada, la solución de water-filling se calcula mediante un recorrido codicioso sobre la escalera fusionada ajustada por comisiones y penalizaciones — así que el recorrido codicioso en profundidad no está mal per se; es la solución exacta siempre que recorras de forma codiciosa los costos marginales netos con tamaños recortados, no los precios brutos mostrados. Esa distinción es toda la diferencia entre un router y un salvapantallas.
El tratamiento canónico del problema general es Cont and Kukanov, "Optimal order placement in limit order markets" (Quantitative Finance 17(1), 21–39, 2017; arXiv:1210.1625). Formulan la colocación de órdenes entre plazas — incluyendo la división entre órdenes límite y órdenes de mercado, comisiones y rebates, y una penalización por riesgo de ejecución — como una optimización convexa, derivan una forma cerrada explícita para la división límite/mercado en una sola plaza, y dan un algoritmo de aproximación estocástica para el caso multiplaza que calcula una asignación entre doce bolsas en menos de 200 ms. El marco es anterior a las criptomonedas pero se transfiere casi sin cambios, porque nunca asumió un NBBO de entrada — solo asumió libros por plaza, comisiones por plaza, e incertidumbre sobre las ejecuciones, que es precisamente la situación cripto.
Un esbozo mínimo y honesto del lado negociable (el water-fill convexo con recortes por obsolescencia):
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
Dieciséis líneas de lógica; toda la inteligencia vive en los insumos. (cuán rápido se evapora el tamaño mostrado con la antigüedad de la cotización) se calibra a partir de tus propias tasas de ejecución de IOC en función de la antigüedad de la cotización al momento del envío. proviene de los markouts por plaza (última sección). Ambos se miden, no se adivinan.
Un ejemplo trabajado. Comprar BTC entre tres plazas:
| Plaza | Comisión taker | Antigüedad de cotización | Asks (precio × tamaño) |
|---|---|---|---|
| A (profunda, fresca) | 2,0 pbs | 10 ms | 87.000 × 3,0; 87.010 × 4,0; 87.025 × 6,0 |
| B (comisión barata, obsoleta) | 1,0 pbs | 250 ms | 86.995 × 1,5; 87.015 × 2,0 |
| C (mejor titular, comisión gorda) | 7,5 pbs | 20 ms | 86.990 × 2,0; 87.000 × 3,0 |
La cinta bruta dice que C tiene el mejor ask (86.990), luego B. Ajustando por comisión, la escalera se reordena por completo: el nivel superior de C se liquida en , la peor liquidez en pantalla. El superior de B se liquida en 87.004, el de A en 87.017. Aplica un recorte por obsolescencia del 30% al tamaño mostrado de B () y haz el water-fill: 1,05 BTC del primer nivel de B, 3,0 del primero de A, 1,4 del segundo de B, 4,0 del segundo de A, 0,55 del tercero de A. Promedio total: **87.038,8: 1,9 pbs peor, unos $166 en una sola orden hija de 10 BTC, que se acumula en cada hija de cada padre todo el día. Y nota el remate: la plaza con el mejor precio mostrado en la cinta recibió cero flujo del router optimizado. En cripto, nadie te obliga a operar allí — enrutar a través de una "cotización protegida" no es un concepto — y la asignación correcta con frecuencia ignora por completo el aparente mejor precio.
Lo que el programa convexo todavía ignora: la simultaneidad (dispara todas las hijas por plaza en el mismo milisegundo, o las cancelaciones de van Kervel volverán a reajustar las plazas a mitad de ejecución), los tamaños de lote discretos y los nocionales mínimos (redondea la solución continua, corrige de forma codiciosa), y la opción de no cruzar el spread en absoluto — que es el tema de la Sección 5. Para la pregunta más profunda de cómo deberían dividirse en el tiempo los padres grandes antes de que corra toda esta lógica de plazas, ver Ejecución óptima Almgren–Chriss; el SOR decide dónde va una hija, no cuándo ocurren las hijas.
La restricción de capital: el SOR es gestión de tesorería
Todo lo anterior asumió silenciosamente que puedes operar en la plaza . En renta variable esa suposición es gratis: un solo prime broker, liquidación neteada, opera ahora y mueve el dinero después. En cripto es la restricción vinculante de todo el sistema. Las bolsas exigen saldos prefinanciados — no puedes tomar el ask de Kraken con USDT que está sentado en Binance. Así que el problema verdadero es
donde es tu saldo disponible en la plaza (en el activo de cotización para compras, en el activo base para ventas). Las condiciones KKT ahora se leen con el multiplicador sobre el tope de saldo. En las plazas topadas, : el dólar marginal allí se ejecuta más barato que el nivel de agua a nivel de mercado, y te ves forzado a empujar flujo hacia plazas más caras. Ese multiplicador no es una abstracción — es literalmente los dólares por unidad que ahorrarías si existiera una unidad más de saldo en la plaza ahora mismo. Sumado sobre tu flujo previsto, es tu disposición a pagar por una transferencia de rebalanceo, y la decisión de rebalanceo se convierte en una comparación que cualquier sistema de tesorería puede ejecutar: mueve inventario cuando
El lado derecho no es pequeño ni constante. El BTC on-chain necesita de 2 a 6 confirmaciones (20–60 minutos) antes de que las bolsas lo acrediten; las transferencias ERC-20 tardan minutos más un gas que se dispara justo cuando los mercados están ocupados; los rieles TRC-20 y Solana son más rápidos y baratos pero no son universalmente soportados; y cada bolsa añade su propia cola de procesamiento de retiros, que se estira de minutos a horas precisamente durante eventos de volatilidad, cuando tu router más quiere que el inventario se mueva. La aritmética completa de costo de transferencia — comisiones, distribuciones de latencia, y el riesgo de precio que cargas a mitad de vuelo — se desarrolla en el artículo de arbitraje de funding rate, y se transfiere textualmente: un rebalanceo de SOR es el mismo objeto que una transferencia de pata de arbitraje, costo incluido.
Esta es la razón por la que el resultado académico a internalizar aquí no es un paper de ejecución sino Makarov and Schoar (2020), "Trading and Arbitrage in Cryptocurrency Markets" (Journal of Financial Economics 135(2), 293–319). Documentaron desviaciones de precio entre bolsas que persisten durante días a semanas — incluyendo la "prima kimchi" coreana que superó el 40% a principios de 2018 — y mostraron que los costos de transacción no pueden explicarlas; el capital de arbitraje lento y con controles de capital sí puede. Las plazas cripto no son el "único mercado virtual con múltiples puntos de entrada" de O'Hara–Ye. Son piscinas parcialmente segmentadas conectadas por tuberías lentas y costosas, y tu router vive dentro de esa segmentación. Un SOR cripto sin un modelo de tesorería es un SOR de renta variable disfrazado.

En la práctica esto se convierte en un controlador de dos escalas temporales. El bucle rápido (milisegundos) resuelve el water-fill restringido dentro de los saldos actuales, en cada orden hija. El bucle lento (minutos a horas) observa la serie temporal de precios sombra y el flujo previsto, y programa transferencias cuando el componente persistente de supera el umbral de costo de transferencia — con histéresis, porque hacer rebotar inventario entre plazas por ruido es la forma de donarle tu edge a la red de Tron. Las mesas institucionales comprimen el problema con liquidación fuera de bolsa (Copper ClearLoop, Ceffu MirrorX): el colateral se aloja con un custodio y se refleja en las plazas, lo que reduce dramáticamente la latencia de transferencia para las plazas soportadas — estrecha la restricción, pero no la elimina, e introduce su propia línea de riesgo de contraparte.
Enrutamiento consciente del rol maker y juegos de cola entre plazas
Un router que solo cruza spreads está dejando sin comprar la liquidez más barata: la propia. El marco de Cont–Kukanov ya contiene la respuesta — su forma cerrada de una sola plaza divide una orden entre publicar y tomar en función de comisiones, posición en cola, y aversión al riesgo de ejecución — y la versión multiplaza lo generaliza: publica pasivamente en las plazas donde (comisión maker, longitud de cola, probabilidad de ejecución dentro del plazo de la hija) dominan, toma en las plazas donde la inmediatez es barata, y trata el remanente pasivo no ejecutado como flujo que reingresa a la optimización de taker en el plazo límite.
Dos particularidades específicas de cripto hacen esto más rico que la versión de renta variable.
Perseguir comisiones es una trampa medida. 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)), mostraron que los brókeres estadounidenses que enrutaban órdenes límite a las plazas con mayor rebate entregaban ejecuciones mediblemente peores — tasas de ejecución más bajas, peor calidad realizada — porque la plaza que paga el rebate es donde también se sienta la orden de todos los demás buscadores de rebate: la cola más larga, las ejecuciones más adversas. El análogo cripto es exacto. La plaza que paga el mejor rebate de maker atrae las cotizaciones pasivas de todos los market makers; tu orden se une a una cola profunda y se ejecuta predominantemente cuando el precio está a punto de atravesarte. La economía maker neta-de-markout por plaza (siguiente sección) clasifica rutinariamente a las plazas en sentido opuesto a sus esquemas de comisiones.
El sesgo de latencia es un juego de dos caras. El mismo flujo de información entre plazas que van Kervel documentó como cancelaciones defensivas es, del otro lado, una señal ofensiva: una operación en el top of book de Binance predice operaciones y cancelaciones en el nivel correspondiente de OKX dentro de milisegundos. Un router consciente del rol maker debe, por tanto, (a) reajustar sus órdenes en reposo ante eventos de otras plazas — anclándose a un microprecio entre plazas, no al mid local — o se convierte en la contraparte lenta que los arbitrajistas entre plazas cazan; y (b) puede jugar el juego deliberadamente: publicar en la plaza que va rezagada, cubrirse en la plaza que lidera en el momento de la ejecución. Eso es arbitraje de cola entre plazas, y es la misma estructura de latencia explotada en la ejecución de arbitraje entre bolsas, solo que embebida dentro de un mandato de ejecución en lugar de un libro de stat-arb. El requisito operacional es idéntico: el evento de ejecución en la plaza A y la orden de cobertura hacia la plaza B deben vivir en la misma ruta de código de un solo dígito de milisegundos, o el edge le pertenece a alguien más.
Medir la calidad del enrutamiento: markouts y tablas de clasificación
Los routers de renta variable están disciplinados por la divulgación de la Regla 605/606. Nada disciplina al tuyo salvo tu propio TCA — el marco de implementation shortfall y TCA es el marcador; aquí está la porción específica del router.
La medición atómica es el markout por plaza: para cada ejecución, registra el mid (consolidado, corregido por latencia) en para , con signo tal que negativo significa que el mercado se movió en contra de tu ejecución. Agrégalo en una tabla de clasificación total:
| Plaza | Cuota de ejecución taker | Spread efectivo (pbs) | Comisión (pbs) | Markout 1s (pbs) | Costo total (pbs) |
|---|---|---|---|---|---|
| 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 |
La columna de comisión dice que B es la plaza barata. La columna de costo total dice que B es la plaza cara: sus cotizaciones obsoletas te ejecutan de forma selectiva cuando el mercado ya se está moviendo a través de ellas, y el markout de 1 segundo cobra la factura. Esta inversión — clasificación por comisión versus clasificación por costo efectivo — es el hallazgo más consistente cuando las mesas construyen esta tabla por primera vez, y es exactamente el número que pertenece de vuelta al router: la penalización del programa convexo es el déficit de markout persistente por plaza, medido, suavizado y actualizado. El router y el TCA forman un bucle cerrado, o ninguno de los dos funciona.
Una trampa metodológica: las tablas de clasificación construidas a partir de un router en vivo están contaminadas por sesgo de selección. Si el router ya envía el flujo difícil e informado a la plaza profunda y el flujo fácil a la plaza barata, los markouts de la plaza profunda se ven injustamente mal. La solución limpia es la aleatorización deliberada — enrutar unos pocos por ciento de las hijas de forma uniformemente aleatoria (un router -greedy, que los quants reconocerán como un bandit con un prior de optimización convexa) — de modo que exista un contrafactual. Cuesta puntos básicos en la porción aleatorizada y es la única forma de demostrar que el otro 95% del flujo está bien enrutado.
La pila, entonces: un libro consolidado honesto en latencia; un water-fill convexo sobre costos marginales netos con parámetros medidos de evaporación y toxicidad; un bucle rápido restringido por saldo cuyos precios sombra impulsan un bucle lento consciente del costo de transferencia; colocación pasiva que respeta las colas y el flujo de información entre plazas; y un TCA aleatorizado y basado en markouts que retroalimenta cada parámetro. Ninguno de estos componentes es individualmente profundo. El sistema sí lo es — porque en cripto, a diferencia de la renta variable, ningún regulador construyó ninguna capa de esto por ti, y el mercado cobra 2 pbs por orden hija, para siempre, hasta que lo hagas tú.
Authors
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.