Algoritmos: ¿Cómo reduzco la latencia en HFT?

Estos son algunos puntos al construir software para HFT

Después de varios años desarrollando sistemas comerciales de alto rendimiento, se me ocurren algunas reglas generales. Cuando me refiero al comercio de baja latencia / alta frecuencia, me refiero al software que debe tomar una decisión de compra o venta dentro de 5us (microsegundos).

Para lograr estas cosas, he aprendido que necesito olvidar todo sobre la ingeniería de software moderna. Debe cambiar de opinión por completo y olvidar todo lo aprendido en este campo: la latencia es el rey, no importa cuán feo sea su código .

Como resultado, resumiré todos los obstáculos que he encontrado al desarrollar este tipo de sistemas.

Lenguaje de programación : No, no existe un lenguaje perfecto para este tipo de operaciones, pero elíjalo con cuidado. ¡No solo tienes que entender cómo usarlo, sino dominarlo! Comprenda lo que hace en cada instrucción, cómo se administra la memoria cada vez que llama a un objeto, etc. SI está usando C # o Java, debe dominar el recolector de basura, esto podría ser mortal. Mi elección siempre fue C / C ++.

Elija sus tipos : dígame qué tipos está utilizando y le diré qué tan lento puede ser. Evite cadenas, fechas, bigDecimal, autoboxing, estructuras de datos complejas (por ejemplo, ArrayList crece, se apila, Maps rehash).

Evite la entrega de excepciones : ¡SÍ, evítelo! Es caro. El manejo de excepciones agrega al menos un 10-20% de tiempo de ejecución. Los compiladores necesitan agregar código adicional, cuidar la administración de la pila adicional para manejar las excepciones. Eso costó tiempo. Y antes de que alguien me diga que GCC usa el modelo de costo cero, yo diría, ¡perfile su sistema y mídalo! Recuerde, cada microsegundo cuenta.

Subprocesos: bloque de subprocesos / cambio de contexto, el planificador intervendrá, es difícil razonar sobre el rendimiento cuando hay muchos subprocesos. Comprenda cómo se comportan en su sistema operativo. Comprenda cómo funciona su arquitectura de hardware con subprocesos … Lo sé, es aburrido, pero esencial. No es necesario diseñar sistemas de hilos sofisticados (p. Ej., Amortiguadores de anillo, etc.). En la mayoría de los casos, cuanto más simple, mejor. Mi mejor enfoque: subprocesos anclados a un núcleo: use el giro ocupado para que el núcleo siempre esté mirando la cola .

Cachés : caché L1 a 5ns hasta disco a 10ms. La memoria principal es de 100 ns. Para ser lo suficientemente rápido, uno debe considerar dónde se almacenan los datos. Asegúrese de que sus algoritmos y estructura de datos aprovechen los cachés L1 tanto como sea posible.

Capas de abstracción : Olvídese de encapsular, hacer que su código sea agradable, limpio y reutilizable … Cuando los datos se pasan de una capa a otra, los datos se copian. ¡El programador elimina la prioridad de nuestro proceso para dar a otros procesos su “parte justa”, lo que significa que se pierden toneladas de ciclos de CPU!

Calentamiento de los datos : asegúrese de asignar previamente todas sus estructuras de datos antes de que se inicie el sistema principal. También tenga en cuenta los objetos reutilizables, para que no tenga que asignarlos más tarde. Recuerde, la asignación es costosa.

Ariel Silahian
http://www.sisSoftwareFactory.com/quant
https://twitter.com/sisSoftware

  • Estar físicamente lo más cerca posible del mercado
  • Eliminar tantos saltos intermedios como sea posible
  • Uso de hardware y software ultrarrápidos
  • Tomar pocas decisiones en tiempo real, excluyendo la estrategia, que debe ser externa a los servidores comerciales

Sin embargo, si está haciendo esta pregunta, seguramente no está listo para HFT ya que no es un juego para aficionados, y esta es una pregunta de aficionados.

Te enfrentarás a los mejores y más brillantes en ciencias de la computación, finanzas y economía. Sus competidores tendrán presupuestos casi ilimitados.

No solo tienes que ser tan bueno como ellos para evitar perder tu camisa, sino que debes ser mejor que ellos para ganarle al mercado. Si vences al mercado, con demasiada frecuencia, realizarán ingeniería inversa de tu algoritmo, volviéndote al punto de partida.

Usted puede:

Opere inteligentemente: si ve patrones que otros no, entonces no necesita preocuparse por la latencia en absoluto, y todavía hay muchas oportunidades que son insensibles a la latencia comercial.

O unirse a la carrera armamentista al igual que todos los demás: co-lo, SO en tiempo real, usar FPGA para ejecutar, usar todo tipo de equipo costoso para ahorrar unos nanosegundos aquí y allá, dejando que los proveedores de hardware se rían hasta el banco y se fue con usted siempre disminuyendo los rendimientos día a día.