Mucho se ha hablado y especulado sobre el Trading de Alta Frecuencia (High Frequency Trading o HFT en inglés) pero muy pocos conocen realmente en qué lenguajes se programan los algoritmos utilizados en este tipo de trading. Si bien es cierto que la mayor parte de algoritmos de HFT están escritos en C++ (preferido por la mayoría de traders, por encima de Java o C#) aunque Python empieza a tener su lugar. No obstante, investigando un poco nos encontramos rápidamente con una nueva generación de lenguajes aplicados a mercados financieros que seguro que darán que hablar y que hoy por hoy son prácticamente desconocidos. En particular, estos lenguajes son:
- Haskell: creado originalmente por Haskell Curry en los años ochenta, se trata de un lenguaje de programación puramente funcional, esto es, trabaja sobre la base de funciones que describen cómo son las cosas. Además es un lenguaje tipificado estáticamente lo que significa que la comprobación de tipos se realiza durante la compilación, y no durante la ejecución, lo que permite que los errores de programación sean detectados antes, y que la ejecución del programa sea más eficiente. Podéis encontrar más información en la página de referencia del lenguaje, http://www.haskell.org/haskellwiki/Haskell . En español tenéis un excelente libro online titulado ¡Aprende Haskell por el bien de todos!
- OCaml: abreviatura de Objective Categorical Abstract Machine Language, fue desarrollado por el instituto francés INRIA a finales de los años ochenta, aunque los orígenes de los lenguajes sobre los que se basa se remontan a los años setenta, cuando Robert Milner desarrolla el lenguaje ML. Se trata de un lenguaje similar a Haskell al ser de tipo funcional pero que admite ser programado de manera no funcional y orientada a objetos. Podéis encontrar más información en su página oficial, http://ocaml.org/
- Clojure: desarrollado por Rich Hickey en 2007, tiene su base en el lenguaje Lisp estando su sintaxis construída sobre expresiones simbólicas que son convertidas en estructuras de datos por un lector antes de ser compiladas mediante bytecode en la Java Virtual Machine. Podéis encontrar más detalles sobre este lenguaje en la página oficial del proyecto, http://clojure.org/
- Erlang: creado en 1986 por Joe Armstrong para Ericsson, se dice que este lenguaje es el utilizado por los traders de alta frecuencia de Goldman Sachs. Erlang es un lenguaje orientado a concurrencia y distribución utilizado para crear aplicaciones masivamente escalables en tiempo real con requisitos de alta disponibilidad. Más información en http://www.erlang.org/
- Otros lenguajes similares que comienzan a ser utilizados para la implementación de estrategias HFT son Elixir (http://elixir-lang.org/), Scala (http://www.scala-lang.org/), F# (http://fsharp.org/) y D (http://dlang.org/).
Lógicamente, ahora viene la pregunta del millón: con tantos lenguajes, ¿cuál es el mejor? La respuesta no es única ya que va a depender en gran medida de cómo hayamos diseñado la estrategia y, por ende, de los requisitos de computación. Así podemos utilizar uno u otro lenguaje en función de nuestros objetivos:
- Si pretendemos maximizar el rendimiento de la estrategia, debido a que realizamos cálculos complejos (como por ejemplo simulaciones de Montecarlo) o modelización en tiempo real, necesitando respuestas rápidas, entonces nos interesará recurrir a los clásicos C++ o Java.
- Por el contrario, si buscamos que nuestros algoritmos funcionen correctamente al 100%, siendo los errores muy costosos para la estrategia, entonces es recomendable utilizar lenguajes funcionales como Haskell u OCaml.
- Si necesitamos reducir la latencia a toda costa, debemos desechar todo aquel lenguaje que posea «recolectores de basura» (esto es, mecanismos implícitos de gestión de memoria). En este caso, elegiríamos C++ frente a Java.
- En el caso de algoritmos que explotan ventanas de oportunidad y que requieren alta velocidad para lanzaar las órdenes, se recomiendan lenguajes dinámicos y funcionales concisos. En esta categoría estarían Python, Ruby y también Clojure.
- Si nuestro algoritmo trabaja con múltiples fuentes de información, entonces nos interesa utilizar lenguajes que cuenten con el mayor número de librerias y de opciones de integración. Aquí Java es el ganador con diferencia, pero C++ es una opción totalmente válida.
- Por último, si queremos aprovechar al máximo la tecnología multinúcleo disponible en máquinas sofisticadas y costosas, sería recomendable trabajar con lenguajes muy enfocados a la concurrencia, como es el caso de Scala, Erlang o Clojure, sobre todo si estamos gestionando o necesitamos reaccionar a un elevado número de eventos.
Por supuesto, ninguna de estas soluciones supera a la potencia de implementar un chip FPGA con todo el código codificado en el hardware incluyendo las reglas de la estrategia y la lógica de la gestión de órdenes y del riesgo. Con este tipo de soluciones por hardware se alcanzan latencias inferiores a 10 microsegundos, superando a cualquier algoritmo ejecutado por software aunque lógicamente el coste de este tipo de soluciones es superior. Pero sobre esto hablaremos en otro artículo ;).
Saludos,
X-Trader