¡Visita la nueva web!

martes, 10 de noviembre de 2009

Sistemas de trading. Episodio II: Optimización



Continuando con el episodio I; ahora que tenemos nuestro sistema de trading planteado, vamos a optimizarlo.

Para maximizar el rendimiento de un sistema deberemos ir por partes. Primero averiguaremos si el valor que hemos escogido (en nuestro caso, Telefónica) es el óptimo para este tipo de sistemas o hay algún otro que se adapta mejor por su propia naturaleza.

Así pues, corremos el test en cada uno de los valores del IBEX35 y vemos si hay alguno que destaca por el beneficio obtenido en las mismas condiciones que planteábamos para Telefónica.

Para ello, no hay más que ir recorriendo la lista del IBEX35 en la ventana de "Valores", asegurándose de que ProRealTime cargue los datos históricos desde 1999 si existieran (basta hacer zoom hacia afuera en el gráfico de precios para lograr esto).

Después de hacer este recorrido descubrimos que hay dos valores que destacan por encima de los demás. Uno es OHL y el otro es ACS. Ambos se comportan mejor que Telefónica. De hecho, Telefónica es el cuarto mejor con un beneficio de 3664€

Sin embargo, OHL le saca el mejor rendimiento a este sistema con 5849€.

Observando la curva de liquidez, vemos que el sistema es más noble en OHL, las pérdidas son más controladas y el beneficio final es superior. Atendiendo al gráfico de precios, podemos observar que OHL es un valor que oscila con mayor continuidad y menor brusquedad que Telefónica. Por lo tanto, nos olvidamos de Telefónica y, a partir de ahora, centraremos nuestros esfuerzos en OHL.

Hemos visto como, con una sencilla exploración del mercado, ya hemos mejorado enormemente nuestra eficiencia, centrándonos en un valor que se adapta mejor a nuestro sistema de trading.

Ahora es el momento de centrarnos en refinar los parámetros de nuestro sistema de trading. La idea es sustituir las constantes del sistema por variables.

En este sistema, las constantes más inmediatas son:

· El número de periodos de la media móvil del precio. Hasta ahora, 50.
· El parámetro de cálculo del RSI. Hasta ahora, 5.
· El umbral de RSI que consideramos como zona de sobreventa. Hasta ahora, 30.

Sustituimos estos valores en el código del ProBackTest por variables, que definiremos y a las que daremos un rango limitado.

Empezaremos por variar, a modo de ejemplo, los periodos considerados en el cálculo de la media móvil. Para ello, modificaremos el código, poniendo una variable en lugar de un número (hasta ahora, 50) en la definición de la media móvil:

Pincha en la imagen para verla al 100%

Como puedes ver en esta última imagen, pondremos una "n" en lugar del "50" en el código y añadiremos una nueva variable a la que llamaremos "n" en el programa, que aparecerá como "Periodos SMA" en la ventana del ProBacktest y que correrá entre 1 y 250, en saltos de 10 en 10.

Al "Aceptar", el programa se pondrá a calcular cuál es la media móvil que nos dará el máximo beneficio final.

Cuidado aquí, porque este cálculo se realiza por fuerza bruta.

Cuando se dice que un sistema de optimización funciona por fuerza bruta, significa que calcula absolutamente todas las combinaciones posibles y las ordena según resultados. Esto quiere decir que, si nos pasamos con el número de combinaciones, podemos sumir al ordenador en un cálculo demasiado largo o complejo, hasta el punto de dar la sensación de que se haya colgado. Por ello, es bueno no pasarse en el número de combinaciones y enfocar la optimización desde un punto de aproximaciones sucesivas.

Al terminar de calcular, ProRealTime nos presenta un "Informe de optimización" en el que nos desvela que, de todas las medias móviles contempladas, es la de 211 periodos, la que más jugo le saca a OHL en nuestro sistema, entregando un beneficio final de 13166€.

Vamos mejorando ¿verdad?

Ahora es el momento de incluir el resto de las variables en el juego, es decir, llamaremos "n" a los periodos de la media móvil, pero también llamaremos "r" a los periodos del RSI y "u" al umbral de sobreventa en el RSI y los sustituiremos en el código, añadiendo las correspondientes variables.

Ojo ahora, porque el número de combinaciones se dispara y debemos especificar rangos amplios en las variables, para poder encontrar la zona en la que se comportan mejor como equipo, pero también debemos comenzar dándoles un paso grande, para reducir mucho el número de combinaciones posibles y que el cálculo no se eternice. Nuestra intención es ver primero por dónde van los tiros y luego precisar hasta encontrar los valores exactos que combinan a las variables para dar el rendimiento máximo.

Así pues, ahora que ya sabemos que "n" va bien por la zona de 210, la ponemos a correr entre 200 y 220, con paso 5. A "r" (periodos del RSI), la haremos variar entre 1 y 20, con un paso de 1. La variable "u" (umbral de sobreventa en el RSI), recorrerá el intervalo entre 10 y 50 con un paso de 10.

Ponemos el ordenador a calcular y obtenemos un nuevo máximo de beneficio de 16.777€ en la combinación:

n = 205
r = 4
u = 30

Aunque en este ejemplo no ha sucedido, es posible que observásemos que "n" mostrase su óptimo en el extremo del intervalo (en este caso, en 220). Esto querría decir que el rango 200-220 ya no sería adecuado, pues no contendría el óptimo para "n".

Esto es perfectamente posible, pues el óptimo global no suele coincidir con el óptimo local. O, dicho de otro modo, es frecuente que, el óptimo de "n" esté en un determinado valor cuando la optimizamos por sí sola, sin contar con "r" y "u", y que este óptimo no coincida con el que se alcanza cuando se optimizan "n", "r" y "u" a la vez.

El beneficio obtenido por el óptimo del grupo será siempre mayor que el beneficio alcanzado al optimizar una sola variable. Por ello, no sirve optimizar primero una variable, luego otra y así sucesivamente. Hay que tantear el terreno con todas a la vez e ir precisando después.

Tras una serie de aproximaciones sucesivas, obtenemos los siguientes valores:

n = 204
r = 2
u = 24

Ahora es el momento de observar las entradas y salidas y buscar soluciones para los periodos en los que el sistema se comporta peor.

Si nos fijamos en el comportamiento de nuestro sistema, observamos que, como casi todos los sistemas caza-tendencias, flojea mucho en las fases laterales.

Para intentar contrarrestar este hecho, podemos añadir un indicador de tendencia y salir cuando éste nos avise de que la tendencia se pierde. En particular, en este caso utilizaremos el indicador ADX. Cuando éste sobrepase un tope, saldremos de la posición, aún cuando el precio no haya tropezado con su media móvil.

Hacemos una primera prueba con un ADX de 14 periodos y un tope de ADX de 50. Observamos inmediatamente que esto, por sí sólo, ya nos mejora ligeramente el beneficio.

Repetimos, tal y como hemos explicado, la operación de hacer variables estos dos parámetros del nuevo indicador. Les llamaremos "p" y "t".

Después de localizar con aproximaciones sucesivas cuáles son los valores óptimos de "p" y "t" por sí sólos, revisamos el resto de parámetros, dándoles de nuevo cierta libertad. Observamos una pequeña corrección en "u" que pasa a de valer 24 a 25.

Finalmente, llegamos a la siguiente combinación de variables:

n = 204
r = 2
u = 24
p = 9
t = 62

Esta combinación presenta un beneficio de 26.757€. Es decir, una rentabilidad de 1.238%, con tan sólo 15 operaciones en los últimos 10 años.

En resumen, nuestro código de ProRealTime quedaría como se muestra en la imagen. En la ventana de atrás se ve cómo quedaría el sistema de trading gráficamente.

Pincha en la imagen para verla al 100%

Hay infinidad de detalles que se pueden objetar, como por ejemplo, que hemos supuesto una comisión fija, que obviamente se queda obsoleta en cuanto el dinero crece. Esto no deja de ser una simulación teórica.

Sin embargo, lo que es incuestionable, es que ya tenemos un sistema que nos habría dado una buena rentabilidad en OHL si lo hubiéramos aplicado desde enero del 99.

Hasta ahora lo que hemos hecho ha sido:
  • Diseñar un sistema de trading sencillo.
  • Buscar un valor que se adapte naturalmente bien a ese sistema.
  • Hacer variables sus parámetros y optimizarlos.
  • Añadir alguna condición extra para mejorar el comportamiento en puntos críticos.
  • Re-optimizar los nuevos parámetros.
Son todos pasos básicos y tremendamente sencillos, que se pueden repetir una y otra vez. Sin embargo, es importante mantener la simplicidad del sistema pues, cuanto más se particulariza, menos flexible será el sistema y peor se adaptará al cambiante futuro, que es precisamente cuando queremos aplicarlo.

Que un sistema haya sido exitoso en el pasado no implica que lo sea en el futuro, pero esto es relativo. Cuanto más cercano el futuro más fiable será nuestro sistema. Ni la bolsa ni las empresas cambian radicalmente de la noche a la mañana. OHL seguirá comportándose de forma parecida a los últimos 10 años durante los próximos meses. Así pues, el último paso en el proceso de la optimización es:
  • Recalibrar los parámetros con el paso del tiempo para que el sistema siga teniendo validez.
Para dar por terminado el diseño de un sistema de trading, sería conveniente probarlo en distintas ventanas de tiempo. Hemos optimizado el sistema para un periodo fijo, pero es bueno ver cómo se comporta en intervalos más cortos y en diferentes momentos. Esto nos dará una mejor idea de la rentabilidad que podemos esperar de este sistema aplicado en un futuro, además de ayudar a refinar el conjunto de reglas.

Por último, decir que este sistema nos lo hemos ido inventando sobre la marcha, conforme escribíamos el artículo. Quisiéramos destacar que este sistema no es en absoluto brillante. Con un poco de interés y perseverancia se pueden conseguir sistemas muy superiores.

Desde Novatos Trading Club, esperamos que esta pequeña guía sobre cómo diseñar y optimizar un sistema de trading os haya sido de utilidad y deseamos que le saquéis provecho en forma de unos estupendos euros más en vuestras cuentas bancarias.


Si discrepas, si no entiendes algo, si estás de acuerdo, si tienes una idea, si te enfrentas a un problema ¡añade tu comentario!

6 comentarios:

  1. Hola, me he topado con este artículo mientras me encuentro "desarrollando" mi primer sistema de trading. El problema que le veo es el que al optimizar al máximo el sistema para un valor en concreto por un lado te olvidas del resto de valores lo que hace que con estos pueda dar resultados catastróficos. ¿O es que la idea es el optimizar el sistema para cada uno de los valores?

    ResponderEliminar
  2. No, no, no. Fíjate que, precisamente en este artículo, destacamos que el óptimo global (de todas las variables juntas) siempre supera o iguala al óptimo local (de una sola variable), así que lo que se trata es de optimizar todas las variables a la vez por aproximaciones sucesivas.

    El quid está en no sobrecargar el ordenador dando un rango amplio para cada variable y a la vez un paso también amplio. Conforme vayamos acotando los rangos, vamos afinando la resolución de la búsqueda.

    Espero haber aclarado las cosas.

    ¡Un saludo!

    ResponderEliminar
  3. Creo que no me he explicado bien, el emplear "valores" para referirme a las distintas acciones... A lo que me refiero es que en tu ejemplo optimizas el sistema para OHL obteniendo n=200, r=2... Vale, estos valores funcionan bien con OHL, ¿pero con el resto de acciones?

    Según he leido los artículos ha ido desarrollando una idea, he probado el sistema en todas las acciones del IBEX con los valores que me parecían buenos a priori y Gamesa ha sido la acción que mejor resultado ha obtenido (aunque en general hubiera ganado pasta con cualquiera :P). He obtimizado el sistema para Gamesa, pero en cuanto he probado el sistema con esos parámetros en el resto del acciones del IBEX me he llevado un gran chasco, ¡la mayoría presentaban perdidas!

    De ahí mi pregunta, ¿hay que optimizar para cada acción/futuro/materia en la que queramos invertir? ¿O es que directamente el sistema con el que he probado es una birria?

    ResponderEliminar
  4. Se me olvidó... luego he probado a optimizar los parámetros para Telefónica (creo recordar que era la 6ª o 7ª acción del IBEX que mejores resultados presentaba) y con esos parámetros he mejorado los resultados en el 90% de las acciones del IBEX...

    ResponderEliminar
  5. ¡Vaya! Me quedó sin responder este comentario...

    Lo hago ahora, con algunos meses de retraso, por desgracia.

    La idea sí era optimizar el sistema para un único valor nada más. No había entendido correctamente tu pregunta.

    Se puede pensar en operar siempre con un único gráfico. De hecho, hay muchos traders, especialmente de futuros, que sólo operan en uno o dos gráficos durante mcuhos años.

    Y, ciertamente, si el sistema funciona bien en un valor fuerte del IBEX, probablemente no vaya mal en la mayoría de los demás; pero se comportará peor y tampoco tiene por qué funcionar en muchos de ellos.

    Siento el retraso. Un saludo.

    ResponderEliminar
  6. Hola, una pregunta:
    ¿Se ha configurado un stop loss para hacer el backtesting?

    Saludos,

    ResponderEliminar