conflictos de clases, etc. En resumen, los algoritmos genéticos son muy buenos en la búsqueda de soluciones en problemas complejos donde el número de combinaciones posibles es tan grande que es imposible explorar todas ellas.
Pues precisamente el diseño de un sistema de Trading es un problema complejo donde el número de combinaciones posi-
El uso de algoritmos genéticos es un campo
en el que el trading lleva trabajando desde hace décadas,
teniendo todavía por delante mucho que recorrer.
Veremos sus fundamentos y el porqué
de su funcionamiento en el trading.
POR FRANCISCO LÓPEz VALVERDE
aLgOritmOS genÉtiCOS
SiStemaS de trading
COn
bles de reglas e información de indicadores es tan grande que no es posible evaluar todas las combinaciones. Los algoritmos genéticos se adaptan perfectamente al diseño de sistemas de Trading para encontrar las reglas que dan mejores resultados en los mercados financieros.
En este artículo veremos los fundamentos de los algoritmos ge- néticos, como funcionan, y un ejemplo de cómo se aplican para encontrar las mejores reglas de Trading.
Los Algoritmos Genéticos son métodos adaptativos que pueden usarse para resolver problemas de búsqueda y optimización. Es- tán basados en el proceso genético de los organismos vivos.
A lo largo de las generaciones, las poblaciones evolucionan en la naturaleza de acorde con los principios de la selección natural y la supervivencia de los más fuertes, postulados por Darwin (1859). Por imitación, de este proceso, los Algoritmos Genéti- cos son capaces de ir creando soluciones para problemas del mundo real. La evolución de dichas soluciones hacia valores óp- timos del problema depende en buena medida de una adecuada codificación de las mismas.
En la naturaleza, los individuos de una población compiten en- tre sí en la búsqueda de recursos tales como comida, agua y refugio. Incluso los miembros de una misma especie compiten, a menudo, en la búsqueda de un compañero. Aquellos indi- viduos que tienen más éxito en sobrevivir y en atraer compa- ñeros tienen mayor probabilidad de generar un gran número de descendientes. Por el contrario, individuos poco dotados producirán un menor número de descendientes. Esto significa que los genes de los individuos mejor adaptados se propagarán en sucesivas generaciones hacia un número de individuos cre- ciente. La combinación de buenas características provenientes de diferentes ancestros, puede a veces producir descendientes “superindividuos”, cuya adaptación es mucho mayor que la de cualquiera de sus ancestros. De esta manera, las especies evolu- cionan logrando unas características cada vez mejor adaptadas al entorno en el que viven.
Los Algoritmos Genéticos usan una analogía directa con el comportamiento natural. Trabajan con una población de indi- viduos, cada uno de los cuales representa una solución factible a un problema dado. A cada individuo se le asigna un valor o puntuación, relacionado con la bondad de dicha solución. En la naturaleza esto equivaldría al grado de efectividad de un orga- nismo para competir por unos determinados recursos. Cuanto mayor sea la adaptación de un individuo al problema, mayor será la probabilidad de que el mismo sea seleccionado para re- producirse, cruzando su material genético con otro individuo seleccionado de igual forma. Este cruce producirá nuevos in- dividuos descendientes de los anteriores los cuales comparten algunas de las características de sus padres. Cuanto menor sea la adaptación de un individuo, menor será la probabilidad de que dicho individuo sea seleccionado para la reproducción y, por tanto, de que su material genético se propague en sucesivas generaciones.
El poder de los Algoritmos Genéticos proviene del hecho de que se trata de una técnica robusta, y pueden tratar con éxi- to una gran variedad de problemas provenientes de diferentes áreas, incluyendo aquellos en los que otros métodos encuentran dificultades. Si bien no se garantiza que el Algoritmo Genéti- co encuentre la solución optima del problema, existe evidencia empírica de que se encuentran soluciones de un nivel aceptable, en un tiempo competitivo con el resto de algoritmos de optimi- zación combinatoria.
Ahora vamos a ver cómo funcionan los algoritmos genéticos.
Por un lado, tenemos el conjunto de soluciones de un problema, llamado fenotipo y el conjunto de individuos de una población natural, codificando la información de cada solución en una ca- dena, generalmente binaria, llamada cromosoma. Los símbolos que forman la cadena se denominan genes. Cuando la represen- tación de los cromosomas se hace con cadenas de dígitos bina- rios se le conoce como genotipo. Los cromosomas evolucionan a través de iteraciones, llamadas generaciones. En cada genera- ción, los cromosomas son evaluados usando alguna medida de aptitud. Las siguientes generaciones (nuevos cromosomas), se obtienen a partir de operadores genéticos, de sobrecruzamien- to y de mutación.
Un algoritmo genético puede presentar diversas variaciones, dependiendo de cómo se aplican los operadores genéticos (cru- zamiento, mutación), de cómo se realiza la selección y de cómo se decide el reemplazo de los individuos para formar la nueva población.
En general, el pseudocódigo consiste de los siguientes pasos:
1. iniCiaLizaCión
Se genera aleatoriamente la población inicial, que está constitui- da por un conjunto de cromosomas los cuales representan las posibles soluciones del problema. En caso de no hacerlo aleato- riamente, es importante garantizar que dentro de la población inicial, se tenga la diversidad estructural de estas soluciones para tener una representación de la mayor parte de la población posible o al menos evitar la convergencia prematura.
2. evaLuaCión
A cada uno de los cromosomas de esta población se aplicará la función de aptitud para saber qué tan “buena” es la solución que se está codificando.
Figura 1. Algoritmo genético
i: inicialización, f(X): evaluación, ?: condición de término, Se: selección, Cr: cruzamiento, Mu: mutación, Re: reemplazo, X*: mejor solución.
SISTEMAS DE TRADING
ABR-JUN 2013
49
3. COndiCión de tÉrminO
El AG se deberá detener cuando se alcance la solución óptima, pero ésta generalmente se desconoce, por lo que se deben uti- lizar otros criterios de detención. Normalmente se usan dos criterios: correr el AG un número máximo de iteraciones (ge- neraciones) o detenerlo cuando no haya cambios en la pobla- ción. Mientras no se cumpla la condición de término se hace lo siguiente:
Selección Después de saber la aptitud de cada cromosoma se procede a elegir los cromosomas que serán cruzados en la siguiente generación. Los cromosomas con mejor apti- tud tienen mayor probabilidad de ser seleccionados. Recombinación o Cruzamiento La recombinación es el
principal operador genético, representa la reproducción sexual, opera sobre dos cromosomas a la vez para generar dos descendientes donde se combinan las características de ambos cromosomas padres.
Mutación modifica al azar parte del cromosoma de los individuos, y permite alcanzar zonas del espacio de bús- queda que no estaban cubiertas por los individuos de la población actual.
Reemplazo una vez aplicados los operadores genéticos, se seleccionan los mejores individuos para conformar la po- blación de la generación siguiente.
De esta forma se consiguen los mejores individuos que llevan en sus cromosomas las mejores combinaciones para el entorno en el que se desarrollan.
Ahora vamos a ver un ejemplo de cómo se aplican estos algo- ritmos para diseñar las reglas de un sistema de Trading. Consi- deremos que estamos diseñando un sistema que opera (sólo en largo para simplificar el ejemplo) en un mercado de futuros en un gráfico de barras. Estas barras pueden ser, por ejemplo, de cinco minutos, veinte minutos o incluso un día. Una regla de Trading la modelamos como una función que nos devuelve en cada barra dos posibles valores “entrar en mercado” o “salir del mercado”. En cada barra se evalúa esta función. Si en la barra actual nos dice, por ejemplo, “entrar en mercado” y ya estába- mos comprados, entones no se hace nada porque se mantiene el estado. Si en la barra anterior estábamos fuera del mercado, entonces se realiza la compra porque hay cambio de estado. Las reglas de trading las representamos mediante estructuras de árbol. Por ejemplo, en la figura 2 podemos observar la regla de trading que “entra en mercado” cuando el precio de la barra actual es mayor que la media de las últimas 50 barras. La fun- ción “average” computa la media de n barras en el histórico. El parámetro de la función se especifica mediante el 50 que cuelga como nodo hijo en el árbol. La función “price” nos devuelve el precio de cierre de la barra actual. Por último, podemos obser-
var que el operador relacional “<” especifica la condición de que la media de 50 barras sea menor que el precio de la barra actual, o que el precio de la barra actual sea mayor que la media de 50 barras, según el sentido de lectura. En la figura 3 podemos observar otra regla de trading que “entra en mercado” cuando el precio de la barra actual es mayor que el precio máximo de las últimas 30 barras. La función “maximum” nos da el precio máximo de las últimas “n” barras, en este caso de las últimas 30 barras.
Ahora vamos a combinar estas dos reglas de trading para obte- ner una más compleja que “entra en mercado” cuando se cum- plen las dos condiciones a la vez. Esto se consigue mediante un árbol que une las dos reglas de trading mediante el operador relacional “and”. El resultado podemos verlo en la figura 4. Ahora consideremos que tenemos dos reglas padre que vamos a utilizar para obtener una nueva generación. En la figura 5 ve- mos la regla padre que usamos en la figura 4 y otra nueva regla padre que “entra en mercado” cuando el máximo de 30 barras es
Figura 2. Representación de regla de trading como estructura de Árbol.
Si el precio (price) de la última barra es mayor que la media (average) de las últimas 50 entonces “entra en mercado”
Figura 3. Si el precio (price) de la última barra es mayor que el máximo
mayor que la media de 28 barras y además el precio de la barra actual es mayor que el mínimo de las últimas 6 barras. Ahora el algoritmo genético selecciona de forma aleatoria un subárbol de cada regla padre. Esta selección la podemos ver en la figura
5 mediante un círculo en cada regla padre. A continuación, el
algoritmo sustituye el subárbol seleccionado en la regla padre 1 por el subárbol seleccionado en la regla padre 2 para así obtener una nueva generación. Cada nueva generación es evaluada para medir cómo de buena es y sólo las mejores generaciones obtie- nen descendientes. En este proceso también se incluyen muta- ciones al obtener las nuevas generaciones como, por ejemplo, ligeras variaciones de los parámetros de las funciones “máxi- mum” o “mínimum” y así obtener diversidad de individuos. Realizando este proceso con miles de generaciones, nos permite encontrar las reglas de trading que consiguen mejores resultado en los mercados. Este mismo proceso nos permite además que el sistema de trading se adapte de forma automática y natural a los cambios en su entorno y va evolucionando para sobrevivir en los mercados.
El instituto de investigación de las “nuevas tecnologías aplica- das al trading” de la Universidad de Málaga lleva varios años de estudio y ha conseguido resultados muy relevantes. Los re- sultados completos de esta investigación serán publicados, una vez esté concluida, en una revista científica especializada en la investigación de algoritmos genéticos de reconocido prestigio internacional. Así mismo un resumen de estos resultados será también publicado en Hispatrading Magazine.
Figura 4. Combinación de dos reglas de trading para formar otra más
compleja con el operador booleano “and”. Esta regla “entra en mercado” si se cumplen las dos reglas de trading que la componen a la vez, corres-
pondientes a las reglas de las figuras 3 y 4.
Figura 5. Formación de una nueva generación a partir de dos indivi-
SISTEMAS DE TRADING
ABR-JUN 2013
51
L
o primero es convencerse que, la programación enMQL4, es accesible para cualquier persona pero requiere de atención y ciertos conocimientos lógicos y matemáti- cos. Hay traders que piensan que encontrarán muchas dificultades en el estudio de la programación imaginán- dose complicados procesos los cuales se ejecutarán en sus equi- pos. Afortunadamente para la creación de programas en MQL4 creo que no se debe tener necesariamente conocimientos espe- ciales sobre la comunicación cliente-terminal , de sistema ope- rativo, del protocolo de red o del compilador.
Para empezar a programar basta con algunos sencillos princi- pios y con empezar a elaborar pequeños programas y después poco a poco abordar códigos más complejos.
Todos los programas desarrollados en MQL4 tienen una estruc- tura definida y es la base de un código correcto. Así, es necesario comprender los componentes de un programa.
Hay muchísimas funciones en el MQL4. Estas funciones son llamadas funciones estándar. Pero hay varias funciones de gran importancia, que se llaman funciones especiales. Un programa no puede ejecutarse sin ellas. Cada una de estas funciones tiene su propia tarea.
Uno debe entender correctamente cómo opera un programa MQL4. No todas las partes de código se utilizan con la misma frecuencia.
En los primeros artículos hemos aprendido nociones básicas del lenguaje de programación MQL4. Ahora vamos a estudiar cómo está organizado un programa en general.
La función especial es una función llamada a ser ejecutadas. A diferencia de las funciones comunes, las funciones especia- les sólo tienen la descripción y su llamada no se especifica en un programa. Cuando un programa se inicia para su ejecución en una ventana de un símbolo, el Terminal de Usuario pasa el control a una de las funciones especiales. Como resultado esta