28 de octubre de 2026 · opciones

La señal acertó. Nuestro backtest de opciones compró el vencimiento equivocado.

La señal acertó. Nuestro backtest de opciones compró el vencimiento equivocado.

A las 10:07 de un martes, nuestro agente de investigación detectó una oportunidad alcista a corto plazo en un ETF de índices. La señal subyacente era corriente: el precio había recuperado su promedio de 20 barras, la volatilidad realizada iba cediendo y para la siguiente sesión había un anuncio macroeconómico programado. La operación propuesta era un call spread con unas dos semanas hasta el vencimiento.

Al backtest le gustó. La estrategia en paper no lo ejecutó. Al comparar las órdenes, vimos que las marcas de tiempo de las señales coincidían y que los precios del subyacente diferían apenas unos centavos. Los contratos eran distintos: el backtest había comprado el vencimiento del viernes que mejor se veía en la cadena histórica; el proceso en paper seleccionó el siguiente vencimiento listado, una semana después.

La discrepancia se debía a una unión de calendarios. Habíamos tratado los «días hasta el vencimiento» como una propiedad de una fecha y luego seleccionado el contrato cuyo vencimiento quedaba más cerca del objetivo. En los datos históricos, el calendario incluía un vencimiento semanal que se había añadido después de la fecha que estábamos evaluando. El backtest había usado un contrato del futuro como si fuera una comodidad inofensiva.

Al principio sospechamos de un error de zona horaria. Las fechas de vencimiento de opciones suelen provocarlos: la sesión del mercado termina en Nueva York, las marcas de tiempo de los exchanges pueden guardarse en UTC y una fecha a medianoche puede desplazarse si la canalización la convierte sin cuidado. Lo comprobamos. Las marcas de tiempo estaban bien. El contrato sencillamente no existía en el universo histórico ese martes.

Esa fue la primera lección: una cadena histórica de opciones necesita un universo de contratos listados en cada momento. La fecha de vencimiento de un contrato indica cuándo termina. No indica cuándo se listó, cuándo empezó a negociarse ni si el sistema habría podido seleccionarlo en ese momento.

Rehicimos el paso de selección usando la información disponible en la marca de tiempo de la decisión. Para cada contrato candidato, exigimos que su marca de tiempo de listado no fuera posterior a la decisión, que tuviera una cotización válida y no más antigua que nuestro umbral de vigencia, y que hubiera una sesión de mercado en la que la estrategia pudiera enviar una orden. También registramos el conjunto de candidatos antes de ordenarlos. Esto último fue clave porque el backtest anterior conservaba solo el ganador: no podíamos saber si había comparado cinco contratos admisibles o si había elegido discretamente de un calendario que aún no existía.

10:07hora de decisión de la señal
1 semanadiscrepancia de vencimiento
0listados históricos admisibles para el contrato elegido

Después examinamos la cotización usada para valorar el spread. El backtest había tomado por separado la última cotización de cada pata. El ask del call era de las 10:06:58; el bid del call vendido, de las 10:04:11. Ambas eran técnicamente recientes según la política general de datos, pero el mercado se había movido entre una y otra. Un punto medio del spread calculado con patas asincrónicas puede describir un mercado que nunca existió.

Cambiamos la regla de cotización para exigir que las marcas de tiempo de ambas patas estuvieran separadas por no más de 2 segundos y descartar mercados cruzados o con tamaño cero. Eso redujo la cantidad de observaciones históricas utilizables. También hizo más creíbles las valoraciones restantes. Cuando no había una cotización sincronizada, marcábamos el candidato como no disponible en vez de cubrir el hueco con un precio obsoleto.

Luego vino la regla de clasificación. El agente había elegido el vencimiento con el menor costo cotizado del spread. Suena razonable, hasta que el spread tiene un contrato de tamaño y la cotización está obsoleta. Hicimos explícito el objetivo: maximizar el rendimiento esperado por unidad de riesgo definido entre los contratos que cumplen los requisitos mínimos de tamaño de cotización, vigencia y listado. En este ejemplo, el vencimiento admisible más cercano tenía una horquilla cotizada de $0.42 entre las dos patas, mientras que el vencimiento posterior tenía una horquilla de $0.31. La opción que parecía más barata también mostraba solo 1 contrato en la pata corta.

Candidato¿Vencimiento disponible entonces?Antigüedad de la cotizaciónTamaño mostrado de la pata cortaDecisión
Viernes semanalNoNo aplicableNo aplicableExcluir
Viernes siguienteSí1.4 segundos18 contratosAdmisible
Tercer viernesSí9.8 segundos1 contratoExcluir por obsoleto y poco líquido

Reprodujimos el incidente con esas reglas. Ahora el backtest eligió el mismo vencimiento que paper y dejó constancia de los motivos por los que se rechazaron los otros contratos. El precio de entrada del spread resultó $0.11 peor que el fill histórico original. Eso no significaba que la estrategia careciera de valor; significaba que la cifra de rendimiento anterior incluía una selección de operaciones que el proceso en vivo no podía reproducir.

Una pequeña molestia: los formatos de símbolos de los exchanges hacen que los errores de vencimiento parezcan problemas de calidad de datos. Encontramos un código semanal de un proveedor que difería del código mensual por un carácter. Todavía guardo el símbolo original junto a la clave normalizada del contrato en los registros de auditoría. No es elegante, pero nos ha evitado confiar demasiado rápido en una unión ordenada.

Si estás creando un backtest de opciones, guarda el conjunto completo de candidatos en cada decisión, junto con el estado de listado de cada contrato, las marcas de tiempo y los tamaños de sus cotizaciones, y el motivo de rechazo. Después, haz que la selección del contrato sea una función determinista de esa instantánea. Elegir un vencimiento forma parte de la estrategia. Si el backtest puede ver un contrato que paper no podía, la comparación de señales empieza cuando la respuesta ya ha cambiado.

backtesting de opcionesselección de vencimientosdatos punto en el tiempomodelado de ejecución
← Todos los artículos