English Русский 中文 Deutsch 日本語 Português
preview
Optimización automatizada de parámetros para estrategias de negociación con Python y MQL5

Optimización automatizada de parámetros para estrategias de negociación con Python y MQL5

MetaTrader 5Ejemplos | 31 octubre 2024, 09:33
501 2
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

Por qué es esencial la optimización automática

Imagina que tienes un bot de trading desarrollado con mucho esfuerzo. Estás deseando verlo en acción, pero empiezas sin una optimización adecuada. Los resultados positivos iniciales pueden inducirle a pensar que todo va bien, pero pronto aparecen incoherencias y pérdidas.

Un bot no optimizado carece de coherencia y puede responder a datos irrelevantes, lo que provoca pérdidas y ganancias impredecibles. Podría tomar decisiones basadas en señales falsas, sin adaptarse a los cambios del mercado, y asumir riesgos imprevistos, causando pérdidas significativas. La optimización garantiza un mayor rendimiento y fiabilidad.

Los lectores comprenderán la importancia de la autooptimización, los diferentes algoritmos utilizados y verán ejemplos prácticos en Python y en asesores expertos (EAs, Experts Advisors). Aprenderán a configurar la optimización automática, comparar resultados y configurar correctamente la optimización de parámetros, mejorando la eficacia de su estrategia de negociación.

Entre los algoritmos de autooptimización para estrategias de negociación figuran la optimización de parámetros, los algoritmos evolutivos, los métodos heurísticos, las técnicas basadas en gradientes, el aprendizaje automático y la optimización basada en la simulación. Cada uno tiene sus ventajas e inconvenientes, adaptados a las distintas necesidades de negociación y condiciones del mercado.


Técnicas de optimización de parámetros

  1. Optimización por fuerza bruta: Prueba todas las combinaciones de parámetros para obtener resultados precisos, pero consume muchos recursos.
  2. Búsqueda en cuadrícula: Evalúa las combinaciones en una cuadrícula para equilibrar exhaustividad y eficacia.
  3. Búsqueda aleatoria: Prueba combinaciones aleatoriamente para obtener resultados más rápidos, sacrificando algo de precisión.

Cada técnica tiene sus puntos fuertes, por lo que la elección depende de los recursos disponibles, el tiempo y la precisión deseada.


¿Por qué y cuándo utilizar Python?

Los programas en Python son una herramienta excelente para probar ideas, crear gráficos rápidamente y confirmar afirmaciones teóricas con datos históricos de operaciones. Python permite a los usuarios desarrollar y ajustar modelos con agilidad, lo que facilita la experimentación con distintas estrategias y parámetros. Su capacidad para generar gráficos y visualizaciones detalladas ayuda a interpretar los resultados de forma más intuitiva. Además, la posibilidad de integrar datos históricos permite comprobar cómo habrían funcionado las estrategias en escenarios pasados, aportando una validación práctica a las teorías planteadas. Esta combinación de velocidad, flexibilidad y capacidad analítica convierte a Python en una herramienta inestimable para cualquier operador que busque optimizar sus estrategias y comprender mejor los mercados financieros.


Qué estrategia utilizaremos para este artículo y su indicador

La estrategia de cruce de medias móviles (MAs Crossing) es una técnica de trading que se basa en la intersección de dos medias móviles para generar señales de compra y venta. Utiliza dos medias móviles de periodos diferentes, una corta y otra larga, para identificar cambios en la tendencia de los precios. Cuando la MA corta (Moving Average) cruza por encima de la MA larga, se genera una señal de compra, lo que indica una posible tendencia alcista. Por el contrario, cuando la MA corta cruza por debajo de la larga, se genera una señal de Venta, lo que sugiere una posible tendencia bajista. Esta estrategia es popular por su sencillez y eficacia en mercados con tendencias claras.

El indicador SMA (Simple Moving Average) es una herramienta que calcula el precio medio de un activo durante un periodo determinado. Para calcular una SMA, se suman los precios de cierre de un activo durante el periodo seleccionado y luego se dividen por el número de periodos. La SMA suaviza las fluctuaciones de los precios y ayuda a identificar la dirección general de la tendencia. Este indicador es útil para eliminar el ruido del mercado y ofrecer una visión más clara de la tendencia subyacente. En Python, las SMA pueden calcularse fácilmente utilizando bibliotecas como pandas, que ofrecen funciones para calcular medias móviles de forma eficiente y precisa.


Optimización de parámetros con Python: Ejemplo práctico

Tenemos un script para cada técnica en Python. Ya hemos visto las diferencias de cada enfoque.

La estrategia es la misma en los tres scripts. Si desea utilizar otra estrategia, esto es lo que debe cambiar:

    data = data.copy()  # Create a copy of the original DataFrame
    data['Short_MA'] = data['Close'].rolling(window=short_window).mean()
    data['Long_MA'] = data['Close'].rolling(window=long_window).mean()
    data['Signal'] = 0
    data.loc[data.index[short_window:], 'Signal'] = np.where(
        data['Short_MA'][short_window:] > data['Long_MA'][short_window:], 1, 0)
    data['Position'] = data['Signal'].diff()

Python es muy sencillo, así que no explicaré el código.

Los tres scripts se adjuntan al artículo (b forec.py, grid search v2.py y random search v2.py).

Antes de utilizar estos scripts, debe instalar las bibliotecas. Puedes usar pip para esto:

pip install numpy pandas matplotlib itertools MetaTrader5 random 

Los resultados de cada script se mostrarán de forma similar a esta, con las siguientes entradas:

symbol = "EURUSD"
timeframe = mt5.TIMEFRAME_D1
start = pd.Timestamp("2020-01-01")
end = pd.Timestamp("2021-01-01")

Fuerza bruta:

fuerza brutal izquierda

fuerza brutal derecho

Los mejores parámetros: Corto = 14.0, Largo = 43.0
Mejor rendimiento: 10014.176, Riesgo: 3.7431030827241524e-05

Búsqueda en cuadrícula:

cuadrícula de búsqueda izquierda

cuadrícula de búsqueda derecha

Los mejores parámetros: Corto = 14,0, Largo = 43,0
Mejor rendimiento: 10014.176, Riesgo: 3.7431030827241524e-05

Búsqueda aleatoria:

búsqueda aleatoria izquierda

búsqueda aleatoria derecha

Los mejores parámetros: Corto = 14,0, Largo = 44,0
Mejor rendimiento: 10013.697, Riesgo: 3.725494046576829e-05

Estos guiones no se optimizan automáticamente, por lo que debe seleccionar cada periodo a estudiar.

Los resultados son buenos en todas ellas e iguales, pero hay que tener en cuenta que la estrategia era sencilla, mientras que otras estrategias pueden tener más parámetros y rangos mayores.


¿Con qué frecuencia debo optimizar una estrategia?

Optimizar una estrategia comercial es crucial para mantener su eficacia a lo largo del tiempo. La frecuencia y el plazo de optimización dependen de varios factores, especialmente de la volatilidad del mercado.

Imagine que está desarrollando una estrategia de negociación que opera con un periodo de tiempo de 1 día, es decir, cada señal se basa en datos de mercado diarios. La volatilidad desempeña aquí un papel importante. Cuando el mercado es más volátil, los movimientos de los precios son mayores y más rápidos, lo que puede afectar a la eficacia de su estrategia si no se ajusta correctamente.

Para determinar cuándo optimizar y qué retrospectiva utilizar, hay que vigilar la volatilidad del mercado. Una buena forma de hacerlo es observar el rango diario de precios (ALTO - BAJO) o el rango medio real de los activos en los que opera. A continuación se ofrece una guía aproximada basada en la volatilidad.

Baja volatilidad: Cuando el mercado está en calma y los rangos diarios son pequeños, las estrategias suelen necesitar ajustes menos frecuentes. Se puede pensar en optimizar cada 1-3 meses con una perspectiva más larga para captar tendencias más estables. Un plazo de 50-100 días podría ser adecuado.

Volatilidad moderada: En condiciones normales de mercado, con movimientos de precios más regulares pero no extremadamente grandes, considere optimizar cada 1-2 meses. Una retrospectiva de 20-50 días podría ser suficiente para captar cambios significativos en la tendencia.

Alta volatilidad: En periodos de alta volatilidad, como en tiempos de crisis o durante acontecimientos económicos importantes, los movimientos de precios son grandes y rápidos. Aquí es crucial optimizar con más frecuencia, posiblemente cada 2-4 semanas, y utilizar una retrospectiva más corta, como 10-20 días, para adaptarse rápidamente a los cambios en las condiciones del mercado.


MQL5: Ejemplo de autooptimización

Este código en MQL5 es un robot de trading que implementa una estrategia de cruce de medias móviles (MAs). Funciona en la plataforma MetaTrader 5 y está diseñado para operar en el mercado financiero de forma automática. El bot utiliza dos MAs simples (SMA) con periodos ajustables para generar señales de compra y venta cuando se cruzan.

El objetivo principal del bot es optimizar los periodos MA automáticamente para maximizar el beneficio neto, minimizar el drawdown o maximizar el Sharpe, según la configuración elegida por el usuario. Esto se consigue mediante un proceso de optimización que prueba diferentes combinaciones de periodos MA en un periodo específico de datos históricos.

El bot está estructurado en varias secciones clave:

1. Inicialización y configuración: Definir los parámetros iniciales como periodos MA, tamaño de lote, número mágico para identificación de órdenes, etc.

2. Optimización: Utilizar un algoritmo de búsqueda exhaustiva para probar todas las combinaciones posibles de periodos de MAs dentro de rangos especificados. La optimización se realiza en función de los criterios seleccionados: Beneficio neto o detracción mínima (drawdown).

3. Ejecución de las operaciones: Seguimiento continuo del mercado y apertura de posiciones de compra o venta cuando se produzcan cruces de MAs según la estrategia definida. También gestiona las posiciones abiertas, aplicando pérdidas y niveles de ganancias en función del ATR (Average True Range).

4. Reoptimización automática: En determinados periodos de tiempo (configurables), el bot reoptimiza los parámetros de las MAs para adaptarse a las condiciones cambiantes del mercado.

5. Trailing Stop: Implemente diferentes tipos de Trailing Stops (simple y basado en expectativas) para asegurar los beneficios y protegerse de las pérdidas.

6. Horarios de formación: Se puede configurar para que no funcione ciertos días de la semana o a determinadas horas.

7. Finalización y limpieza: El robot realiza correctamente las operaciones de limpieza y cierre de todas las operaciones abiertas al detenerse.

En resumen, este robot de trading es una implementación compleja que combina análisis técnico (cruce de MAs) con estrategias de gestión de riesgo (Stops y Trailing Stops) y optimización automatizada de parámetros. Está diseñado para funcionar de forma autónoma y optimizado para maximizar el rendimiento ajustado al riesgo en un entorno de negociación automatizado.

Los Trailing Stops utilizados en el artículo y el código se obtienen del artículo: Trailing stop en el trading por Aleksej Poljakov.

 


Código

Para utilizar otra técnica de optimización, debes cambiar esta parte del código:

   for(int fastPeriod = FastMAPeriodStart; fastPeriod <= FastMAPeriodStop; fastPeriod += FastMAPeriodStep)
     {
      for(int slowPeriod = SlowMAPeriodStart; slowPeriod <= SlowMAPeriodStop; slowPeriod += SlowMAPeriodStep)
        {
         double criterionValue = PerformBacktest(fastPeriod, slowPeriod, startBar);

         if(IsNewOptimal(criterionValue, bestCriterionValue, OptimizationCriterion))
           {
            bestCriterionValue = criterionValue;
            bestFastPeriod = fastPeriod;
            bestSlowPeriod = slowPeriod;
           }
        }
     }

Para utilizar otra estrategia, debes cambiar esta parte del código (y sus entradas):

double fastMA_curr[];
   double slowMA_curr[];
   double fastMA_prev[];
   double slowMA_prev[];

   ArraySetAsSeries(fastMA_curr, true);
   ArraySetAsSeries(slowMA_curr, true);
   ArraySetAsSeries(fastMA_prev, true);
   ArraySetAsSeries(slowMA_prev, true);

   int fastMA_current = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
   int fastMA_previous = iMA(_Symbol, 0, FastMAPeriod, 1, MODE_SMA, PRICE_CLOSE);

   int slowMA_current = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
   int slowMA_previous = iMA(_Symbol, 0, SlowMAPeriod, 1, MODE_SMA, PRICE_CLOSE);


   CopyBuffer(fastMA_current, 0, 0, 2, fastMA_curr);
   CopyBuffer(slowMA_current, 0, 0, 2, slowMA_curr);
   CopyBuffer(fastMA_previous, 0, 0, 2, fastMA_prev);
   CopyBuffer(slowMA_previous, 0, 0, 2, slowMA_prev);

   double fastMA_previousFF = fastMA_prev[0];
   double slowMA_previousSS = slowMA_prev[0];
   double fastMA_currentFF = fastMA_curr[0];
   double slowMA_currentSS = slowMA_curr[0];

// Check for buy signal (fast MA crosses above slow MA)
   if(fastMA_previousFF < slowMA_previousSS && fastMA_currentFF > slowMA_currentSS)
     {
      // Close any existing sell positions
      if(PositionsTotal() > 0)
        {
         for(int i = PositionsTotal() - 1; i >= 0; i--)
           {
            if(PositionSelectByTicket(i))
              {
               if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
                 {
                  Print("Closing sell position: Ticket ", PositionGetInteger(POSITION_TICKET));
                  ClosePosition(PositionGetInteger(POSITION_TICKET));
                 }
              }
           }
        }

      // Open a buy position
      double openPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      double atrMultiplier = ATRmultiplier;
      OpenPosition(ORDER_TYPE_BUY, openPrice, atrMultiplier);
     }

// Check for sell signal (fast MA crosses below slow MA)
   else
      if(fastMA_previousFF > slowMA_previousSS && fastMA_currentFF < slowMA_currentSS)
        {
         // Close any existing buy positions
         if(PositionsTotal() > 0)
           {
            for(int i = PositionsTotal() - 1; i >= 0; i--)
              {
               if(PositionSelectByTicket(i))
                 {
                  if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
                    {
                     Print("Closing buy position: Ticket ", PositionGetInteger(POSITION_TICKET));
                     ClosePosition(PositionGetInteger(POSITION_TICKET));
                    }
                 }
              }
           }

         // Open a sell position
         double openPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
         double atrMultiplier = ATRmultiplier;
         OpenPosition(ORDER_TYPE_SELL, openPrice, atrMultiplier);

        }
   IndicatorRelease(fastMA_current);
   IndicatorRelease(slowMA_current);
   IndicatorRelease(fastMA_previous);
   IndicatorRelease(slowMA_previous);
  }

Es importante tener en cuenta que si no libera indicadores, la ventana del gráfico se llenará con ellos.


Diferencia con y sin optimización automática

Utilizaremos el mismo periodo (del 20-4-2024 al 20-5-2024) para el EURUSD y un periodo de barras de 1 día.

ajustes con optimización

Con optimización:

entradas con optimización

prueba retrospectiva con optimización

gráfico con optimización

Sin optimización automática

entradas sin autooptimización

prueba retrospectiva sin autoparametrización

gráfico sin autooptimización

Está claro que es mejor autooptimizar. No se hicieron operaciones sin autooptimización. La primera se autooptimizó al principio, y luego tuvo 40 días para reoptimizarse (fuera de plazo).


Conclusión

La optimización automática es crucial para garantizar el rendimiento constante y fiable de los robots de negociación en los mercados financieros en constante cambio. Con este artículo los lectores han adquirido una comprensión global de por qué es esencial la autooptimización, los distintos tipos de algoritmos disponibles para optimizar las estrategias y los parámetros de negociación, y las ventajas e inconvenientes de las diferentes técnicas de optimización de parámetros. Se destacó la importancia de Python como herramienta para realizar pruebas retrospectivas de estrategias de forma rápida y eficaz, junto con un estudio de caso que demuestra la optimización de parámetros mediante una estrategia de cruce de medias móviles.

El artículo exploraba además la necesidad de una optimización periódica basada en la volatilidad del mercado, haciendo hincapié en la necesidad de ajustes frecuentes para mantener la eficacia. Un ejemplo de autooptimización utilizando MQL5 ilustra la aplicación práctica de estos conceptos, mostrando las importantes mejoras de rendimiento que se pueden conseguir mediante la autooptimización. La comparación entre bots autooptimizados y no optimizados puso de manifiesto las claras ventajas de los primeros, ya que los optimizados mostraron una mayor adaptabilidad y eficacia.

En conclusión, la optimización automática no sólo mejora el rendimiento del robot de negociación, sino que también proporciona a los operadores una mayor confianza y tranquilidad, sabiendo que su robot puede navegar por las complejidades de los mercados financieros con eficacia. Este enfoque estratégico para el desarrollo y mantenimiento de bots de trading es indispensable para cualquiera que se tome en serio la consecución de un éxito consistente y sostenible en el trading.


Libros y recursos educativos

  • "Advances in Financial Machine Learning" por Marcos López de Prado.
  • "Algorithmic Trading and DMA" por Barry Johnson.
  • "Python for Data Analysis" por Wes McKinney.
  • "Machine Learning for Asset Managers" por Marcos López de Prado.
  • "Quantitative Trading: How To Build Your Own Algorithmic Trading Business" por Ernest P.


Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/15116

Archivos adjuntos |
b_forec.py (3.64 KB)
grid_search_v2.py (3.64 KB)
LUIS ALBERTO BIANUCCI
LUIS ALBERTO BIANUCCI | 2 nov 2024 en 23:29
Este articulo es muy bueno. Tienes un Ea donde lo has aplicado, y que funcione bien?
Javier Santiago Gaston De Iriarte Cabrera
LUIS ALBERTO BIANUCCI #:
Este articulo es muy bueno. Tienes un Ea donde lo has aplicado, y que funcione bien?

Gracias, trata de hacerlo tu, este es solo un ejemplo que sirve de algo de ayuda. Puedes basarte en este y más artículos que hay sobre este tema. Saludos ... Yo no quiero sacar EA's hasta que no tenga una señal. Otro saludo. Si quieres haz la EA y subes tus dudas a este chat o al foro, y les hechamos un vistazo.

Características del Wizard MQL5 que debe conocer (Parte 24): Medias móviles Características del Wizard MQL5 que debe conocer (Parte 24): Medias móviles
Las medias móviles son un indicador muy común que la mayoría de los operadores utilizan y comprenden. Exploramos posibles casos de uso menos comunes dentro de los Asesores Expertos disponibles en el Asistente de MQL5.
Redes neuronales: así de sencillo (Parte 87): Segmentación de series temporales Redes neuronales: así de sencillo (Parte 87): Segmentación de series temporales
La previsión juega un papel esencial en el análisis de series temporales. En este nuevo artículo, hablaremos de las ventajas de la segmentación de series temporales.
Cómo añadir Trailing Stop según el indicador Parabolic SAR Cómo añadir Trailing Stop según el indicador Parabolic SAR
Al crear una estrategia comercial, debemos probar una amplia variedad de stops de protección. Y aquí surge la idea del ajuste dinámico del nivel de Stop Loss siguiendo el precio. El mejor candidato en este punto es el indicador Parabolic SAR, resulta difícil pensar en algo más simple y claro.
Desarrollo de Sistemas Avanzados de Trading ICT: Implementación de Order Blocks en un Indicador Desarrollo de Sistemas Avanzados de Trading ICT: Implementación de Order Blocks en un Indicador
En este artículo, aprenderemos cómo crear un indicador que detecte, dibuje y emita alertas sobre la mitigación de Order Blocks. Exploraremos en detalle cómo identificar estos bloques en el gráfico, establecer alertas precisas y visualizar su posición con rectángulos para tener una mejor comprensión del comportamiento del precio. Este indicador será una herramienta clave para quienes siguen la metodología Smart Money Concepts e Inner Circle Trader.