intro andres garcia

Doctor en Filosofía, experto en Tecnologías de la Información y la Comunicación (TICs) y trader por cuenta propia con más de 30 años de experiencia. Es propietario del portal TradingSys.org dedicado al trading cuantitativo y profesor del curso de Experto Universitario: “Sistemas y modelos cuantitativos de trading algorítmico” impartido por la Universidad Politécnica de Madrid.
Andrés A. García / TradingSys.org

 

  • ¿Se imagina disponer de una máquina que construye miles sistemas, los evalúa y genera el código para nuestra plataforma de trading favorita? Esto que hace unos años sonaría a Ciencia Ficción hoy es posible mediante software de programación genética. En el presente artículo veremos cómo mejorar sistemas empleando esta prometedora tecnología.
  • Artículo publicado en Hispatrading 23.
  • Por Andrés A. García, David Urraca y Carlos Prieto.

 De todos es sabido que el desarrollo de estrategias automatizadas es un proceso tedioso que consume ingentes cantidades de tiempo y recursos de todo tipo, constituyendo uno de los principales cuellos de botella del trader sistemático. En nuestra actividad profesional el I+D lo es todo: Siempre estamos sedientos de ideas y metodologías, buscamos con avidez caminos poco transitados que nos proporcionen alguna ventaja aprovechable. En definitiva, buena parte de nuestro trabajo consiste en probar cosas nuevas, cuantas más mejor y además hacerlo deprisa. Por ello, cualquier herramienta tecnológica que contribuya a acelerar el ciclo de producción de sistemas bienvenida sea. En este contexto, pensamos que el software para la generación automatizada de sistemas y, en particular, las plataformas de programación genética (GP), constituyen una alternativa prometedora al desarrollo convencional de estrategias que merece ser explorada.  

No nos detendremos aquí en los detalles de la tecnología de programación genética ni en describir las aplicaciones existentes, de ello ya hemos hablado en otros artículos publicados recientemente. Bástenos comentar que las plataformas programación genética más avanzadas permiten:

  1. Combinar fuentes diversas de datos (series de precios, indicadores) y extraer información relevante que facilita la construcción de sistemas basados en reglas discretas.
  2. Generar estrategias de manera flexible en función de un conjunto de reglas y de criterios de construcción seleccionables por el usuario.
  3. Realizar una evaluación de cada sistema durante el proceso de construcción y construir un ranking de estrategias mediante una función de ajuste basada en ratios e indicadores de calidad.
  4. Implementar mecanismos (separación efectiva de las regiones In-Sample y Out-Sample, limitación de la complejidad estructural, tests de robustez, etc.) que prevengan la sobreoptimización.
  5. Compilar automáticamente las reglas de cada sistema en código utilizable por diferentes plataformas de trading.

Además de la velocidad y calidad del código generado, en una plataforma de programación genética es importante contar con una amplia diversidad de opciones que nos permitan dirigir los procesos de construcción hacia el tipo de estrategia que estamos buscando.  Necesitamos decidir qué indicadores y tipos de órdenes se van a emplear, ponderar su relevancia, si la estrategia será intradiaria o dejará posiciones abiertas, si se van a trabajar ambos lados de la operativa, si las reglas para largos y cortos serán simétricas, si buscamos lógicas tendenciales o antitendenciales, etc. En definitiva, todas las decisiones que un desarrollador experimentado tomaría antes de ponerse a programar nada. Los procesos de construcción de estrategias con plataformas de programación genética admiten al menos estas tres aproximaciones:

  • Desarrollar sistemas a partir de cero, indicando a la plataforma las características generales del producto que queremos obtener. Una vez elegidos los mercados, las opciones de construcción y ratios diana (fitness function) el motor de programación genética genera una población aleatoria que, en sucesivas generaciones y en función de unos criterios establecidos, irá evolucionando hasta obtener un repositorio estrategias que satisfacen los objetivos de partida. 
  • Desarrollar los sistemas por ingeniería inversa. Dado un sistema que funciona y conociendo sus ratios, tratamos de replicarlo obteniendo un conjunto de reglas equivalentes que se aproximen a los resultados del sistema de partida. 
  • Desarrollar variantes de un sistema. Esta metodología requiere que la plataforma incorpore un editor de código que nos permita incluir las reglas del sistema inicial y un módulo específico para mejorar automáticamente partes de dicho sistema, añadiendo reglas nuevas o sustituyendo las existentes por otras. En las siguientes líneas abordaremos esta aproximación.

PLANTEAMIENTO DEL PROBLEMA

Nuestro punto de partida será un sistema tendencial intradiario para largos y cortos, con alta cadencia operativa y unos ratios que consideramos discretos. Aunque se trata de una lógica multimercado, el instrumento de referencia será el ES (E-mini S&P500) en time frame de 15 minutos. Las reglas de esta estrategia son muy simples:  

ENTRAR LARGOS:

Si el cierre actual cruza por encima de una EMA de 500 barras, es mayor que una EMA de 25 barras y el RSI de 14 barras está por encima del nivel 50. 

ENTRAR CORTOS:

 Lógica Inversa.

CERRAR LARGOS: 

Si el cierre actual cae por debajo de una EMA de 25 barras.

CERRAR CORTOS: 

Lógica inversa.

  • El sistema es de tipo reverse: No es necesario esperar al cierre de una posición para entrar en sentido contrario.

 Pese a su simplicidad, estamos ante una lógica robusta y no optimizada. Algunas variantes de esta lógica, que incorporan filtros y stops de acompañamiento, llevan funcionando en operativa real muchos años, por lo que podemos considerar el tramo 2008-2015 como región Out-Sample. Los resultados obtenidos, aunque manifiestamente mejorables en muchos aspectos, son más que aceptables para una lógica tan básica. Por ello, consideramos que es un buen punto de partida en nuestro experimento.

pastedGraphic.png

Sistema Net Profit Max DD. % Win BMO

Profit Factor

SQN Sharpe Ratio MAR

Ratio

ST36 $67.773 -$4830 39,4% $36,2 1,37 4,47 0,10 0,8

Una vez creada la estrategia en la plataforma StrategyQuant (SQ) procedemos a configurar las opciones de nuestro experimento. En primer lugar dividiremos el histórico disponible (2001-2015) en las regiones:

  • In-sample (IS) (2001-2007). Que utilizará SQ para construir los sistemas y hacer una primera evaluación de sus reglas. 
  • Out-Sample (OS) (2008-2014). Para realizar una evaluación de las estrategias exenta de sobreoptimización.

También es posible establecer una región de validación en SQ, interpuesta entre IS y OS, que evite la contaminación de resultados en tramos contiguos, pero en este caso no vale la pena debido al enorme tamaño del OS.

El siguiente paso será elegir los bloques de construcción (indicadores, operadores lógicos, patrones, rangos de precios, tipos de órdenes, etc.) que serán empleados para mejorar el sistema. A los indicadores que queremos trabajar especialmente asignamos una ponderación más alta, los que no nos interesan se deshabilitan. Alternativamente también podemos trabajar un grupo de indicadores en cada fase del proceso de selección.

 Seguidamente establecemos la función de bondad de ajuste o fitness function (FF). Este es un elemento fundamental ya que tanto los sistemas que se omiten y seleccionan como el ranking de estrategias mejoradas dependen del valor de esta función. En nuestro caso elegimos una FF múltiple ponderada del siguiente modo:

Ratio Ponderación
SQN 4
Stability 2
%Stagnation 2
Degrees of Freedom (DoF) 1

Incluimos como ratio de performance el SQN, con elevada ponderación, junto con tres estimadores de calidad:

  • El SQN (System Quality Number) es el cociente entre  media y desviación de las operaciones multiplicado por la raíz cuadrada del número de operaciones. De este modo consideramos mejor un sistema cuando aumenta su BMO, disminuye la desviación estándar (empleada como estimador de riesgo) y/o aumenta la cadencia operativa en el período analizado.
  • El ratio Stability mide la suavidad de la curva de beneficios. Se consideran mejores los sistemas que evolucionan por una pendiente regular. Por ejemplo;  un sistema ideal que gane $100 en cada operación, tendrá una pendiente de 100  y error típico de 0 y un coeficiente de determinación (R^2) de 1. Dos sistemas pueden terminar con el mismo beneficio, incluso evolucionar por la misma pendiente pero ser uno mucho más estable que el otro.
  • %Stagnation es un estimador que mide el porcentaje tiempo que un sistema está sin alcanzar nuevos máximos. Por tanto, cuanto más bajo sea su valor mejor. 
  • Degrees of Freedom (DoF) es la diferencia entre el número de operaciones y el estimador de complejidad. El ratio complexity es el número de restricciones del modelo: reglas, variables, operadores, indicadores, etc.  Por ejemplo  la regla: 

 Close[1] > EMA(High,25)[1] 

Tendría una complejidad de 7: Cierre, barra del cierre, operador lógico, tipo de media, serie de la media, valor de la media y barra de la media.

 De este modo la función de ajuste (FF) será un valor entre 0 y 1 que representa la media ponderada de los cuatro ratios. Como se trata de mejorar un sistema dado, el criterio de selección será muy simple: Pasarán a formar parte del banco de estrategias todos los sistemas cuya FF supera a la del sistema original.  

FASES DEL EXPERMENTO

Dividimos el experimento en tres fases, en cada una de las cuales buscamos generar aleatoriamente una base amplia de sistemas con reglas nuevas o modificadas que mejoren el sistema original. SQ nos permite buscar mejoras específicas en las reglas de entrada, salida y tipos de órdenes. 

pastedGraphic_1.png

En la primera fase obtenemos un ranking de 300 sistemas, todos ellos con FF mayor que el sistema original. De ellos seleccionamos los cinco mejores, considerando:

  • Los mejores valores FF en la región IS.
  • Que no contengan reglas nuevas repetidas o muy parecidas. 
  • Que incorporen mejoras tanto en las reglas de entrada como de salida.

En la segunda fase repetimos el proceso aleatorio de mejora tomando como base los 5 mejores sistemas de la primera fase y estableciendo como criterio de selección para formar parte de este nuevo ranking: FF > media FF sistemas Fase 1. De este modo obtenemos un segundo banco de 159 sistemas mejorados.

En la tercera fase evolutiva seleccionamos, siguiendo los criterios ya descritos, los 5 mejores sistemas de la fase 2. Repetimos el proceso aleatorio de construcción partiendo de estos sistemas y elaboramos un tercer ranking con el criterio FF > Media FF sistemas fase 2.

Finalmente obtenemos 24 estrategias que en conjunto mejoran significativamente los ratios del sistema original.

RESUMEN DE RESULTADOS: 

En las siguientes tablas mostramos los resultados promedio en IS y OS obtenidos en las tres fases considerando cada ranking de estrategias:

  F. F. Net Profit Máx. DD % Win BMO Profit Factor SQN Sharpe AROR
Ratio
ST36 Original 0,757 $22.645 $2.718 38,62% $27 1,32 2,72 0,09 20,50%
Fase 1 Máximo 0,791 $30.607 $3.755 45,20% $67 1,97 4,05 0,2 24,70%
Mínimo 0,762 $12.283 $1.285 36,90% $21 1,32 2,7 0,08 13,50%
Promedio 0,769 $20.875 $1.997 40,70% $45 1,61 3,29 0,14 19,30%
Fase 2 Máximo 0,802 $34.529 $3.434 59,00% $112 2,28 4,56 0,3 26,50%
Mínimo 0,77 $15.658 $1.167 39,90% $36 1,39 3,2 0,11 0,00%
Promedio 0,776 $27.429 $2.735 47,10% $51 1,54 3,58 0,15 23,00%
Fase 3 Máximo 0,802 $33.236 $3.222 59,60% $91 1,92 4,49 0,24 25,90%
Mínimo 0,772 $24.959 $1.386 43,00% $40 1,42 3,13 0,12 21,90%
Media 0,788 $29.400 $2.308 48,40% $59 1,61 3,87 0,16 24,10%
Out-Sample 2008-2015 → →
  F. F. Net Profit Máx. DD. % Win BMO Profit Factor SQN Sharpe AROR
ST36 Original 0,741 $45.089 $4.831 40,18% $44 1,39 3,56 0,10 26,8%
Fase 1 Máximo 0,778 $68.563 $9.760 45,1% $77 1,76 4,93 0,19 33,2%
Mínimo 0,569 $3.283 $1.892 35,5% $10 1,09 0,57 0,05 4,0%
Media 0,730 $28.932 $3.839 41,2% $47 1,45 2,96 0,12 20,2%
Fase 2 Máximo 0,784 $70.801 $7.475 56,5% $111 1,89 5,25 0,19 33,7%
Mínimo 0,652 $8.361 $2.509 40,0% $38 1,24 1,17 0,08 8,9%
Media 0,758 $53.994 $4.933 46,6% $71 1,56 4,21 0,14 28,8%
Fase 3 Máximo 0,779 $73.232 $6.175 55,7% $115 1,95 5,46 0,20 34,3%
Mínimo 0,747 $35.105 $3.498 43,7% $67 1,48 3,36 0,13 23,3%
Media 0,767 $59.838 $4.591 49,9% $93 1,73 4,79 0,16 30,9%

Las tablas inferiores muestran los porcentajes de mejora obtenidos en el OS en cada fase (ranking completo) y por las 5 mejores estrategias.

% Mejora  en Out-Sample (ranking global) sobre el sistema original
  F. F. Net Profit Máx DD. % Win BMO Profit Factor SQN Sharpe AROR
Fase 1 -1,4% -35,8% 25,8% 2,6% 6,5% 3,7% -16,9% 19,5% -24,7%
Fase 2 2,4% 19,8% -2,1% 15,9% 62,5% 11,9% 18,4% 34,8% 7,6%
Fase 3 3,5% 32,7% 5,2% 24,1% 111,8% 24,0% 34,5% 58,7% 15,5%
% Mejora  en Out-Sample (Top 5) sobre el sistema original
  F. F. Net Profit Máx DD. % Win BMO Profit Factor SQN Sharpe AROR
Fase 1 4,4% 5,0% 21,7% 7,8% 19,0% 13,4% 16,2% 9,3% 1,5%
Fase 2 5,2% 47,2% 5,6% 13,5% 82,2% 19,3% 41,3% 47,6% 21,8%
Fase 3 7,3% 39,7% 61,6% 9,1% 93,7% 21,6% 39,1% 46,2% 22,5%

Otro elemento relevante a considerar es la complejidad estructural de los sistemas en relación con el rendimiento y la calidad de los mismos. Los sistemas muy complejos son más propensos al curve fitting y esto afecta al rendimiento en el OS. En los siguientes gráficos mostramos la relación entre complejidad y los ratios SQN, Sharpe Ratio y %Stangation:

pastedGraphic_2.png

pastedGraphic_3.png

pastedGraphic_4.png

 El índice de complejidad del sistema inicial es de 19 (punto rojo).  Como podemos apreciar en los gráficos de SQN y Sharpe los mejores valores se concentran en una ventana de complejidad que va de 60 a 90. Niveles de complejidad más altos no generan mejoras de manera consistente. El ratio %Stangation (mejor cuanto menor sea su valor) es coherente con los dos anteriores y concentra también sus mejores valores en la ventana 60-90.

La creación automática de sistemas mediante técnicas de programación genética genera un aumento continuo de complejidad a medida que los sistemas evolucionan. A menudo esta complejidad se debe a la adición de código basura; reglas redundantes, superposición de indicadores con elevada colinealidad, exceso de subsistemas de salida, etc. Estas reglas innecesarias aumentan de marea residual la función de ajuste, y por ello nuevos sistemas cada vez más complejos se van añadiendo al ranking de estrategias.  Para evitar esto es recomendable filtrar los sistemas con complejidad elevada o establecer a priori como criterio de selección un umbral máximo de complejidad.

Por último mostramos la curva de beneficios y principales ratios de los dos mejores sistemas obtenidos en este experimento:

pastedGraphic_5.png

Como puede apreciarse la mejora es muy significativa en todos los ratios.  El nivel de complejidad es más elevado en la versión 1 del ST36 que en la 2, aunque  ambos sistemas están en el rango 70-90.