2 de noviembre de 2026 · investigación

El dólar de tu backtest era USDC. El 11 de marzo cotizó a 87 centavos.

El dólar de tu backtest era USDC. El 11 de marzo cotizó a 87 centavos.

La config decía starting_capital: 100000, y el eje y del gráfico decía USD. Cada fill del log era un número en USDC. Durante once meses de esa ejecución, los dos hechos habitaron la misma celda y nadie tuvo motivo para separarlos.

Entonces quebró Silicon Valley Bank, Circle dijo que $3.3 billion de reservas de USDC estaban atrapadas allí, y el USDC cotizó a 87 centavos. Nuestro libro en «dólares» subió. El BTC cotizado en USDC se disparó. El perp imprimió verde. El cash que habíamos tratado como un 100,000 libre de riesgo fue lo que se movió.

Sigo encontrando pipelines de investigación que marcan USDC, USDT y USD como una sola columna. Este es aquel fin de semana, desmontado en el orden en que lo vio el ledger.

La línea que decía $100,000

Cuenta paper, perpetual de BTC con margen en USDC, long modesto. 30,000 USDC de nocional de BTC, unos 1.5 BTC al mark del viernes cerca de $20,150. Los otros 70,000 estaban como colateral en USDC. Infradesplegados a propósito. Estábamos calentando una estrategia. El resto del stack estaba en cash.

La función de NAV hizo lo que hacen la mayoría. Sumó el cash en USDC al pnl no realizado en USDC y escribió la suma en una serie llamada equity_usd. Había un comentario en la config que escribí yo mismo:

stablecoins = 1 dólar. no cuentes el FX dos veces.

Lo que yo había querido decir: no conviertas un pago de funding en USDT en un segundo movimiento en dólares al convertirlo dos veces. Lo que realmente había hecho era congelar el tipo de FX en 1.0 para el resto del archivo.

quote_asset = "USDC"

El venue era un venue de USDC. Fills, margen, funding, marcas de liquidación, el lot size, el min notional, todo. Hyperliquid, dYdX v3, Coinbase International, una docena más, la misma forma. El notebook de investigación importaba una vela BTCUSDC y una vela BTCUSD, usaba la primera para operar y etiquetaba la segunda en el gráfico porque el gráfico se veía más profesional en dólares.

Y esta es la parte pequeña y estúpida en la que sigo pensando a deshoras: el título por defecto del eje de la librería de gráficos es «USD». Nunca lo sobrescribí. La gente pasaba junto a la pantalla y leía una unidad que la serie no tenía.

Viernes por la noche, el tuit de Circle

10 de marzo de 2023. SVB ya no existe. Circle revela que $3.3 billion de su reserva de USDC, entonces de ~$40 billion, estaban en el banco quebrado, unos 8%. Coinbase suspende las conversiones de USDC esa misma noche. El canje, el mecanismo real del peg, queda cerrado el fin de semana.

El backtest no tenía ninguna fila para nada de esto. Ni flag de parada de canje, ni campo de reservas del emisor, ni un «puedo conseguir dólares por este token antes del lunes». Tenía un close. El close del viernes seguía siendo 1.0000 en nuestro archivo de FX, porque el archivo de FX era un stub que devolvía 1.0 para cualquier cosa cuyo ticker empezara por USD.

Antes trataba una prima de USDT como ruido de manual, de esas cosas que mencionas en una nota al pie y luego ignoras. Una vez pasamos veinte minutos en una cocina discutiendo si 1.03 «valía la pena apuntarlo». Los dos estábamos editorializando. El par es una serie. Guárdala. Deja de votar sobre ella.

0.8789

Sábado por la mañana. El mínimo de CoinGecko en USDC es $0.8789. Otras cintas imprimen $0.87. Unos cuantos pools DEX atraviesan $0.80. DAI, relleno de USDC como colateral, lo sigue a la baja. USDT va al otro lado, $1.03 en algunas pantallas, $1.06 en Kraken.

$0.87Mínimo de USDC, 11 mar 2023
$26kPrint de BTC/USDC en Kraken
13%agujero en el cash marcado a $1

El archivo stub de FX sigue devolviendo 1.0. El reloj del backtest sabe que es sábado. No sabe que la unidad del libro ahora es un token en apuros.

El print de Kraken a 26,000

El BTC/USD de Bitstamp ronda los $20,200. El BTC/USDC de Kraken imprime por encima de $26,000. Es el mismo bitcoin. El segundo número es un precio en dólares dividido por un peg roto, más el aire que un libro delgado de USDC añade un sábado.

Nuestro venue marcaba el perpetual en USDC. Toma una cinta conservadora, BTC/USDC a ~$23,000, que es $20,200 / 0.88. El long de 1.5 BTC está arriba unos 4,300 USDC. Cuenta en unidades nativas: 104,300 USDC. El motor reporta $104,300, un fin de semana alcista del 4.3%, y un pago de funding aterriza encima en la misma unidad.

En dólares, los 70,000 USDC de colateral ocioso valen unos $61,600. Los 104,300 USDC enteros valen unos $91,800. El libro que «ganó» un 4.3% perdió el 8% de su capital en dólares mientras estaba, en su mayor parte, sentado en cash.

La rentabilidad del fin de semana fue un cambio de unidad, no un cambio de fortuna. Un long de BTC/USDC en un día de USDC a la baja es, mecánicamente, un long del depeg. Puedes querer esa apuesta. No puedes descubrirla a posteriori en una serie etiquetada USD.

Coinbase ya había detenido las conversiones de USDC. Binance suspendió los pares de USDC. Incluso un backtest en modo dios que a las 08:00 UTC hubiera decidido deshacerse del activo de cotización por dólares habría necesitado un venue que siguiera convirtiendo, un spread que no fuera el depeg mismo, y una vía de liquidación que no existió hasta que los bancos abrieron el lunes.

cash_usd = cash_usdc * 1.0

Esa línea es la que me quedo. Corrió en cada barra, incluidas las barras en las que USDCUSD estaba a 0.87. Multiplicar por 1.0 se siente como un no-op, por eso sobrevive al code review. Es una marca de FX. Una congelada.

Los 70,000 USDC de colateral nunca dispararon un trade, así que ningún modelo de slippage los miró nunca, ni tabla de fees, ni funding. Se supone que el cash es la columna aburrida. En este libro era el riesgo más grande, y el único que no tasamos.

Un rebate de maker en los fills de BTC de aquel fin de semana era de 2 o 3 bps, si es que te ejecutaban. El movimiento del activo de cotización fue de 1,300 bps. Tenemos un stack entero para el 3 y un stub para el 1,300.

El fin de semana verde en el gráfico

Slack del lunes por la mañana, antes de que nadie hubiera abierto USDCUSD: imprimimos un 4% overnight. Alguien preguntó si debíamos escalar el tamaño paper. Miré el gráfico, luego Kraken, luego el stub.

Partida del ledgerLo que guardó el motorSábado, nativoEl mismo momento, en dólares
Colateral ocioso70,000 USDC × 1.0070,000 USDC~$61,600
Mark del perp de BTCBTCUSDC last~23,000 USDC (26,000 en Kraken)BTCUSD ~$20,200
No realizado sobre 1.5 BTC+4,300 USDC+4,300 USDCsobre todo el peg, algo de bitcoin
NAV reportado104,300 «USD»104,300 USDC~$91,800

Los libros en USDT tenían la caricatura inversa. El USDT cotizaba caro, así que una cuenta plana con margen en USDT mostraba una ganancia en dólares que tampoco había ganado, y un mark de BTCUSDT demasiado bajo respecto a BTCUSD. Si ordenabas dos perps de BTC «idénticos» aquel fin de semana, uno en un venue de USDC y otro en un venue de USDT, ordenabas los tokens de cotización y lo llamabas alpha.

La cuenta paper, la que realmente tenía USDC, estaba más cerca de la verdad que el dashboard de investigación. Nunca pretendió ser dólares. Eso lo hicimos nosotros en el export.

El export que enviamos el lunes

El USDC se arrastró de vuelta hacia $1 después de que el Treasury, la Fed y la FDIC dijeran que los depositantes de SVB serían indemnizados íntegramente, y después de que Circle dijera que cubriría un déficit. Para el lunes el peg estaba en su mayor parte parcheado. El archivo stub de FX, que había estado mal durante 48 horas, volvió a estar bien.

Pero las barras diarias lo ocultaron. La muestra de las 00:00 UTC del 11 de marzo pilló al USDC ya desviado, o ya rebotando, según el vendor, y la muestra del 12 de marzo era otra película. Si solo guardabas el NAV y no el mark de cotización, no podías reconstruir cuál. El fin de semana feo se aplanó en un blip lo bastante pequeño como para ignorarlo, y lo ignoramos, porque muestreábamos en diario.

Lo que ahora mantenemos en el libro son tres series, siempre, incluso cuando se superponen durante meses:

  1. NAV en el activo de cotización del venue, la unidad que realmente puedes retirar.
  2. Activo de cotización frente a USD, una cinta real, incluido el sábado, incluido el 0.87, incluidas las horas en que Coinbase no convertía.
  3. NAV en dólares, como serie derivada, para que una etiqueta de gráfico de USD tenga un padre.

Si un agente escribe el backtest, la comprobación es la misma. Pídele el activo de cotización de cada posición y del cash. Si responde USD en un venue de USDC, la ejecución no es una ejecución en dólares. Marzo de 2023 es la semana que reproduzco cuando alguien me dice que la distinción no mueve el Sharpe. Movió este más de lo que lo hizo la estrategia, y la estrategia era la parte para la que teníamos modelos.

stablecoinsmoneda de cotizaciónbacktestingcriptopaper trading
← Todos los artículos