Informe provisional sobre el desarrollo de la IA y la optimización del rendimiento del código

Imagen del título de la historia

El robot de póquer está muerto, ¡viva el BitSurfer! - No, en serio, ¿qué pasó?

El PokerBot y el Poker Advisor fueron dos proyectos muy interesantes, ¡y aprendí mucho de ambos! El PokerAdvisor recoge las cartas de la pantalla, las introduce automáticamente en una IA y predice el resultado de la mano. Mientras que el Pokerbot fue planeado para jugarse a sí mismo - todo estaba preparado, pero el poker online estaba casi prohibido en Suiza.

Así que era hora de seguir adelante. Pero, ¿cuál podría haber sido el siguiente gran desafío?

Gráfico de precios de Bitcoin

Me encontré con Coinbase, un corredor de criptografía, donde me interesaba más Bitcoin.

Tienen una API a través de la cual puedes conectar tu software de operaciones favorito como Metatrader o similar. Pero no.

El plan, por supuesto, es no interactuar con nuestro software de comercio favorito. Más bien, fue mi idea construir mi propia interfaz desde cero teniendo en cuenta mis necesidades. Fue increíblemente duro y una curva de aprendizaje muy empinada, pero ciertamente valió la pena el esfuerzo.

La primera versión alfa está lista. La interfaz es muy fea, pero la forma sigue a la función. Mi idea de un software bien diseñado no es principalmente una interfaz de usuario elegante. Más bien, quiero que mi software simplemente haga lo suyo. Por supuesto. En el fondo. Nada para instalar, nada para sentarse frente a la pantalla y decirle al software qué hacer a continuación. Sólo póngalo en marcha y mire con fascinación.

La interfaz consiste esencialmente en una visualización de los datos de mercado así como de los datos de entrada normalizados para la IA.

¿Qué he aprendido? Primero, tuve que conectarme a Coinbase. Aprendí mucho sobre las APIs y afortunadamente con los paquetes disponibles fue bastante fácil.

Introducción al aspecto del rendimiento de la programación

Tuve que aprender mucho sobre la estructuración de datos para la IA, y eso básicamente implicó mucho conocimiento sobre el rendimiento del código. Hasta el punto en que se vuelve completamente loco. Fue sobre todo acerca de mí todavía trabajando en mi máquina de 7 años de edad, que regresé de mi entrenamiento. Ha envejecido bien, pero realmente se puede sentir la edad.... ¡De mi próximo ordenador inminente, puedo esperar un rendimiento 10 veces mayor para mis casos de uso! El procesador por sí solo es alrededor de 400% más rápido si consume muchos hilos (lo cual hago).

Me encontré en la siguiente situación:

Mi código tarda alrededor de una semana en procesar 8 años de datos (cada punto de datos es de 2s ~ 126.000.000 puntos de precio). Mientras tanto, la próxima generación de procesadores y tarjetas gráficas está a sólo unos meses y es muy prometedora.

La cantidad de datos a procesar es inmensa, así que me metí en la optimización del rendimiento del código. Ya he tenido alguna experiencia con trabajadores de múltiples hilos para manejar múltiples tareas simultáneamente. Como resultado, ya tenía un poco menos de 3.5x de rendimiento ya que mi CPU tiene 4 núcleos. Ahora se tardaba dos días en procesar los datos de 8 años. Eso fue todavía demasiado. Cuando haga las pruebas retrospectivas, quiero ver los resultados. Y los quiero rápido.

Tuve que buscar más en la optimización del rendimiento y desarrollé mi propia abstracción de trabajador basada en la tarea en C#. Básicamente, implementa un método de fabricación que aprendí en mi pasantía en INA Lahr. Es como tener una máquina (o un trabajador) con una cola de entrada y una cola de salida. La cola actúa como un amortiguador y puede ayudar a cada núcleo de la computadora a distribuir el trabajo de manera uniforme. Es como un oleoducto modular y escalable donde los trabajadores pueden tomar artículos de una cola o bolsa y procesarlos.

Esto también dio un gran impulso al rendimiento. Ahora era capaz de procesar todos los datos en una noche, pero decidí replicarlos aún más para ver hasta dónde podía llegar. Me suscribí a una extensión de Visual Studio "dotTrace" que funciona muy bien para encontrar cuellos de botella dentro del código. Puedes grabar un rastro y luego ver función por función cuánto tiempo tarda en ejecutarse. Encontré una característica que no esperaba en absoluto: el constructor de cuerdas de salida estranguló todo el oleoducto. Puedes leer más sobre esto en ella pregunta del desbordamiento de la pila

Con todo, el proceso es bastante simple:

  1. Identificar la mayor carga de energía
  2. Elimínalo.
  3. Sigue haciendo esto hasta que tengas una actuación razonable.

En el ejemplo anterior, este sería el proceso de trabajo CLR con ID 10584. Esto suena un poco confuso en este punto, pero JetBrains tiene el árbol de llamadas a la derecha donde podemos ver qué función se está utilizando:

Conclusiones y conclusiones

Sé que habría más potencia en esta área, pero por ahora estoy bastante contento con el resultado.

Ahora mismo, 2 años pasan volando en menos de 4 minutos, y he cambiado de marcha si se quiere vigilar más de cerca las acciones.

captura de pantalla del backtester

La línea de equidad así como las estadísticas también se guardan. Es posible simular / ejecutar tantas cuentas y estrategias como se desee, con sólo una pequeña caída en el rendimiento.

Ya he probado diferentes estrategias con indicadores y demás. Sin resultados prometedores. Después de todo, encontré una estrategia ganadora que no hace ninguna de estas cosas. No sigue la tendencia ni apuesta en contra. No intenta predecir nada. Ni el punto de entrada perfecto ni la salida perfecta. Es bastante simple, pero no entraré en los detalles de la estrategia. Piensa fuera de la caja y puede que encuentres algo.

la línea de equidad subiendo

Eso es un enorme 20% de retorno anual. Para ser justos, habría hecho más espacio con la estrategia de compra y retención, pero por otro lado, no estoy prediciendo nada, no tenemos estos picos locos (y caídas).

Eso es algo en lo que puedo basarme y ver lo que es posible y lo que no. Una completa simulación de mercado en la caja de arena. Un entorno de prueba con posibilidades casi ilimitadas.

Eso es todo por hoy, y espero que hayan disfrutado el vistazo a algunos de mis proyectos en curso.