A las 18:30 mi teléfono vibró con lo que parecía, por unos cuatro segundos, la mejor noticia del mes.
7549 ventanas ≥5.0bps · mediana 30ms · p95 1060ms capturable en-región (>50ms): 24%
Traducido del robot: a lo largo de un día, mi caja de medición en Singapur había visto la misma moneda operar a dos precios distintos en dos exchanges distintos siete mil quinientas veces. Casi un cuarto de esos gaps quedaban abiertos el tiempo suficiente para que un bot normal de Python — sin Rust, sin hardware exótico, solo un server barato sentado en la ciudad correcta — pudiera estirar la mano y agarrarlos.
Un cuarto. De siete mil. Eso no es un goteo. Es una canilla.
Me dejé disfrutarlo esos cuatro segundos. Después tiré del segundo número, el que el reporte todavía no imprimía. Y la canilla resultó ser una fotografía de una canilla.
El número abajo del número
Acá está el mismo día, con la parte que importa agregada:
16.370 trades de papel simulados · rentables netos después de comisiones: 191 · 1,2%
La caja no solo cuenta los gaps. También finge operarlos — llena las dos patas treinta milisegundos después de que un gap se abre, como lo haría un bot real en-región, y después resta las comisiones que ambos exchanges cobran por entrar y salir.
Dieciséis mil trades simulados. Ciento noventa y uno hicieron plata. Uno coma dos por ciento.
El "24% capturable" era real. Los gaps eran reales, eran alcanzables, el asiento rápido que había alquilado funcionaba exactamente como prometía. Solo que no importaba, porque los gaps medían de cinco a diez milésimas de un por ciento de ancho, y cruzar los dos exchanges cuesta cerca de once milésimas de un por ciento.
Podés verlos todos. Podés alcanzarlos todos. Y casi cada uno es una moneda de diez centavos tirada en el piso detrás de un peaje de once. La caminata nunca fue el problema. El peaje siempre fue más grande que la moneda.
Los 191 ganadores también son un espejismo
"Bueno," me dije, "pero 191 trades sí pasaron el peaje. Capaz el edge es solo angosto." Así que miré quiénes eran. Caen en tres baldes, y los tres son trampas:
Los que se escaparon. INJ tiró 54 ganadores con un gap de aspecto saludable — pero en los dos segundos después del fill imaginario, el precio ya se había movido doce milésimas de un por ciento más en la dirección equivocada. El gap parecía rentable porque el mercado ya estaba corriendo lejos de él. Llenás una pata y mirás a la otra abrirse antes de llegar. Eso no es un edge que capturás; es un carterista que financiás. Hasta tiene nombre — selección adversa — el término educado para "los únicos trades que conseguís son los que vas a lamentar".
Los que no tenían edge. Solana tenía seis ganadores en un mercado genuinamente profundo — treinta y cinco mil dólares de tamaño sentados ahí, liquidez real. La ganancia, después del peaje, era un sexto de una milésima de un por ciento. Un tick de slippage y desaparece. El mercado era profundo porque era eficiente.
Los que no tenían lugar. ARB mostraba un edge "gordo" — sobre sesenta y un dólares de profundidad. No podías pasar una posición real sin comerte el libro de órdenes entero y convertir la ganancia en pérdida en el camino.
El patrón es de hierro, y es casi hermoso una vez que dejás de querer que sea de otra manera: donde había profundidad, no había edge; donde había edge, no había profundidad, o el precio ya se había ido. Eso no es un mercado con una grieta. Es la fotografía de uno perfectamente sellado.
Para qué era realmente la autopsia
Hace unas semanas alquilé un server de $6 para probar que mi viejo veredicto de "un dev solo no puede ganar carreras de latencia" estaba confundido — mi server muerto había estado en Estados Unidos, ~180 milisegundos detrás de un exchange cuyo motor vive en Singapur. Había testeado geografía y concluido cosas sobre talento. La caja de $6 me llevó a 8 milisegundos y probó que el asiento era alcanzable.
Esa prueba terminaba en una intriga: los gaps son alcanzables — pero ¿vale la pena alcanzarlos? Esta es la respuesta, y es toda la razón por la que el primer experimento importaba. Al remover la geografía como variable — al comprar de verdad el asiento rápido — pude por fin aislar la que quedaba.
No era la latencia. Era el piso de comisiones. Siempre lo había sido. Las once milésimas de un por ciento que se llevan los dos exchanges son más grandes que el edge que existe a cualquier velocidad que un humano pueda comprar. Mi server muerto de Estados Unidos nunca tuvo chance, pero no por la razón romántica ("muy lento, superado por los pros"). Por la aburrida: estaba tratando de cosechar un cultivo más chico que el costo de la cosecha. Igual que lo haría un bot perfecto. Igual que un bot escrito en Rust corriendo en el techo del propio exchange.
La reescritura de la que la medición me convenció de no hacer
Esta es la parte que quiero que se lleven los otros builders. El próximo movimiento seductor, el que cada instinto gritaba, era: estamos en 30 milisegundos, reescribilo en Rust, llegá a 5, capturá más.
La medición dijo: estarías pagando por llegar más rápido a una pérdida.
Ir de 30ms a 5ms te mueve a lo largo de una curva — y cada punto de esa curva está bajo el agua. Más rápido no levanta la curva; el peaje levanta la curva, y yo no controlo el peaje. El código más caro que no escribí este año es la reescritura en Rust que 16.370 trades de papel me dijeron que era una manera hermosa de perder plata 0,3% más rápido.
Tengo una co-ingeniera de IA en todo esto, y voy a ser honesta sobre la división del trabajo acá, porque va contra la historia usual: la máquina era la que sostenía la línea de "medí primero, reescribí nunca". Librada a mi propio entusiasmo capaz me pasaba quince días en Rust. La disciplina era un script de 200 líneas que solo contaba, corría gratis mientras yo dormía, y se negaba a dejarme confundir una canilla con la foto de una.
Cuando el éxito parece fracaso
Acá está el reencuadre que me llevó un día aceptar.
La autopsia no falló. Tuvo éxito. Fue construida para responder exactamente una pregunta — ¿los gaps rentables se agrupan a velocidades que una persona normal puede alcanzar? — y después de dieciséis mil ensayos respondió, con un tamaño de muestra que nadie puede discutir: no. 1,2%, y hasta esos son espejismos.
Un kill respaldado por 16.370 puntos de datos no es una derrota. Es la cosa más valiosa que la caja podía producir, porque la alternativa era descubrir esto lento, con plata real, un mes decepcionante a la vez. La internet del trading donde el 95% pierde me habría vendido un curso sobre este setup exacto. Yo conseguí lo opuesto a un curso: conseguí la respuesta real, y costó seis dólares y dos semanas de un server zumbando en un data center que nunca voy a ver.
El mercado era eficiente. Pagamos por saberlo con certeza en vez de pagar por saberlo lento. Si tuviera que comprimir esta empresa entera en una oración, sería esa.
La caja sigue corriendo hasta fin de mes — en parte por una muestra aún más grande, en parte porque mientras está ahí también graba cada liquidación forzada del exchange, que es una pregunta distinta para una noche distinta. Después voy a traer su base de datos a casa, apagarla, y escribirle al gap una lápida como corresponde con estos números tallados. No "creemos que esto es difícil". "16.370 trades. 1,2% vivos. La latencia nunca fue la restricción."
Los entierros por acá vienen con evidencia. Este vino con dieciséis mil piezas.
Lo que costó / lo que enseñó: $6 y dos semanas de la vida de un server / ganar y matar son la misma habilidad — medir algo con suficiente honestidad como para creerle a la respuesta incluso cuando es "no". La mayoría de los edges muere en el piso de comisiones, no en la línea de llegada; el experimento más barato que vas a correr es el que prueba que no deberías correr el caro.