Archive for the 'Algoritmos Genéticos' 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

JavaScript e Inteligencia Artificial (1)

Saturday, November 29th, 2014

Siguiente Post

Gracias a la gente de JSConf Argentina 2014, hoy voy a estar dando una charla corta sobre JavaScript e Inteligencia Artificial. La idea es presentar rápidamente algunas ideas, algoritmos, demo de implementaciones, y cerrar con comentarios sobre lo que parece interesante seguir. Inteligencia Artificial es un término muy amplio, y que nació hace décadas. Desde entonces, ha ido acumulando definiciones, ambiciones, herramientas y aproximaciones a tratar de construir agentes inteligentes.

El repositorio de la charla en:

https://github.com/ajlopez/JavaScriptAI

donde hay enlaces a los proyectos presentados, demos, y recursos adicionales.

Los “fuentes” de la presentación de la charla en:

https://github.com/ajlopez/Talks/tree/master/JavaScriptAI

La presentación en línea en:

http://ajlopez.github.io/Talks/JavaScriptAI/index.html#/
http://ajlopez.github.io/Talks/

En la charla visito dos grandes temas: algoritmos genéticos, y redes neuronales. También hay un corto tiempo dedicado a explorar un árbol de juego de tablero. Y hay una demo de algoritmo genético aplicado a programación evolutiva. Quedó fuera de la charla el tema de crear árboles de decisiones, basados en datos. Pero ya lo voy a comentar en los próximos posts las ideas, demos y recursos que me interesaron, y los proyectos que estuve escribiendo.

Nos leemos!

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