¿Cómo no caer en las trampas de la optimización?

Shashev Sergei | 15 febrero, 2016

Sin embargo, siendo realistas, el desarrollo de una estrategia de trading rentable
es una actividad de prueba y error en la que algunas formas de optimización siempre desempeñan una función.
Siempre hay un optimizador en algún lugar si no está visible en la tabla, si no acechando en las sombras.

J. Katz, D. Mccormick. La enciclopedia de las estrategias de trading.


¿Qué es la optimización de un sistema de trading?


La creación de un sistema de trading, en primer lugar, consiste en formular las reglas para la apertura y el cierre de una posición larga o corta. Estas reglas suelen contener algunos indicadores y parámetros. Si estos cambian, la rentabilidad del sistema de trading también cambiará. La pregunta surge con mucha frecuencia: ¿Es necesario optimizar los sistemas de trading o se trata solo de adaptar el sistema a los datos históricos?

Esto tiene que ver probablemente con el hecho de que cada persona puede considerar distintos procedimientos bajo la "optimización de un sistema de trading". Por tanto, vamos a definir primero qué es la optimización.
En primer lugar, podemos definir la "optimización" como la selección o creación de un sistema de trading que resolvería mejor nuestros problemas que otros sistemas. Por ejemplo, estamos buscando un sistema que lograra el mayor beneficio en el par YEN/US dólar en dicho momento. Para ello, elegiremos un sistema con unos parámetros fijos entre varios sistemas. Esta puede ser, por ejemplo, una elección hecha entre sistemas basados en distintos indicadores. Llamémosla la "optimización del primer tipo".

En segundo lugar, podemos definir la "optimización" como el hallazgo de dichos parámetros para el sistema de trading seleccionado que nos permitiría obtener los mejores resultados. Esta puede ser la selección del período para calcular el promedio o el período para calcular las estructuras estocásticas. Llamémosla la "optimización de segundo tipo".

Supongo que nadie tiene dudas sobre que los traders que crean una estrategia de trading, explícita o implícitamente, usan ambos tipos de optimización. De hecho, tan pronto como seleccionamos un sistema de trading con el que trabajar, asumimos que vamos a usar el mejor sistema de trading que tengamos. Es decir, usamos la optimización de primer tipo. No obstante, como cualquier sistema tiene algunos parámetros, intentamos buscar valores para estos parámetros de tal forma que obtengamos los mejores resultados. Esta es, obviamente, la optimización de segundo tipo. Además, es imposible separar estos dos tipos de optimización cuando se crea un sistema de trading. Por esta razón, la respuesta a la pregunta sobre si se debe usar la optimización cuando se crea un sistema de trading es clara: Debe utilizarse la optimización. Otra cuestión es cómo hacerlo. Hay varias etapas en la creación de un sistema de trading:
  • comenzar con la idea sobre qué hay detrás del sistema de trading;
  • selección de los criterios o reglas de decisión;
  • definir los parámetros del sistema;
  • probar el sistema; y
  • volver a las cláusulas anteriores si es necesario para realizar cambios en el sistema.

Problemas de la optimización de segundo tipo

Cuando creamos un sistema de trading automatizado, todos los desarrolladores usan la optimización de primer tipo y la de segundo tipo. La búsqueda de los criterios y reglas de decisión es una tarea para los sistemas heurísticos como las redes neuronales, los algoritmos genéticos y, por supuesto, los cerebros humanos, el sistema más potente que existe actualmente. Esta es la optimización de primer tipo, por tanto, toda la responsabilidad de esta optimización recae en los traders.

La optimización de segundo tipo es la búsqueda de los mejores parámetros. Es aquí donde se surgen los problemas ya que es muy fácil adaptar los datos al historial y obtener "grandes beneficios". Por desgracia, esto solo funciona con el historial. Tal "sobreoptimización" es difícil evitarla, por lo que algunos traders empiezan a tener sensaciones negativas hacia ella. ¿Por qué?

La razón es simple. Los novatos encuentran parámetro que dan el máximo beneficio, sin prestar atención a las zonas colindantes donde el beneficio cae de forma pronunciada con el más mínimo cambio de los mejores períodos de los indicadores. Esto origina una inestabilidad del sistema de trading. Luego comienzan a usar este sistema en una cuenta de demostración. Esto es muy bueno si son lo suficientemente pacientes para trabajar en ello al menos un par de meses para asegurarse de que el sistema es inoperativo. De lo contrario, el Señor te prohibirá lanzar dicho sistema en una cuenta real, di adiós a tu depósito y sigue con el trabajo gratuito en el exterior.

¿Cómo puede resolverse el problema de la sobreoptimización?

¿Qué debemos hacer? No podemos renunciar a la optimización ya que omitiremos la mejor solución o una estrategia potencialmente rentable por haber encontrado parámetros erróneamente. No obstante, la sobreoptimización dará serios problemas también. Tenemos que encontrar el punto medio.

Vamos a analizar la optimización matemáticamente. En general, cuando hay bastantes parámetros a optimizar, buscamos un hiperplano en el que el beneficio sea estable y cambie más o menos de igual forma cuando los parámetros se modifiquen ligeramente. En la optimización, intentamos encontrar la solución en la que los beneficios sean los mayores y que las insignificantes desviaciones de la solución óptima no den lugar a cambios bruscos en el beneficio.

El problema es que podemos entrar en la zona máxima local, la zona de un punto en el que los beneficios son máximos, pero los cambios insignificantes en los parámetros originan pérdidas. Por tanto, dichos parámetros darán probablemente como resultado una pérdida del depósito con cualquier cambios insignificante en el mercado. Bueno, Fórex es conocido por tener dichos cambios muy a menudo. El sistema debe evitar todos los extremos locales.

Por desgracia, aún no hay un algoritmo incluido en MetaTrader que busque las soluciones óptimas por sí mismo. Uno de los algoritmos más potentes que resuelven dicho problema es KRAB. Se describe en el libro de N. Zagoruyko, Applied Methods of Data and Knowledge Analysis. Novosibirsk: Institute of Mathematics Press, 1999 (en Ruso). Sería genial si se implementara en las próximas versiones...¡Pero no todo es malo!

MetaTrader puede construir un gráfico de optimización para uno o dos parámetros a optimizar. Esto significa que proyectando los resultados de la optimización sobre un plano, en teoría, podemos encontrar la solución óptima. En otras palabras, al optimizar dos parámetros por dos encontramos la región de la mejor solución.

Para tres parámetros, tendremos que repetir este procedimiento.

veces.

No obstante, para cinco parámetros, este será

y así sucesivamente. Bueno, es mejor no emplear demasiado la cantidad de parámetros.

Cuando optimizamos dos parámetros, obtenemos un gráfico de optimización como el siguiente:

Las zonas oscuras son zonas con mayores beneficios. Este gráfico de optimización es muy bueno ya que no hay máximos locales y el beneficio disminuye uniformemente desde la esquina superior derecha del gráfico. Estaré encantado si te encuentras con algo como esto en tu optimización.

El gráfico siguiente no es tan ambiguo. Podemos ver dos áreas que contienen máximos en este gráfico. ¿Qué debemos elegir?


Un ojo experto se dará cuenta de la región de la solución en la esquina inferior derecha ya que la zona de cuadrados colindantes muestra una caída de beneficios completamente menor que la del comienzo del gráfico. Por tanto, le recomendaría que analizara los gráficos atentamente para poner a salvo su depósito.

Comencemos a estudiar un asesor experto sencillo: analizamos tres parámetros y encontramos un región de solución óptima. El nombre del AE es SP. Funciona en las áreas del momento de análisis de mercados de sobrecompra/sobreventa.

//+------------------------------------------------------------------+
//|                                                           SP.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net"
 
//---- input parameters
extern int       TakeProfit=50;
extern int       StopLoss=30;
extern int       RsiLen=4;
extern int       KLen=8;
extern int       Momlength=10;
extern int       Lots=1;
extern int       rsi_oversold=39;
extern int       stoc_oversold=29;
extern int       rsi_overbought=60;
extern int       stoc_overbought=70;
extern int       Mom_Sell=-2;
extern int       Mom_Buy=2;
 
int expertBars;
double RSIlevel;
double Stoclevel;
double MomLevel;
double DLen=3;
 
//+------------------------------------------------------------------+
//| returns true if a new bar has come, otherwise returns false      |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res=false; 
   if (expertBars!=Bars) 
      {
      expertBars=Bars;
      res=true;
      } 
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  double price;
  double stop;
  double profit;
//----
   if ((isNewBar())&& (OrdersTotal()==0)&& (AccountBalance()>5000))
   {
      RSIlevel=iRSI(NULL,0,RsiLen,PRICE_CLOSE,0);
      Stoclevel=iStochastic(NULL,0,KLen,DLen,3,MODE_SMA,0,MODE_MAIN,0);
      MomLevel=100 - iMomentum(NULL,0,Momlength,PRICE_CLOSE,0);
      /*if (AccountBalance()>50000)
         {Lots=NormalizeDouble( AccountBalance()/10000,0)-4;}
      else 
         Lots=1;*/
      if ((RSIlevelrsi_oversold)&&(Stoclevelstoc_oversold)&&(MomLevel>Mom_Sell))
      {
         price=Ask;
         stop=NormalizeDouble(price-StopLoss*Point,Digits);
         profit=NormalizeDouble(price+TakeProfit*Point,Digits);
         OrderSend(Symbol(),OP_BUY,Lots,price,3,stop,profit,NULL,0,0,Green); 
         //Print(AccountBalance());          
      }
      if ((RSIlevel>rsi_overbought)&&(Stoclevel>stoc_overbought)&&(MomLevelMom_Buy))
      {
         price=Bid;
         stop=NormalizeDouble(price+StopLoss*Point,Digits);
         profit=NormalizeDouble(price-TakeProfit*Point,Digits);
         OrderSend(Symbol(),OP_SELL,Lots,price,3,stop,profit,NULL,0,0,Green); 
         //Print(AccountBalance());            
      }      
   } 
    
//----
   return(0);
  }
//+------------------------------------------------------------------+
Optimizamos tres parámetros: períodos estocásticos y RSI y el nivel StopLoss.

Después de haberlos optimizado, obtenemos tres gráficos:


Dependencia de los beneficios de los períodos estocásticos y RSI.


Dependencia de los beneficios de RSI y StopLoss.


Dependencia de los beneficios de estocástico y StopLoss.

Las mejores regiones son:

  • Gráfico 1 – (4;5) y (3;6);
  • Gráfico 2 – (80;90) y (3;6);
  • Gráfico 3 – (80;90) y (4;5);

Combinándolas obtenemos la mejor solución: (5,4,80).

Debe recordarse que StopLoss tiene un mayor paso de diez en la optimización. Si es necesario, la solución obtenida puede ser analizada con un paso menor también.

Conclusión

Es muy bueno, desde luego, que la saturación del color verde de una celda nos permita juzgar sobre la rentabilidad de una región. No obstante, sería aún mejor si las regiones de pérdidas estuvieran coloreadas en rojo de forma proporcional. Esto nos ayudaría a estimar la estrategia a otro nivel. De hecho, obtenemos la totalidad de la imagen tridimensional de la optimización.

Por último, algunas recomendaciones para la optimización:

  • La muestra de datos para la optimización debe ser representativa. Debe superar los 3 años para el marco temporal diario.
  • Pruebe su estrategia fuera de la muestra de optimización: esto le permitirá estimar los parámetros seleccionados.
  • No optimice demasiados parámetros al mismo tiempo, la probabilidad de adaptación al historial será demasiado alta.
  • Aumente el paso para reducir el tiempo de optimización. No renunciará a la mejor región. El grupo obtenido puede ser analizado con mayor detalle posteriormente (técnica de cribado).
  • No dedique horas a la optimización, mejor actualice el algoritmo del asesor experto.
Espero que este artículo le ayude a evitar la "optimización perjudicial".