
Durante los últimos años, la conversación sobre trading cuantitativo se ha asociado casi automáticamente con Python, notebooks, bases de datos y librerías estadísticas. Esta asociación tiene sentido: Python se ha convertido en una herramienta extraordinariamente potente para investigación financiera, procesamiento de datos y machine learning. Sin embargo, reducir el Quant a un lenguaje de programación es confundir la herramienta con el método.
La investigación cuantitativa comienza antes del código. Comienza cuando una observación del mercado puede convertirse en una hipótesis, esa hipótesis puede expresarse mediante variables medibles y posteriormente puede ser contrastada contra datos. Desde esta perspectiva, existen plataformas tradicionalmente asociadas con el trading discrecional que poseen una arquitectura considerablemente más profunda. NinjaTrader es un caso especialmente interesante.
Para muchos traders, NinjaTrader es principalmente una plataforma para futuros, gráficos, DOM y Order Flow. Desde una perspectiva tecnológica, su propuesta permite ir mucho más lejos. NinjaScript es una extensión de Microsoft C#, y la plataforma dispone de mecanismos orientados a eventos para procesar datos Level I, profundidad Level II, ejecución de órdenes y series especializadas como las Volumetric Bars.
Lo realmente interesante no es cada herramienta de forma aislada. Es la posibilidad de conectar diferentes capas del mercado dentro de un mismo entorno: precio, volumen, transacciones, Bid/Ask, Delta, profundidad y, finalmente, variables cuantitativas que puedan ser sometidas a prueba. En ese punto, NinjaTrader deja de ser únicamente una plataforma desde la cual observar y operar el mercado y comienza a comportarse como un laboratorio especializado para investigar su microestructura.
La mayor parte del análisis técnico tradicional trabaja sobre una abstracción. Una vela de cinco minutos resume miles de acontecimientos del mercado mediante cuatro números principales: apertura, máximo, mínimo y cierre. A estos podemos añadir el volumen total, pero seguimos observando una compresión de lo que realmente ocurrió durante esos cinco minutos.
Para determinadas estrategias, esta información es suficiente. Un modelo basado en tendencia de medio plazo probablemente no necesita conocer la secuencia exacta en la que se ejecutaron los contratos dentro de cada vela. Pero cuando nuestra hipótesis intenta explicar fenómenos de microestructura, esa compresión puede eliminar precisamente la información que queremos investigar.
Aquí aparece una de las características técnicas más relevantes de NinjaScript: su arquitectura orientada a eventos. El método OnMarketData() recibe cambios de información Level I en la secuencia en que se producen. Los eventos pueden incluir Bid, Ask, último precio negociado y volumen. Esto significa que nuestra unidad de análisis puede descender desde una vela completa hasta la secuencia de acontecimientos que terminó construyéndola.
Conceptualmente, en lugar de trabajar únicamente con una barra de un minuto que informa un volumen total, podemos procesar una secuencia como: 10:31:22.154, Last 5231.25, Volume 3; 10:31:22.201, Last 5231.25, Volume 8; 10:31:22.247, Last 5231.50, Volume 2. Ya no estamos obligados a preguntar únicamente cuánto volumen apareció durante la vela. Podemos investigar cómo llegó ese volumen, en qué precios se negoció, con qué frecuencia aparecieron las transacciones y cómo reaccionó posteriormente el precio.
Esta diferencia puede parecer pequeña visualmente, pero desde el punto de vista Quant cambia completamente el tipo de preguntas que podemos formular.
Cuando observamos una vela y vemos 15.000 contratos negociados, estamos mirando el resultado agregado de una secuencia de transacciones. El problema es que dos velas con exactamente el mismo volumen total pueden contener estructuras internas radicalmente diferentes.
En una primera situación, el volumen podría distribuirse de manera relativamente homogénea durante cinco minutos. En otra, el 70% de ese volumen podría concentrarse en pocos segundos y alrededor de dos niveles de precio. El número agregado sería similar. La información microestructural no.
Al acceder a eventos de mercado podemos empezar a construir variables relacionadas con la forma en la que el volumen aparece: concentración por nivel de precio, tamaño relativo de las transacciones, frecuencia de llegada, aceleraciones en actividad negociada o cambios en la relación entre precio y volumen.
Sin embargo, aquí es necesario diferenciar varias capas de información que con frecuencia son mezcladas por el trader. Volumen negociado no es lo mismo que Bid/Ask y Bid/Ask no es lo mismo que profundidad del libro. Un evento Last representa información relacionada con una transacción reportada. Level I proporciona además información correspondiente al mejor Bid y Ask. La profundidad de las órdenes disponibles en diferentes niveles pertenece a Level II. NinjaTrader dispone de OnMarketDepth(), un método orientado a eventos que recibe los cambios de profundidad y puede utilizarse para construir programáticamente un libro Level II.
Podemos pensar esta progresión como diferentes resoluciones del mercado: OHLC, volumen agregado, trades tick a tick, Bid/Ask, agresión, Delta y Market Depth. El error metodológico sería pensar que un nivel es simplemente una versión "mejor" del anterior. No lo es. Cada nivel intenta responder una pregunta diferente. La resolución correcta del dato debe depender de la resolución de la hipótesis.

Aquí aparece, desde mi perspectiva, una de las aplicaciones más interesantes de NinjaTrader para investigación Quant. El Order Flow suele utilizarse de manera discrecional. El trader observa un Footprint y encuentra un imbalance, detecta Delta extremo o interpreta que existe absorción. El problema no está en la observación. El problema aparece cuando la definición del fenómeno depende exclusivamente de la interpretación visual del trader.
Una afirmación como "entraron muchos compradores y el precio no pudo continuar" puede tener sentido para un trader experimentado, pero todavía no constituye una variable cuantitativa. La transformación ocurre cuando podemos expresar exactamente qué significa "muchos compradores", qué significa "no continuar" y durante qué periodo debemos medir ambos acontecimientos.
Las Order Flow Volumetric Bars de NinjaTrader descomponen la actividad compradora y vendedora por nivel de precio. La plataforma calcula Delta como diferencia entre volumen comprador y vendedor y permite detectar imbalances mediante comparaciones de volumen entre niveles. En modo BidAsk, la clasificación utiliza volumen ejecutado en el ask o superior como presión compradora y volumen ejecutado en el bid o inferior como presión vendedora. Para esta clasificación histórica es necesario que el proveedor disponga de la información correspondiente; cuando solo existe histórico de Last, la plataforma contempla otros métodos de clasificación como UpDownTick.
Esto permite transformar una observación subjetiva. En lugar de "veo agresión compradora", podríamos formular: "el volumen clasificado como comprador supera 2,5 veces al vendedor en tres niveles consecutivos". Del mismo modo, en lugar de "parece existir absorción", podríamos investigar: "cuando el volumen negociado se encuentra por encima del percentil 95 de las últimas veinte sesiones, el Delta permanece fuertemente negativo pero el precio no consigue producir un nuevo mínimo durante los siguientes N ticks, ¿existe una probabilidad estadísticamente diferente de reversión?"
Ahora tenemos algo investigable. Ya no estamos observando solamente un gráfico. Estamos definiendo variables.
Esta transformación tiene implicaciones importantes para el desarrollo de estrategias. NinjaScript permite añadir una serie de Order Flow Volumetric Bars programáticamente mediante AddVolumetric(). El desarrollador puede especificar el tipo de barra, el método utilizado para calcular Delta, la cantidad de ticks agregados por nivel y filtros relacionados con el tamaño de las transacciones.
El Footprint puede entonces dejar de ser exclusivamente una representación gráfica para convertirse en una fuente estructurada de información. Podemos construir variables como Delta relativo, es decir Delta dividido por volumen total, número de imbalances dentro de una barra, concentración de volumen en los niveles principales, divergencia entre precio y Delta o participación de transacciones superiores a determinado tamaño.
La pregunta profesional ya no debería ser únicamente si estas variables "se ven bien" sobre el gráfico. La pregunta realmente importante es si contienen información. Podemos estudiar qué ocurre diez, veinte o cincuenta ticks después de determinadas configuraciones. Podemos segmentar los resultados por volatilidad, hora de la sesión o régimen. Podemos medir distribución de retornos posteriores y comparar la muestra donde aparece el fenómeno contra otra donde no aparece.
Ese es precisamente el salto entre observar Order Flow y estudiarlo cuantitativamente. El objetivo no es automatizar todas las interpretaciones del trader discrecional. Es determinar cuáles de esas interpretaciones sobreviven cuando son sometidas a datos.
Existe otro problema importante al trabajar con microestructura: el orden de los eventos. Una vela OHLC nos dice dónde abrió, dónde alcanzó su máximo y mínimo y dónde terminó, pero no necesariamente conserva la secuencia exacta mediante la cual alcanzó esos valores, y ese orden puede importar.
NinjaTrader dispone de Tick Replay, una funcionalidad que permite que indicadores y estrategias NinjaScript procesen históricamente los eventos utilizados para construir las barras en secuencia tick a tick. En ese modo, OnBarUpdate() y OnMarketData() pueden recibir información histórica siguiendo la reconstrucción de los eventos almacenados. Esto permite investigar lógicas que necesitan conocer lo ocurrido dentro de la barra y no únicamente su estado final.
Sin embargo, existe una precisión técnica fundamental: Tick Replay no equivale a reconstruir todo el libro histórico. Al utilizar OnMarketData() con Tick Replay, se reproduce el evento Last y se conserva el mejor Bid/Ask asociado al momento de la transacción, pero no se reconstruyen de la misma forma todas las actualizaciones históricas de volumen Bid/Ask ni la profundidad completa del mercado.
Esta distinción evita uno de los errores más peligrosos en investigación algorítmica: creer que aumentar la granularidad automáticamente convierte una simulación en una reproducción perfecta del mercado. No es así. La granularidad del precio, la granularidad del libro y el modelo de ejecución son problemas distintos.
Cuando la investigación necesita profundidad del libro aparece otra herramienta: Market Replay mediante Playback. Aquí la arquitectura es diferente. Los archivos Market Replay pueden almacenar la secuencia de información Level I y Level II de forma sincronizada, permitiendo reproducir posteriormente una sesión con una estructura mucho más cercana a la información que recibió la plataforma en tiempo real.
Esta distinción es particularmente importante cuando el algoritmo depende del DOM. Una estrategia basada en una media móvil posiblemente no necesita Level II. Un modelo que intenta investigar cambios en liquidez, retirada de órdenes, concentración de profundidad o desequilibrios entre diferentes niveles probablemente sí.
Incluso aquí debemos mantener el rigor: la calidad y granularidad final dependen también del proveedor de datos y de la información realmente registrada. No existe un dataset universalmente "mejor". Existe un dataset apropiado para cada problema.
Esta idea es esencial para el desarrollo Quant. Utilizar Level II para investigar una estrategia mensual sería innecesario. Utilizar velas de un minuto para modelar determinados fenómenos de microestructura podría ser insuficiente. Más información no siempre produce mejores modelos; lo importante es preservar la información que realmente contiene la variable que estamos investigando.
El valor de NinjaTrader para un trader Quant no reside solamente en que permita programar estrategias en C#. Su verdadero interés aparece cuando entendemos la cantidad de capas del mercado que pueden ser convertidas en información procesable dentro del mismo entorno.
Podemos comenzar con una barra. Descender hasta las transacciones que la construyeron. Estudiar Bid y Ask. Clasificar volumen comprador y vendedor. Calcular Delta. Observar imbalances. Procesar profundidad Level II. Finalmente, convertir esas observaciones en variables que puedan ser sometidas a una hipótesis.
Aquí existe una diferencia fundamental entre trading discrecional y Quant que no necesariamente implica que uno sea superior al otro. El discrecional puede observar un patrón y desarrollar criterio alrededor de él. El Quant exige un paso adicional: definir exactamente qué observó y preguntarle a los datos si el fenómeno existe más allá de su percepción.
Esta es probablemente una de las formas más interesantes de entender NinjaTrader. No solamente como una plataforma para operar futuros, sino como un laboratorio donde una observación visual puede convertirse en dato, el dato en variable y la variable en una hipótesis susceptible de ser demostrada o descartada.
Porque el Quant no comienza cuando abrimos Python. Comienza cuando dejamos de decir "esto parece funcionar" y somos capaces de preguntar "¿cómo puedo medirlo?"