Los Componentes de una Infraestructura de Trading Algorítmico

por

Apreciado trader,

Durante los últimos meses, en KomaLogic hemos estado muy centrados en la actualización de toda nuestra infraestructura de trading algorítmico. Por esta razón, creo que podría ser interesante también plasmarlo en un artículo que te sirva como mapa general a la hora de construir tu propio Framework Operativo.

Como bien sabes, una de las principales ventajas del trading algorítmico es que permite a los traders automatizar sus estrategias y ejecutar órdenes a velocidades y precisiones que serían imposibles de lograr manualmente. Sin embargo…

La eficacia de cualquier estrategia de trading algorítmico no solo depende de su lógica subyacente, sino también de la robustez de la infraestructura que la soporta.

Por esta razón, en este post quiero enfatizar la importancia de una infraestructura de trading algorítmico bien diseñada y explicarte cuáles son sus componentes esenciales. De esta manera, podrás tener una base que te sirva como punto de partida para poder desarrollar tus propias ideas.

Este es un proyecto de una envergadura y complejidad considerables, por lo que si te gustaría contar con un poco de ayuda, también hemos creado un curso donde te enseñamos a programar tu propia infraestructura paso a paso en Python para ejecutar tus estrategias en MetaTrader 5.

En el curso construimos una versión más avanzada y detallada de lo que voy a abordar en este artículo, ya que el propio formato de un curso (de más de 21 horas de contenido y 148 clases) permite poder profundizar en cada uno de los componentes, así como enseñarte a programarlos en detalle usando Python y la API de MetaTrader 5 y a estructurarlos en un contexto de arquitectura del software escalable y reutilizable.

Puedes darle un vistazo al curso aquí.

Y ahora sí, ¡Comencemos!

La importancia de una infraestructura de trading algoritmico propia

La construcción de una infraestructura de trading algorítmico propia no es solo un ejercicio técnico; es una inversión en eficiencia y adaptabilidad para todo tu proceso operativo: desde la investigación de tus estrategias hasta la propia ejecución de las operaciones.

Soy consciente de que la idea de crear una infraestructura de trading algorítmico desde cero puede parecer una tarea desalentadora, ya que es un proyecto de gran envergadura que requiere de tiempo y conocimiento específico. De hecho, en KomaLogic hemos tardado alrededor de medio año en tener una versión lo suficientemente robusta como para comenzar a usarla.

Aún así, todavía queda mucho que mejorar. Sin embargo, todos los miembros del equipo creíamos firmemente que los beneficios eran mucho mayores a los riesgos; y por esta razón nos decidimos a desarrollarla. Por si te sirve de motivación, mirando ahora hacia atrás creo que fue una muy buena decisión.

Contar con una infraestructura personalizada te brinda control total sobre tu entorno de trading, permitiéndote adaptar cada aspecto a tus necesidades específicas. Esto no solo mejora la eficiencia operativa sino que también ofrece una flexibilidad incomparable para ajustar o expandir tu sistema conforme evoluciona tu enfoque y estilo de trading.

Es cierto que las plataformas o soluciones genéricas o de terceros ofrecen una entrada más accesible al mundo del trading sistemático. De hecho, creo que todo principiante debería comenzar por allí antes de plantearse construir su propia infraestructura de trading algorítmico, pero es cierto que a medida que un trader va ganando experiencia y sus necesidades van avanzando, acaba necesitando más personalización y control sobre las herramientas que usa.

Sin embargo, usar herramientas de terceros también te expone al riesgo de que dichas herramientas cambien, no se actualicen o simplemente desaparezcan. Es cierto que en el caso de plataformas bien establecidas como TradeStation o MultiCharts esta posibilidad es muy remota, pero no inexsitente. Simplemente debemos tener en cuenta este riesgo, sus probabilidades y decidir si queremos correrlo o no.

A su vez, puede ocurrir también que termines trabajando con múltiples plataformas porque una de ellas ofrece la funcionalidad X, otra ofrece la Y, pero no se pueden comunicar entre sí. Esto fuerza a que tengas que construir hojas de cálculo u otros adaptadores para, por ejemplo, poder extraer datos de una plataforma y cargarlos en la otra. Al final, tu infraestructura termina siendo una especie de Frankenstein de múltiples tecnologías que resulta muy difícil de mantener y usar.

Múltiples plataformas y conexiones que mantener vs una única infraestructura propia.

Estas razones son las que deben colocarse en la lista de pros y contras para que puedas decidir si tiene sentido para ti construir tu propia versión o seguir utilizando plataformas ya comercializadas.

Finalmente, y creo que este es el punto más importante, construyendo tu propia infraestructura de trading algorítmico te familiarizas íntimamente con cada uno de sus componentes, lo que a su vez facilita la detección y corrección de errores, la actualización de sistemas y la implementación de nuevas estrategias de manera mucho más sencilla.

Los componentes clave de una infraestructura de trading algorítmico robusta

El primer paso para crear una infraestructura de trading algorítmico profesional es escoger qué tecnologías vas a usar. Para mí, Python es sin duda la mejor opción dada su versatilidad y disponibilidad de librerías. Por otro lado, si tu Framework tiene partes que son sensitivas a la latencia y necesiten de una mayor velocidad de procesado de la que Python puede ofrecer, puedes recurrir a lenguajes como Go, Rust o C/C++ para programar dichas secciones.

Seguidamente, deberás establecer los distintos módulos que formarán la estructura principal del Framework operativo. También deberás tener una idea clara de cómo se va a arquitecturar todo el proyecto, tanto a nivel de software como de gestión de versiones y de ejecución.

Durante el curso utilizamos los principios SOLID y una arquitectura hexagonal para organizar todo el proyecto, de manera que sea lo más robusto y flexible ante futuros cambios posible.

Esto implica que, idealmente, cada módulo debería ocuparse de una sola tarea (separation of concerns), de manera que podamos separar las funcionalidades para que nos sea mucho más cómodo poder diseñarlas, programarlas, probarlas o modificarlas.

Todos los módulos que creamos en el Curso

Lo ideal sería organizar cada módulo en una clase que implemente una interfaz específica. Así podemos tener siempre organizados todos los métodos que tendrá cada clase y definiremos de antemano las posibilidades de cada módulo, lo que a su vez facilita la separación de código y su reusabilidad. Esta es exatamente la manera en la que lo construimos en el curso, explicando detalladamente cada paso y el por qué de cada decisión respecto a dicha arquitectura.

Sin embargo, también puedes organizar los módulos en paquetes de funciones si no te sientes del todo cómodo con la programación orientada a objetos. De esa manera también podrás separar dichas funciones en grupos según el objetivo que persigan.

Teniendo esto claro, veámos ahora cuáles serían los módulos principales de un Framework completo.

Adaptador de Datos

La toma de decisiones en el trading depende en gran medida de la calidad y la rapidez en la que se reciben y procesan los nuevos datos del mercado. Por esta razón, un módulo que actúe como adaptador y proveedor de datos será el componente más importante de tu infraestructura de trading algorítmico. Si lo piensas, no importa qué buenos sean el resto de módulos de tu Framework; sin acceso a los nuevos datos del mercado no van a servir de mucho.

El principal objetivo de este módulo será comprobar si existen nuevos datos en el mercado. En caso de que así fuera, deberá procesarlos y poder entregarlos en un formato estandarizado a los otros módulos que lo requieran. Explicado de manera más sencilla, esto significa que el módulo que se ocupa de generar las señales de trading pueda pedirle los últimos datos de mercado al adaptador de datos, y éste último se los entregue siempre en el mismo formato sea cual sea la fuente original.

Una ventaja que tiene también desarrollar tu propio adaptador de datos es que puedes personalizarlo para acceder a distintas fuentes específicas. Por ejemplo, dentro de un mismo adaptador de datos, podrías crear varios sub-módulos: uno para obtener los datos de la plataforma de tu Broker, otro que se conecte a la API de una Exchange, etcétera.

Ejemplo de un Adaptador de Datos que admite dos fuentes distintas

De esta manera, con una base de código común ya podrías consumir datos de fuentes distintas. Y aunque el formato de estos datos fuera distinto para cada fuente (por ejemplo, no son lo mismo datos provenientes de MetaTrader 5 que de la API de Interactive Brokers o la de Binance), el propio procesado y estandarizado haría que los datos que consuman el resto de módulos de tu Framework estuvieran siempre en el mismo formato.

Generador de Señales

Una vez se pueden obtener los datos del mercado, es el momento de calcular si tenemos alguna nueva señal de trading, y este es precisamente el trabajo del módulo generador de señales.

Este módulo es como el corazón analítico de tu infraestructura de trading algorítmico. Consume los datos proporcionados por el proveedor de datos y aplica el algoritmo que encapsula la lógica adecuada para generar las señales de trading.

Por ejemplo, si usaras un modelo de clasificación para generar las señales de trading, dicho modelo estaría codificado en el generador de señales para que, cuando llegaran nuevos datos, pudiera generar la señal de compra o venta.

Usando otro ejemplo como el caso de una estrategia de cruce de medias móviles, el generador de señales calcularía las nuevas medias correspondientes a los nuevos datos recibidos y comprobaría si se han cruzado. En dicho caso, generaría una señal de trading en la dirección pertinente.

Modularizar la generación de señales es también un concepto muy interesante, ya que te permite generar un sub-módulo por cada regla de entrada que quieras. No importa si usas un modelo de machine learning o una regla técnica para generar tu señal de compra o venta. Encapsularla en su propio generador de señal te permite poder reutilizar dicha regla o modelo siempre que lo necesites. Es decir, sólo tendrás que programarlo una sola vez.

Arquitecturando la generación de señales de esta manera, te será muy fácil poder crear nuevas reglas de entrada combinando distintas de ellas. Por ejemplo, generando una señal de compra solo cuando las normas A, B y C estén de acuerdo, o creando lógicas más complejas como un majority voting entre distintos modelos.

Dimensionador de posiciones

A continuación, el módulo de dimensionado de posiciones se ocupará de determinar el tamaño óptimo para cada señal de trading generada. En la práctica, esto significa decidir cuántas acciones, contratos de futuros o lotes de un instrumento financiero determinado vamos a comprar o vender.

Del mismo modo que ocurría anteriormente, podrás crear distintos sub-módulos que encuadren la lógica de distintos procesos de dimensionado. Por ejemplo, podrías tener el sub-módulo que calcula el tamaño de una posición en función de:

  • un porcentaje de riesgo sobre el tamaño de la cuenta: por ejemplo, arriesgar un 0,5% del equity por trade.
  • el tamaño mínimo que el broker admita para el instrumento en concreto: por ejemplo, 0,01 lotes de EURUSD.
  • el tamaño en función de la fórmula de Kelly
  • la volatilidad histórica del instrumento
  • o cualquier otro método que quisieras programar.

Tener modularizado el dimensionado de posiciones te ayudará a poder diseñar y probar nuevas estrategias más rápido, ya que una vez tienes la lógica programada podrás también reutilizarla tanto como necesites. Esto significa que será extremadamente sencillo cambiar de un sistema de posicionamiento a otro en una misma estrategia para poder verificar cómo funcionarían las distintas versiones.

Gestor de Riesgos

Creo que no hace falta decir que la gestión de riesgos es, probablemente, el punto más importante de una estrategia de trading. De hecho, una estrategia ganadora puede convertirse fácilmente en perdedora sin la gestión de riesgo adecuada.

Por esta razón es muy importante crear un módulo dedicado específicamente a la gestión de riesgo de la estrategia.

Recuerda que no es lo mismo la gestión de riesgo que el dimensionado de posiciones.

Te pongo un ejemplo para que lo veas claro:

Imagina que tienes una estrategia que dimensiona las posiciones en función de un % de tu equity. Dicha estrategia te ha dado 3 señales consecutivas de compra en EURUSD, por lo que tienes 3 compras realizadas en el mercado:

  • La primera era de 1 lote (100K EUR),
  • la segunda de 2 lotes (200K EUR)
  • y la tercera de 3 lotes (300K EUR)

Esto es así dado que el precio del EURUSD ha ido subiendo y tu valor de equity también, lo que significa que estás largo un total de 6 lotes (equivalentes a una exposición de 600K EUR en largo). Dado que calculas las posiciones en función de un porcentaje de tu equity, cada posición es mayor a la anterior (ya que cada posición acumula ganancias), tal y como dictan las normas de dimensionamiento de tu sistema.

Sin embargo, ahora imagina que el precio del EURUSD sigue subiendo y tu estrategia te vuelve a dar otra señal de compra. En ese momento, el dimensionador de posiciones calcula de nuevo el valor y resulta en una señal de compra de 4 lotes más. A nivel de tu estrategia todo ha ido bien – has recibido señales de compra y las has dimensionado tal cual dicta la lógica codificada.

Sin embargo, tu nivel de riesgo es cada vez mayor, ya que una caída repentina en el precio del EURUSD podría significar una pérdida importante en tu cartera. Y más aún teniendo en cuenta que la posición que estás colocando es cada vez mayor.

Por esta razón es tan importante añadir una capa de gestión de riesgos. El trabajo de este módulo será analizar tus posiciones en el mercado y determinar su nivel de riesgo usando una métrica previamente definida. En el caso del ejemplo, la métrica podría ser la exposición a una divisa en concreto. Con 6 lotes, cuentas con una exposición en largo de 600K EUR.

Ahora, la nueva posición de 4 lotes haría que tu exposición llegara al millón de euros en largo (10 lotes equivalen a una exposición de 1M EUR), pero tienes configurado tu gestor de riesgo para que no permita una exposición de más de 750K EUR. Esto significa que el gestor de riesgos actuaría como un limitador, y modificaría el tamaño de 4 lotes de la nueva posición a solamente 1,5 lotes. Estos 1,5 lotes serían el tamaño máximo que el gestor de riesgo permitiría para que se siguieran cumpliendo las normas de exposición máxima definidas.

El módulo de gestión de riesgos también puede utilizar la sub-modularidad que habíamos comentado anteriormente, ya que hay distintas maneras de medir el riesgo global de tu estrategia. Te muestro algunos ejemplos a continuación:

  • Exposición máxima a una divisa, región geográfica o tipo de activo
  • Factor de apalancamiento máximo
  • Valor en riesgo (Value-at-Risk o VaR)
  • Expected shortfall (ES)
  • Desviación estándar estimada de los retornos

De esta manera, también los podrías intercambiar fácilmente, dándote la flexibilidad de modificar tus criterios de riesgo según evolucionen tus estrategias o las condiciones de mercado.

Módulo de ejecución

El módulo de ejecución es el componente que toma las señales de trading aprobadas por el gestor de riesgos y las ejecuta en el mercado, ya sea a través de una conexión con tu broker o directamente en una exchange.

Esto significa que, idealmente, el módulo de ejecución debe recibir las órdenes a ejecutar con un formato estandarizado (que tu decidas) y luego las enrute hacia el destino adecuado. Esto significa que deberás crear, de nuevo, un sub-módulo para cada destino que pretendas operar.

De esta manera, un mismo código podría, por ejemplo, ejecutar órdenes en la plataforma MetaTrader 5 o en la exchange de Binance, simplemente escogiendo el sub-modulo de ejecución que necesitara. Esta flexibilidad es muy importante, ya que hace mucho más eficiente la creación de nuevo código para las estrategias y, a su vez, reduce la posibilidad de cometer errores.

Para ello, el módulo de ejecución deberá contar con una lógica de gestión de errores muy sólida, ya que actuará de traductor entre nuestro código y la API de nuestro broker o de la exchange. En otras palabras, el módulo contará con distintos conectores que se usarán según dónde se quiera ejecutar la estrategia.

El módulo de ejecución deberá ofrecer soporte para diferentes tipos de órdenes: a mercado y pendientes, como límite y stop. También aquí podrías implementar algoritmos de ejecución más avanzados para minimizar los costes de transacción. Por ejemplo, usando órdenes limitadas en lugar de ejecutar a mercado, o reduciendo el impacto en el mercado repartiendo una órden de gran tamaño en múltiples órdenes más pequeñas.

Portafolio

El módulo del Portafolio deberá realizar un seguimiento constante del estado de las operaciones activas en el mercado. Este módulo se va a encargar de poder proporcionar una visión integral de todas tus posiciones al resto de módulos que necesiten esta información. Como creo que ya estarás imaginando, el gestor de riesgos hará un gran uso del módulo del portafolio para poder acceder a las operaciones abiertas y calcular así las métricas de riesgo adecuadas.

Este módulo deberá ser capaz de consolidar datos de múltiples activos y presentar esta información de manera clara y estandarizada. Es decir, que si los módulos de tu Framework esperan recibir la información de las posiciones en un DataFrame pero la exchange te las devuelve en un JSON, conviertas de un formato a otro para que los distintos módulos reciban dichos datos en el formato estándar que hayas definido para tu arquitectura.

La eficiencia en la gestión del portfolio es esencial para la optimización de recursos y el consumo efectivo de la información por parte de las otras piezas del Framework.

Orquestador de eventos

El orquestador de eventos es el componente que se encargará de la sincronización entre todos los módulos de la infraestructura. Es decir, va a controlar que cuando el adaptador de datos detecte una nueva cotización en el mercado, dichos datos sean enviados al generador de señales, luego al dimensionador de posiciones, etcétera.

En otras palabras, se ocupará de orquestar toda la cadena de eventos que ocurren desde la recepción de nuevos datos de mercado hasta la ejecución de órdenes y la actualización del estado del portfolio.

Será muy importante que el diseño del orquestador de eventos facilite la adición de nuevos componentes o la modificación de los existentes, ya que muy probablemente te encontrarás con esta situación en el futuro.

En este aspecto, vale la pena invertir el tiempo que sea necesario en su diseño para que cuando tengas que añadir o modificar la infraestructura, el orquestador pueda asumir este cambio de la manera más flexible posible. Esto va a asegurar la escalabilidad y de tu infraestructura de trading algorítmico, junto con un mantenimiento mucho más sencillo de realizar.

En el curso, hemos diseñado el orquestador de eventos (al que por cierto hemos llamado Trading Director) alrededor de un bucle while principal que constantemente revisa el estado de una cola de eventos. Esta cola de eventos la construimos usando la clase Queue, lo que nos permite fácilmente disponer de una estructura multi-productor y multi-consumidor en la que cada módulo emite y consume un tipo de evento concreto.

Sistema de notificaciones

Finalmente, es necesario disponer de un sistema de notificaciones que te permita estar informado del estado de tus operaciones, alertándote de eventos importantes como la ejecución de una nueva posición o la desconexión con la plataforma. Esto es especialmente crítico en un entorno automatizado, donde la rapidez de tu respuesta a tales eventos puede significar la diferencia entre una pequeña corrección o una pérdida significativa.

En el curso, el sistema de notificaciones lo hemos creado para que envíe una notificación a través de Telegram para poder recibir alertas en el móvil estés donde estés. Esto lo hacemos mediante la librería Python Telegram Bot. Sin embargo, también se podrían enviar notificaciones por email o peticiones a una REST API para alertar a cualquier otro sistema.

Todos los módulos de infraestructura de trading algorítmico que creamos en el Curso

Esto te va a ofrecer una gran flexibilidad al poder ser capaz de recibir alertas en tiempo real sin importar dónde te encuentres. Usando una arquitectura de eventos, puedes personalizar este sistema fácilmente para notificar eventos específicos, como la activación de órdenes, alcanzar límites de riesgo o incluso cambios inesperados en los datos de mercado.

Ejecución: ¿local o en la nube?

Una vez tengas tu infraestructura de trading algorítmico creada, llegará el momento de tomar otra decisión crucial: operar localmente en tu propia máquina o utilizar recursos en el cloud. Ambas opciones tienen ventajas y desventajas significativas que debes considerar en función de tus necesidades específicas de trading, recursos y objetivos.

La ejecución local de tu infraestructura ofrece ventajas como el control total sobre el hardware y software, permitiendo una personalización absoluta según tus necesidades y ofreciendo un nivel superior de privacidad y seguridad, al evitar la transmisión de datos a través de internet (es decir, tu algoritmo sólo reside en tu ordenador en lugar de residir en un servidor externo).

Sin embargo, esta modalidad implica que, en caso de fallo de algún componente crítico como el procesador, la memoria o el disco duro, no solo se corre el riesgo de pérdida de datos, sino que también se detendría todo el proceso de trading, afectando potencialmente la continuidad operativa y la toma de decisiones en tiempo real.

A pesar de sus beneficios, la ejecución local conlleva limitaciones y responsabilidades adicionales. Los recursos están restringidos por el hardware disponible, y el trader debe encargarse del mantenimiento y actualización del sistema, lo que requiere tiempo y conocimientos técnicos. Además, la escalabilidad es un desafío, y cualquier expansión significativa implica inversiones considerables (nuevos servidores, almacenamiento, etcétera). La posibilidad de que un fallo técnico detenga todas las operaciones añade un nivel de riesgo que debe ser meticulosamente gestionado, incluyendo estrategias de respaldo y recuperación de datos.

Evidentemente, estos riesgos irán en función de tus demandas como trader. Si estás operando tu propia cuenta en un nivel bajo de capital, quizás no tenga sentido para ti mover tu infraestructura a la nube y te es suficiente ejecutarla en un ordenador de baja potencia, como una Raspberry Pi.

Sin embargo, si estás gestionando capital de terceros (ya sea directamente o a través de un Darwin, como es el caso de KomaLogic con KLV), mudar la operativa al cloud se vuelve casi de obligado cumplimiento.

La ejecución en la nube ofrece escalabilidad y flexibilidad, permitiendo ajustar los recursos según la demanda y acceder a la infraestructura desde cualquier lugar. Esta opción reduce la responsabilidad del usuario en cuanto al mantenimiento y actualización, delegando estas tareas al proveedor del servicio.

Ejecutar nuestra infraestructura en la nube nos permite además escoger el centro de datos que esté más próximo al servidor de nuestro broker, reduciendo así la latencia en las comunicaciones.

La elección entre ejecución local y en la nube debe considerar estos factores, incluyendo la vulnerabilidad ante fallos de hardware en el caso local, que podría interrumpir las operaciones y comprometer los datos. Mientras que la nube ofrece ventajas en términos de escalabilidad y mantenimiento, la ejecución local proporciona un control y seguridad superiores, aunque con un mayor riesgo de interrupción por fallos técnicos. La decisión final deberá basarse en un balance entre estas consideraciones, alineando la infraestructura de trading algorítmico con los objetivos, recursos y estrategias de gestión de riesgo del usuario.

Para nosotros, las ventajas que ofrece el cloud sobrepasan con creces a sus desventajas, y es la opción que usamos en KomaLogic. Además, si tienes curiosidad sobre cómo podrías ejecutar tus estrategias en la nube, en el curso te enseñamos cómo hacerlo paso a paso. Verás que es mucho más fácil y económico de lo que seguramente crees.

Conclusión

La creación de una infraestructura de trading algorítmico personalizada en Python te coloca, sin duda alguna, en una posición muy ventajosa para mejorar el proceso de diseño y ejecución de tus estrategias de trading. Al tener un control total sobre cada componente, puedes experimentar con nuevas estrategias o tecnologías y ajustar tu sistema de forma proactiva para mantener o mejorar tu rendimiento a medida que vas adquiriendo más experiencia y nuevos conocimientos.

Esta infraestructura no solo facilita la implementación de tus ideas de trading sino que también te brinda una comprensión profunda de su mecánica interna, un conocimiento muy importante que puede ser la clave para identificar mejoras o solucionar problemas de manera efectiva.

Si este viaje hacia la creación de tu infraestructura de trading algorítmico te parece intrigante y deseas profundizar aún más, te invitamos a explorar nuestro curso Trading con Python y MetaTrader 5: Crea tu Propio Framework. Allí, no solo aprenderás los fundamentos y técnicas avanzadas para construir cada uno de los componentes descritos, sino que también tendrás la oportunidad de aplicar este conocimiento en un proyecto concreto, consolidando tu aprendizaje y preparándote para poder personalizar el Framework según tus propias necesidades.

Como siempre, si tienes cualquier duda puedes contactar conmigo a través de nuestra comunidad en Discord.

Muchas gracias por tu lectura,

Martí

Escrito por Marti Castany

Martí Castany es Quant Researcher, Portfolio Manager y Co-Fundador de KomaLogic, una firma de trading algorítmico. Con más de una década de experiencia en el sector de la inversión sistemática, Martí se ha destacado en el desarrollo de modelos estadísticos, análisis y limpieza de datos y gestión cuantitativa del riesgo.

4 Abr, 2024

También puede interesarte…