Archive for the 'Jav' Category

Aplicando Machine Learning a FinTech (2) Algoritmo Genético para Estrategia de Trading

Friday, December 25th, 2015

Anterior Post

El año pasado puse a punto una librería de algoritmos genéticos, con ejemplos que usé en la JSConf 2014 de Argentina.

https://github.com/ajlopez/SimpleGA

Hace unas semanas volví a usarla para otro ejemplo, esta vez orientada a FinTech: generar estrategias de compra/venta de acciones. Era una de las ideas que tenía preparadas para el Hackathon internot de Poincenot. Pero luego el tema del hackathon no fue FinTech, sino orientado a CashMoon. Igual me gustó la idea inicial, y hoy seguí explorándola. Veamos los primeros resultados. Pueden verlo en:

https://github.com/ajlopez/SimpleGA/tree/master/samples/trading

Lo que me faltaba eran datos de acciones. Los conseguí de los datos que usa el juego de Bloomberg

http://www.bloomberg.com/features/2015-stock-chart-trading-game/

Cada compañía tiene valores en un archivo .csv, y los tomé como ejemplos de entrenamiento. Muchos de los valores son diarios, y otros son por día/hora, o por día pero espaciados. Debería conseguir mejores valores. Espero que el próximo experimento lo haga con valores diarios de acciones de compañías de mi pais, Argentina. Eso queda para próximo post.

El desarrollo del genotipo fue encarado, en lo que se pudo, siguiendo TDD (Test-Driven Development). Como hay un componente aleatorio en el desarrollo de una población, algunos tests quedaron siendo no determinísticos. Pero para lo que necesito ahora basta.

Como siempre, sigo dos guías en mis desarrollos: simplicity pays, y baby steps.

Esos dos principios me llevaron a primero probar con datos simples, de series ascendentes, o series de valores descendentes. Despues, a no preocuparme por los días: solo me interesa cómo varia el valor de una acción del tiempo T al tiempo T+1, donde el intervalo puede ser cualquiera. Luego de los primeros resultados se puede ir mejorando el experimento, el algoritmo y los datos.

Y con respecto al algoritmo del genotipo, su forma de representarse y evaluarse, quedará como tema de otro post. Pero baste adelantar que se basa en examinar valores consecutivos en el tiempo de una acción (por ejemplo, su comportanmiento en 3 “días”), y si baja o sube, comprar o vender tal monto (en unidades de moneda). Cada uno de los genes expresa una de esas estrategias.

El tema de la simplicidad me lleva a usar NodeJS y mi propia librería: no necesito frameworks mamutescos para realizar estos experimentos. Como suele decir @substack, NodeJS es ideal para estos experimentos de “mad science”.

Si en el directorio del ejemplo ejecutan:

node train ge lulu

Pueden obtener:

Lo que hace internamente es:

– Generar una población inicial de 1000 estrategias de trading aleatorias
– Ejecutar 100 generaciones (evaluaciones) de esas estrategias contra los datos de entrenamiento (en este caso dos compañías)
– En cada generación/pasada quedarse con los mejores y mutarlos, para alimentar a la próxima generación de traders (notablemente, no necesité cruzamiento, solo mutación, de nuevo, simplicidad, baby step, no usar algo si no se necesita todavía)

El resultado final muestra el mejor trader encontrado, su composición genética (a explicar en próximo post) y su evaluación. En este caso, partiendo de 2000 dólares iniciales (1000 por empresa), consiguió generar 2500 dólares. La longitud de estas series está en los 200 valores promedio. Si fueran días, hubiéramos obtenido un retorno de un 25% en menos de un año. No está mal para el primer experimento.

Una vez obtenido un resultado interesante (el de arriba fue mi primer primer experimento con datos no inventados), pasé a entregar traders con unas compañías y comparar sus resultados con los valores de otras.

Así, ejecutando:

node train tsla nflx — googl yhoo

se entrena con dos compañías (Tesla, Netflix) y se ejecuta el mejor trader obtenido con valores de otras dos compañías (Google, Yahoo):

 

En próximos posts: más detalle del cromosoma usado, algoritmo de mutación, y pruebas con más datos.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez