Jueves 2 de abril, 16:02 hora del Este. El libro paper tenía el aspecto con el que lo habíamos diseñado: largos unos $240,000 del perpetuo BTCUSDT, cortos de una cesta ponderada por beta de COIN, MSTR, MARA y RIOT, residual por debajo de $500. El job de cobertura del viernes había corrido a las 15:45 la semana anterior. El funding a las 16:00 UTC había sido un error de redondeo. Cerré sesión pensando que por fin teníamos un tramo cripto que no se limitaba a recrear la beta de Nasdaq.
El viernes era Viernes Santo. Solo me enteré porque el chat de cripto seguía publicando capturas de liquidaciones y el chat de renta variable se había quedado en silencio de esa forma concreta que significa que no hay nadie en una silla. NYSE y Nasdaq estaban cerrados. Binance no. Desde el cierre de contado del jueves hasta las 16:00 hora del Este del viernes el perpetuo había caído un 4.8%. Los cortos de renta variable no existían como mercado ese día. Eran una fila de precios del jueves en un panel de riesgo.
El bot de riesgo publicó de todos modos.
beta a cesta de cobertura: 0.04. residual 1d: −$11,184. status: NEUTRAL
Todavía tengo esa captura. Un colega la imprimió y la pegó en la nevera de la oficina que casi no usamos. El NEUTRAL verde estaba haciendo mucho trabajo. El bot calculó la beta a partir de los últimos prints de renta variable que tenía, que eran la subasta de cierre del jueves, contra un mark de BTC que llevaba moviéndose veinticuatro horas. Un mark congelado es una fotografía del jueves. Llamar cobertura a esa fotografía es el camino para entrar al fin de semana de Pascua con una posición cripto descubierta y un informe que te felicita por ello.
El lunes abrió el mercado de contado. La cesta abrió con gap a la baja, pero no un 4.8%, y no al unísono. COIN abrió −2.1%. MSTR hizo más. MARA hizo menos. Nos pasamos la mañana operando hacia un libro que había vivido una sesión extra entera que no pudimos cubrir, y entonces sacamos el backtest que había bendecido este diseño y le hicimos una pregunta grosera. ¿Qué hiciste el último Viernes Santo, y el de antes, y cada día laborable en que el mercado de acciones se quedó fuera mientras BTC cotizaba durante el festivo?
El agente de investigación que programó la primera versión había remuestreado todo a barras de 15 minutos y aplicado forward-fill. Pandas freq='B' estaba en el notebook, lo que parece una elección de adultos hasta que recuerdas lo que hace de verdad. 'B' significa de lunes a viernes. El Viernes Santo es un viernes. Juneteenth 2026 cayó en viernes. La observancia del Día de la Independencia fue un viernes. La función de calendario no tenía un calendario. Tenía un filtro de día de la semana.
El job de cobertura corre los viernes a las 15:45 hora del Este, una hora razonable para operar hacia el cierre de contado en una semana normal. El Viernes Santo es siempre un viernes. En la ventana 2023–2026 ese job coincidió con cuatro Viernes Santos, Juneteenth, el cierre completo del 3 de julio y cuatro sesiones del día siguiente a Acción de Gracias que ya habían tocado la campana a la 1:00 PM. Diez sesiones de viernes. En todas ellas el simulador había aceptado órdenes de renta variable. Los fills eran el cierre del jueves, o el último print regular del viernes arrastrado hacia adelante, disfrazados de operaciones en vivo en el blotter. Los marks de cripto corrían en vivo. La serie residual se apuntó el mérito de movimientos de cobertura que una pata nunca tuvo oportunidad de responder.
Los fines de semana eran el mismo bug en un horario del que al menos habíamos bromeado con unas cervezas. Los festivos eran la versión de la que nadie bromeaba, porque el notebook decía días hábiles y el Viernes Santo sigue sintiéndose, visceralmente, como un día en que el sistema financiero adulto está en marcha. Los bancos están abiertos. Fedwire está activo. Una API de bróker puede parecer despierta y aun así no tener adónde enviar una orden de COIN.
Los cierres anticipados eran más silenciosos y, en el blotter, más groseros. El 28 de noviembre de 2025, el día siguiente a Acción de Gracias, el NYSE cerró a la 1:00 PM. Nuestro job se despertó igual a las 15:45, miró una serie de 15 minutos que llevaba arrastrando el último print de las 12:59 desde hacía casi tres horas y "operó el cierre". El modelo de fills hasta nos cobró slippage de subasta de cierre. No hubo subasta a las 16:00. La subasta había ocurrido a las 13:00, sin nosotros. El paper, esa tarde, tuvo el fallo más honesto: órdenes nuevas rechazadas, órdenes working canceladas al cierre anticipado, una tasa de fills de cero.
| Sesión | Mercado de contado | Fill del backtest | Paper |
|---|---|---|---|
| Viernes Santo 2026 | Cerrado todo el día | Cesta ejecutada al cierre del jueves | Rechazos; marks stale desde el jueves |
| Juneteenth 2026 | Cerrado todo el día | El mismo job del viernes, los mismos fills fantasma | Pillado después, en el replay |
| 3 de julio de 2026 | Cerrado (4 de julio observado) | Viernes 15:45 contra un print del jueves | Sin sesión de contado a la que unirse |
| 28 nov 2025 | Cierre a la 1:00 PM | Rebalanceo a las 15:45, último print a las 12:59, slippage de subasta | Rechazos después de las 13:00 |
| Sábado ordinario | Cerrado | Barras de renta variable con forward-fill, perpetuo en vivo | Nombres congelados, perpetuo en vivo |
Volvimos a correr el libro con un archivo de sesión por venue: horario regular, festivos, cierres anticipados, el cierre de 16:00 frente al de 13:00, y un contador de horas stale en cada mark. Las órdenes hacia una sesión de contado cerrada no se ejecutan al último precio. Se rechazan. El panel de riesgo no puede imprimir NEUTRAL si alguna pata de cobertura lleva stale más de unas pocas horas. El test unitario es feo y me gusta: toma un viernes normal, píntalo cerrado, aserta cero fills de COIN y un flag de stale en la cesta. Y luego pinta las 13:00 como el cierre y aserta que el job de las 15:45 ni siquiera mira el modelo de subasta.
El Sharpe residual pasó de 1.14 a 0.61. No trato ninguno de los dos números como una razón para operar. Trato la brecha como una confesión. Gran parte de lo que habíamos estado llamando residual de cobertura era volatilidad cripto de festivo, recolectada en días en que la pata corta de acciones era un souvenir de la sesión anterior. Los fines de semana también hacían parte de ese trabajo, cosa que ya descontábamos en conversación. Los festivos se escondían en el remuestreo a días hábiles, que es un lugar mucho más vergonzoso para esconderse.
Seguimos corriendo el job de los viernes a las 15:45. Ahora lee un archivo con doce filas para 2026, dos de las cuales aún no han ocurrido. Acción de Gracias es el 26. Al día siguiente, el mercado de contado muere a las 13:00. Puse ese cierre de la 1:00 PM en el calendario dos veces, bajo dos nombres distintos, porque no confío en mí mismo en noviembre, y porque pandas seguirá llamando alegremente a ese viernes un día hábil si se lo permito.
← Todos los artículos


