Para todo sistema de trading hay que elegir el conjunto de parámetros con el que ponerlo a operar. Seleccionar los parámetros adecuados de un sistema es complicado pues la elección puede dar lugar a sistemas con rendimientos totalmente diferentes y por supuesto estropear un sistema ganador.
Aunque los sistemas han de reoptimizarse periódicamente para ajustarlos a la dinámica cambiante del mercado, el verdadero valor de la optimización de un sistema reside - en mi opinión - en la evaluación de su robustez. Utilizo la optimización de parámetros como una técnica para evaluar si el sistema seguirá siendo rentable en el futuro y no solo en el backtest.
Por lo tanto utilizo las técnicas de optimización de sistemas para saber si nuestro sistema es robusto y operará bien o por el contrario perderá dinero. Una buena optimización para un sistema con unos cinco o seis parámetros conlleva tal cantidad de pruebas históricas (backtest) que podría llevarnos una eternidad (literalmente). Para resolver esto se hace uso del algoritmo genético y finalmente lo más complicado será elegir de entre los resultados que nos ofrezca este algoritmo un conjunto de parámetros correcto.
Hasta ahora esto era una tarea muy compleja y que fácilmente nos llevaba a la sobreoptimización. Tras muchas pruebas he podido comprobar cómo los mejores resultados se obtienen al aplicar una técnica de minería de datos llamada k-mean clustering.
¡Todo este proceso es necesario para saber si nuestro sistema es o no robusto! Se entiende que muchos traders arrojen la toalla con los sistemas al sobreoptimizar consiguiendo únicamente
sistemas que funcionan en backtest y se estrellan en forwardtest. Trataré en este artículo de explicar cómo utilizar esta nueva técnica de la forma más sencilla posible - tal y como hago en mis
cursos de trading automático - porque el proceso, una vez entendido, renta muchísimo en nuestras cuentas de trading.
Problema 1. ¡Demasiados backtest!
Por cada parámetro que elegimos optimizar en un sistema aumenta el número de backtest a realizar y por tanto alarga el tiempo que tarda la optimización en completarse. Si por ejemplo tenemos solo dos parámetros y queremos probar las combinaciones de 100 valores para cada uno, solo tendremos que hacer 100x100 = 10,000 backtests. Si añadimos un tercer parámetro con sus respectivos 100 valores para probar habrá que multiplicar esos 10,000 backtests por 100, con lo que tenemos 1,000,000 de pruebas... Todavía no es demasiado pero a este ritmo pronto empieza a ser algo inmanejable y cuando decidimos optimizar 5 o 6 parámetros nuestro ordenador casero, por más moderno y potente que sea, nos dirá que necesita una eternidad para calcular tantísimos backtests.
La solución pasa por utilizar el algoritmo genético. Este algoritmo realiza unos backtests iniciales de manera aleatoria y selecciona los que mejor resultado han tenido. A continuación varía ligeramente los parámetros de estos backtests positivos (mediante cruce y mutación, de ahí su nombre) y vuelve a probarlos, así sucesivamente evoluciona su exploración de parámetros hasta encontrar los resultados óptimos.
El algoritmo no tiene misterio, sin embargo sí hay algunos trucos técnicos a la hora de utilizarlo con metatrader ya que el algoritmo tiene por diseño una tendencia a encontrar óptimos locales... Es decir, cuando encuentra el primer conjunto de valores buenos se detiene obviando otros conjuntos de valores mucho mejores. Aunque como digo, correctamente utilizado esto no es un problema.
En el siguiente gráfico se muestra el resultado de una optimización, donde cada punto azul es el resultado de un backtest, el eje vertical representa la estadística que estamos mejorando. Como se ve con cada nuevo backtest el algoritmo genético arroja mejores resultados:
Ahora hay que elegir entre los resultados del algoritmo genético. Esta es la parte difícil y en la que en hemos trabajado mucho para que se pudiera realizar fácilmente con Alphadvisor, nuestra
herramienta de diseño de sistemas de trading.
Problema 2. ¿Cómo elegir el conjunto de parámetros?
Si fuesemos directos a elegir el conjunto de parámetros que más beneficio hubiese dado tendríamos seguramente un problema. Con toda probabilidad ese conjunto será fruto de una sobreoptimización y operar con ellos en forwardtest nos llevará a la ruina.
Es mucho mejor buscar un conjunto de parámetros positivo que tenga otros conjuntos cercanos de similares características, es decir buscar "vecinos parecidos" para asegurarnos que estamos en un "buen barrio".
Cuando optimizamos dos parámetros es relativamente fácil hacerlo de manera visual (aunque también tiene su dificultad), por ejemplo en el siguiente gráfico se ve claramente una buena zona paramétrica para seleccionar:
¿Pero qué sucede cuando tenemos más de dos parámetros? No podemos imaginarnos un espacio de cuatro, cinco o diez dimensiones. La solución tradicional a esto fue optimizar de dos en dos. Es decir, primero optimizamos dos parámetros y los seleccionamos visualmente, con buenos vecinos, a continuación optimizamos otros dos parámetros y los volvemos a seleccionar, etc. Esto es poco eficiente, tedioso y relativamente incorrecto, pero era lo mejor que se podía hacer... hasta ahora.
El algoritmo k-means clustering
Podemos utilizar el algoritmo de minería de datos k-means clustering para seleccionar los conjuntos de parámetros óptimos de nuestro sistema aunque tengamos más de 2 parámetros optimizados (y por tanto más de tres dimensiones en el espacio de búsqueda de parámetros).
Para explicar cómo funciona utilizaré un
ejemplo gráfico sacado de la página de scikit-learn, una libería de Machine Learning para Python. En el ejemplo, tenemos una imagen y se utilizan 3 bytes para guardar el color del pixel en sistema RGB. Utilizando el algoritmo k-means buscamos clusters o agrupaciones de colores muy similares en estas 3 dimensiones de color. En concreto la imagen original estaba compuesta por
96,615 colores únicos pero hemos buscado 64 agrupaciones de colores muy similares. La primera imagen es la original de 96,615 colores y la segunda tiene una paleta de solo 64 colores encontrados con el algoritmo. Como veis el resultado no está nada mal, para apreciar diferencias hay que fijarse en masas amplias de color como el cielo.
Haremos algo similar con nuestras optimizaciones para encontrar conjuntos de parámetros optimos con "buenos vecinos", esto es, que sean robustos.
Y los resultados son bastante buenos, en la imagen se ve un análisis estadístico hecho con
Alphadvisor de 10 clusters obtenidos al optimizar uno de los sistemas. En la parte inferior el análisis detallado de cada cluster. Los resultados son un forward test de marzo, abril y mayo de 2013.
Hemos empezado a desarrollar el algoritmo k-means dentro de
Alphadvisor, en su módulo optimizador, en breve estará disponible para todos y estoy seguro que mejorará la operativa de los usuarios de la herramienta pues este algoritmo permite optimizar de una forma más segura cualquier sistema de trading automático.