A las 10:14 UTC, una estrategia sencilla de ruptura compró un perpetuo de criptomonedas después de que el precio superara su máximo de 20 minutos. El backtest mostró una ejecución a $64,210. Ese número aparecía en los datos, la señal tenía la marca de tiempo correcta y la orden simulada llegó en la siguiente vela. Casi lo dimos por un resultado impecable.
Entonces alineamos los identificadores de los instrumentos. La señal procedía del perpetuo BTCUSDT. La ejecución correspondía a un contrato inverso BTCUSD. Ambos cotizaban cerca de $64,210 y ambos eran mercados líquidos. Aun así, tenían libros de órdenes distintos, con precios, tamaños de tick, profundidad y tarifas diferentes. El backtest había ensamblado un mercado al que ningún operador podía acceder.
La estrategia en sí era corriente: entrar al cierre por encima del máximo móvil, salir al cierre por debajo del mínimo móvil y dimensionar cada posición con un riesgo fijo en dólares. El problema solo salió a la luz cuando planteamos una pregunta más precisa que «¿cuánto valía BTC?». Preguntamos: «¿Qué habría podido comprar esta orden en este contrato exacto en ese momento?».
El gráfico era un compuesto antes siquiera de ejecutar la estrategia
Nuestro feed de investigación facilitaba la comparación entre plataformas. Normalizaba los símbolos y mostraba una serie de precios consolidada. Era práctico para observar el mercado, pero servía poco como referencia de ejecución. Un compuesto puede mostrar el mejor precio entre varias plataformas, aunque la estrategia solo pueda enviar una orden a una de ellas.
En la ruptura, el máximo de la vela consolidada era $64,205. La última operación del contrato seleccionado ya había llegado a $64,218. Mientras tanto, una cotización en caché del contrato inverso aún mostraba una oferta de venta a $64,210. El simulador usó la ruptura de una serie y la atractiva oferta de otra. Cada valor era real. La combinación era ficticia.
| Dato | Qué usó el backtest | Qué necesitaba la orden |
|---|---|---|
| Máximo de ruptura | Precio consolidado de BTC | Historial de precios del contrato seleccionado |
| Referencia de entrada | Oferta de venta en caché del contrato inverso | Oferta de venta actualizada del instrumento negociado |
| Cantidad ejecutada | Tamaño de posición solicitado | Cantidad disponible en cada nivel de precio |
Una fila de una tabla de datos de mercado puede parecer completa aunque sus campos describan mercados diferentes. Un alias de símbolo no demuestra que dos instrumentos compartan un libro. El ID del contrato, la plataforma, la moneda de cotización y la marca de tiempo deben acompañar a los datos durante la generación de señales y la ejecución.
Reprodujimos la orden contra el libro
Repetimos la entrada usando la mejor oferta de venta propia del perpetuo seleccionado y las actualizaciones del libro de órdenes disponibles en el momento de tomar la decisión. La cotización era reciente, pero solo había 0.18 BTC en el mejor nivel. Nuestra orden simulada era de 0.50 BTC. Los 0.32 BTC restantes habrían tenido que cruzar a ofertas de venta más altas.
La entrada ajustada costaba $21 más por BTC que la ejecución registrada, antes de tarifas. Es una diferencia pequeña en una sola operación. Sin embargo, durante la prueba, la estrategia obtuvo la mayor parte de su beneficio bruto en unas pocas rupturas rápidas. Reproducir esas entradas contra los libros correctos redujo el resultado bruto en un 31%; las tarifas taker y el impacto lo redujeron aún más.
También encontramos dos casos en los que la cotización del mejor nivel del libro llegó después del momento de decisión de la señal. Un backtest que combina datos por la marca de tiempo más cercana puede elegir silenciosamente una actualización futura. Ahora hacemos la combinación hacia atrás: la cotización debe haberse observado antes de enviar la orden y registramos su antigüedad. Si la última cotización utilizable es demasiado antigua, el simulador marca la orden como no ejecutable o aplica una regla explícita para datos obsoletos.
Qué hace falta para que un precio sea negociable
El cierre de una vela sirve para calcular una señal. No demuestra que una orden concreta pudiera ejecutarse a ese precio. Para eso, el precio debe corresponder al instrumento y la plataforma exactos, estar disponible cuando llegue la orden y tener suficiente cantidad disponible en el lado opuesto para el tamaño solicitado. Cuando los datos no permiten responder a esas preguntas, el resultado honesto es un rango o una ejecución faltante, no un precio exacto inventado.
Conservamos la serie consolidada para tener contexto del mercado y la sacamos del proceso de ejecución. Ahora las señales se basan en el historial propio del contrato seleccionado; las órdenes se reproducen contra el libro de ese contrato, y las tarifas y el tamaño se aplican después de calcular la ejecución. Un poco más de infraestructura y una curva de capital mucho menos halagüeña.
Esa ruptura sí ocurrió. El backtest simplemente le dio un mercado mejor que el que había seleccionado la estrategia.
← Todos los artículos


