English Русский 中文 Deutsch 日本語 Português
Optimización Walk-Forward en MetaTrader 5 con sus propias manos

Optimización Walk-Forward en MetaTrader 5 con sus propias manos

MetaTrader 5Probador | 23 agosto 2017, 16:46
1 867 0
Stanislav Korotky
Stanislav Korotky

El trading algorítmico no sólo requiere ciertos esfuerzos en el diseño y programación de los robots comerciales, sino también en mayor grado, en la simulación y verificación de la viabilidad de las ideas y algoritmos. La plataforma MetaTrader 5 ofrece el Probador build-in para la optimización de los Asesores Expertos (EAs) a base de los datos históricos. Es imposible menospreciar su valor y ayuda en el trabajo del trader. Pero el mayor problema de su uso es la búsqueda de los parámetros que podrían guardar su rentabilidad en el futuro independientemente del período utilizado durante la optimización. Una de las maneras para solucionar este problema es la prueba Forward. El Probador ofrece el modo build-in correspondiente. ¿Pero será suficiente optimizar el EA una vez y probarlo con éxito en el siguiente período para estar seguro de su estabilidad?

El ciclo de la explotación del EA supone que las fases de la optimización y trading se repitan con una cierta periodicidad seleccionada, y el tráder espera los resultados positivos (o por lo menos, sin pérdidas) en un intervalo de tiempo prolongado. Para asegurarse de la capacidad de ejercicio del sistema, es necesario repetir las fases del ciclo en el Probador varias veces, iniciando la optimización y la simulación en tiempo real (Forward Testing) con el desplazamiento constante del períodos actual desde el pasado al futuro virtual dentro del tiempo del Probador.

Este procedimiento se llama la optimización walk-forward y se utiliza con frecuencia por muchos operadores. Lamentablemente, el Probador incorporado de MetaTrader no permite iniciarla con un clic. En vez de eso, es necesario automatizar el arranque del Probador a través de las herramientas externas y juntar los informes de la simulación forward. Sería bueno tener la posibilidad de realizar el análisis walk-forward de una manera más simple, usando completamente los medios de MetaTrader y MQL sin ejecutar operaciones rutinarias.

Como ha resultado podemos crear esta posibilidad en forma de una librería MQL, que podrá conectarse con facilidad a cualquier Asesor Experto. Lo único es que habrá que tener ciertos conocimientos en la programación, ya que tendrá que adoptar el código fuente del EA.

Diseño

Antes de empezar a describir los principios del funcionamiento de la librería, vamos a introducir algunos conceptos.

El período en el que se realiza la optimización suele llamarse los datos in-sample. El período posterior de la simulación se llama los datos out-of-sample. Pero con el fin de simplificar la descripción, vamos a usar aquí también los términos «ventana de optimización» (o simplemente «ventana») y «paso de la simulación» (o simplemente «paso», «prueba»).

La idea de la implementación de la optimización walk-forward es simple. En el Probador, hay que seleccionar el período general de la optimización D que es mucho más grande que la ventana habitual de la optimización, desplazando la fecha inicial en el pasado, en el punto B. Luego, hay que permitir al Asesor Experto tradear sólo dentro de los límites de la ventana actual W de un tamaño predefinido y el paso posterior de simulación S, teniendo en cuenta que D > W >> S. Por ejemplo, en D debe caber 1 ventana W y además 10 pasos S.

Primero, la ventana va a empezarse en el punto inicial B, pero luego debe ir desplazándose al tamaño del paso a la derecha, consecutivamente muchas veces, hasta el momento cuando el límite derecho llegue a la fecha final del diapasón general de la optimización D.

Los índices para la optimización deben calcularse exclusivamente a base del trading dentro de los límites de la ventana W. Además, vamos a calcular también los índices del trading en el segmento S, guardándolos para el análisis posterior. De esta manera, se puede definir los parámetros óptimos para cada determinada ventana, y sabiendo el número del repaso, obtener la referencia a los índices correspondientes de la simulación.

Eso repite completamente el walk-forward canónico a excepción de un pequeño detalle: el trading en S no se empieza con el depósito inicial, sino con el importe que el EA ha conseguido ganar durante el tiempo de W. Esta particularidad limita la aplicación de la librería sólo para las estrategias con un lote fijo. Pero la mayoría de los traders quizá estarán de acuerdo que la comprobación con un lote fijo es el primer punto obligatorio del programa del análisis de cualquier EA, incluso si se planea habilitar money management en las siguientes fases.

Nosotros podemos realizar el trading «fragmentario» arriba descrito añadiendo al EA unos parámetros especiales de entrada que establezcan los tamaños de la ventana W, paso S y el número del paso que determina el desplazamiento de la ventana dentro del período general D como la cantidad de pasos. Por ejemplo, cuando el desplazamiento es igual a 0, la ventana toma su inicio en el punto B. Cuando es igual a 1, la ventana empieza en el momento S y se termina en el momento S+W. En caso del desplazamiento igual a 2, la ventana empieza en el punto 2*S y se termina en 2*S+W, etc. Podemos encargar el repaso de diferentes desplazamientos al Probador, activando la optimización según el parámetro correspondiente. Así organizaremos varios recorridos del Probador en los intervalos que incluyen los datos in-sample y out-of-sample, moviéndolos por el eje del tiempo virtual.

Nos queda ajustar este mecanismo para el trabajo como la optimización forward consecutiva. Para eso hay que asegurar que la optimización se realice sólo según los índices del trading en cada ventana W e ignore todos los posteriores períodos de prueba S. Para eso, se puede seleccionar el criterio de optimización personalizado en los ajustes del Probador y calcularlo en la librería a base de las operaciones dentro de la ventana actual W, devolviendo luego al Probador a través del manejador del evento OnTester. Aparte de eso, la librería debe calcular y guardar en algún lugar los índices del trading en cada período de prueba posterior S. Una vez terminada la optimización, vamos a disponer de varios juegos de parámetros para cada ventana W con desplazamiento a i pasos, entre los cuales será determinado el mejor juego. Según el número de este recorrido, podremos obtener inmediatamente los índices del trading en el siguiente intervalo S de prueba. Después de unirlos, obtenemos el informe completo sobre la simulación forward a lo largo de varios ciclos dentro de D.

Formación de la simulación walk-forward

Fig. 1 Formación de la simulación walk-forward

Los tamaños de W y S pueden variarse según el deseo del trader. Por ejemplo, se puede elegir la ventana de la optimización de 3 meses y el paso forward de 1 mes. Si el período general de prueba D es igual a 12 meses, en el Probador habrá que repasar los pasos S con desplazamientos de 0 a 9 (inclusive). El 9 se obtiene con un simple cálculo:

N = (D - W) / S = (12 - 3) / 1 = 9 (1)

En todas las iteraciones (excepto la última), a la derecha de la ventana W se ubicará el paso de la simulación forward. No obstante, cuando los desplazamientos son exactamente 9, la ventana W tocará la fecha final, y la prueba forward será imposible. Si la optimización walk-forward resulta exitosa en general, los parámetros óptimos de este último paso se convertirán en el conjunto recomendable para el trading en operativa real.

El éxito de la optimización forward puede ser evaluado según diferentes criterios que consideraremos más abajo. Aunque ya tenemos claro intuitivamente que los pasos fusionados de la simulación forward forman la curva del balance que se caracteriza por los índices habituales del Factor del beneficio, coeficiente de Sharp, beneficio esperado, etc.

Entretanto, vamos a centrarnos en otra cuestión: qué tamaños de la ventana W y del paso S hay que elegir. Sería lógico encargar la búsqueda de los valores óptimos al Probador. Es verdad, igual como realizamos el repaso de los pasos de la simulación forward mediante un parámetros especial de entrada proporcionado por la librería, también podemos incluir sus parámetros que establecen el tamaño de la ventana y del paso en la lista de los parámetros a optimizar.

La ejecución de la optimización walk-forward junto con la selección de los mejores tamaños de la ventana y del paso se llama el análisis de grupos (cluster walk-forward analysis).

Usando la librería y los resultados de la optimización de los tres parámetros, podremos confeccionar el informe con la tabla de la rentabilidad de la simulación forward para diferentes combinaciones de los tamaños de la ventana y paso, así como el informe detallado para cada celda de la tabla en el que se muestran todos los pasos consecutivos de las pruebas forward con valores correspondientes W y S.

Aparte de dos modos descritos: análisis de grupo y simulación consecutiva forward (conocida también como rolling walk forward en la literatura inglesa), la librería soporta otro modo, la optimización de anclaje walk forward (anchored walk forward optimization). Su diferencia del modo consecutivo consiste en que la fecha inicial de la ventana W nunca se cambia, pero en cada paso el tamaño de la ventana se aumenta, incluyendo el período de prueba de la alteración anterior. Por ejemplo, si continuamos el ejemplo con el tamaño inicial de la ventana de 3 meses y supongamos que el período general D empieza a partir del enero, entonces después del primer paso en el que la optimización se realiza para el enero-marzo y la simulación para el abril, el segundo paso incluye la optimización para el enero-abril con la simulación en mayo, el tercer paso con la optimización en enero-mayo con la simulación en junio, etc.

Pues bien, nos queda sólo implementar la idea. Los programadores, autores de los EAs, podrán crear esta herramienta personalmente. Aunque se trata de una tarea de mucho volumen, pero es transparente. Para aquellos que prefieren obtener un producto ya hecho, existe la librería WalkForwardOptimizer (WFO), tanto para MetaTrader 4, como para MetaTrader 5. Se diferencian en algunos detalles que hacen la versión para MetaTrader 5 más atractiva. En particular, en esta versión:

  • la librería está implementada en forma del único módulo que recopila los datos de la optimización y confecciona el informe a su base. En la versión para MetaTrader 4, los archivos se generan en la carpeta tester/Files de donde hay que trasladarlos manualmente a MQL4/Files, y luego inicial un script separado para construir el informe a su base (todos los enlaces se encuentran al final del artículo);
  • excluida la mayoría de las operaciones manuales rutinarias como la eliminación de los archivos intermedios antes de iniciar nueva optimización;
  • se realiza la determinación automática de los nombres y valores de los parámetros del EA (en MT4 es necesario traspasar esta información de forma explícita usando las llamadas a las funciones correspondientes);
  • se soporta la optimización en varios flujos, inclusive el uso de los agentes de red y la nube computacional MQL.
En general, la versión para MetaTrader 5 es más eficaz y simple en el uso. Eso se debe a un conjunto más amplio de medios útiles proporcionados por MQL5 API del Probador.

Implementación

Pues la interfaz de programa de la librería debe proporcionar los parámetros de entrada a través de los cuales se puede configurar el Probador para la realización de la optimización walk-forward. Están descritos en el archivo de la cabecera:

input WFO_TIME_PERIOD wfo_windowSize = year;
input int wfo_customWindowSizeDays = 0;
input WFO_TIME_PERIOD wfo_stepSize = quarter;
input int wfo_customStepSizePercent = 0;
input int wfo_stepOffset = 0;
input string wfo_outputFile = "";
input WFO_ESTIMATION_METHOD wfo_estimation = wfo_built_in_loose;
input string wfo_formula = "";

Los parámetros wfo_windowSize y wfo_stepSize permiten establecer el tamaño de la ventana y del paso de la optimización. Tenemos la enumeración WFO_TIME_PERIOD para indicarlos en las unidades estándar:

#define DAYS_PER_WEEK    7
#define DAYS_PER_MONTH   30
#define DAYS_PER_QUARTER (DAYS_PER_MONTH*3)
#define DAYS_PER_HALF    (DAYS_PER_MONTH*6)
#define DAYS_PER_YEAR    (DAYS_PER_MONTH*12)

#define SEC_PER_DAY     (60*60*24)
#define SEC_PER_WEEK    (SEC_PER_DAY*DAYS_PER_WEEK)
#define SEC_PER_MONTH   (SEC_PER_DAY*DAYS_PER_MONTH)
#define SEC_PER_QUARTER (SEC_PER_MONTH*3)
#define SEC_PER_HALF    (SEC_PER_MONTH*6)
#define SEC_PER_YEAR    (SEC_PER_MONTH*12)

#define CUSTOM_DAYS     -1

enum WFO_TIME_PERIOD
{
  none = 0,
  year = DAYS_PER_YEAR,
  halfyear = DAYS_PER_HALF,
  quarter = DAYS_PER_QUARTER,
  month = DAYS_PER_MONTH,
  week = DAYS_PER_WEEK,
  day = 1,
  custom = CUSTOM_DAYS
};

La unidad base es el día. Los pasos más pequeños no se soportan. Es más, el Probador permite establecer las fechas solamente con la precisión de un día. A aquellos quienes practican la optimización forward intradía luego se les será ofrecida la opción alternativa que trabaja con la precisión de hasta una barra.

Nótese que los elementos como la semana, mes, trimestre, año están determinados como constantes (número de días fijo). Los períodos no se emparejan según los límites calendarios. Eso permite aumentar la eficacia de los cálculos y mover la ventana del tamaño aleatorio de manera unificada sin vinculación a los límites de las semanas o meses. Si tenemos seleccionado el período «mes» (month) determinado como 30 días y la cuenta se realiza desde el principio de algún mes, es obvio que el cambio del siguiente mes calendario se realiza antes o después del paso «mensual» (puesto que los meses se diferencian según el número de días). En caso de empezar el proceso a partir de la mitad del mes, el paso va a caer en la mitad de los meses siguientes pero también con el desplazamiento del día de orden del mes.

El valor custom en wfo_windowSize o wfo_stepSize permite establecer los tamaños aleatorios de la ventana o del paso en los siguientes parámetros: por consiguiente, en wfo_customWindowSizeDays y wfo_customStepSizePercent. Como se ve de los nombres de los parámetros, la ventana se determina en días y el paso, en por cientos de la ventana.

Precisamente estos parámetros permiten organizar el repaso de los tamaños durante la optimización de grupo. Hay que seleccionar los tamaños de tal manera que el por ciento mínimo (inicial) y sus cambios con el incremento establecido den un número entero de días al ser aplicados a la ventana mínima. Por ejemplo, si la ventana se cambia de 10 a 50 con el paso de 10, no tiene sentido hacer el paso menos de 10% porque eso supone 1 día de la ventana mínima. Aparte de eso, no merece la pena coger el incremento para el paso forward menos de 10%, porque si fuera por ejemplo un 5%, entonces, en caso del tamaño de la ventana igual a 30, la segunda iteración supondría la simulación en el segmento igual a 15% (10% iniciales más un paso de 5%) de 30, lo que daría 4,5. Desde luego, esta configuración no llevará a un error fatal y la librería seguirá funcionando del modo reglamentario, sin embargo los pasos de la simulación forward pueden no ajustarse exactamente, lo que puede reflejarse en la precisión de los cálculos.

Lamentablemente, en este sentido la librería no puede ofrecer unos medios convenientes para facilitar la configuración y comprobación de su corrección. El usuario (en nuestro caso, debe conocer la programación, aunque sea un mínimo) debe verificar personalmente los parámetros. Una de las maneras de solucionar este problema puede ser otra organización de la librería— en particular, el trabajo con precisión de hasta una barra. Hablaremos de eso más tarde.

Cuando los tamaños de wfo_windowSize y wfo_stepSize son iguales a none, la librería prácticamente se desactiva.

El parámetro wfo_stepOffset, siendo incluido en los a optimizar, permite repasar los pasos de las simulaciones forward. Su incremento siempre tiene que ser igual a 1. El valor máximo se calcula según la fórmula (1) en la que se coloca el tamaño máximo de la ventana W y el tamaño mínimo del paso S.

El parámetro wfo_outputFile establece el nombre del archivo csv donde van a escribirse los índices financieros de las iteraciones de la optimización. El archivo se crea en la carpeta MQL5/Files (МТ5) o tester/Files (МТ4).

El parámetro wfo_estimation determina el índice que va a traspasarse al Probador para la optimización. Puede ser uno de los valores de la enumeración WFO_ESTIMATION_METHOD:

enum WFO_ESTIMATION_METHOD
{
  wfo_built_in_loose,
  wfo_built_in_strict,
  wfo_profit,
  wfo_sharpe,
  wfo_pf,
  wfo_drawdown,
  wfo_profit_by_drawdown,
  wfo_profit_trades_by_drawdown,
  wfo_average,
  wfo_expression
};
  • wfo_built_in_loose (por defecto) y wfo_built_in_strict son los indicadores combinados que se componen del coeficiente de Sharp, factor del beneficio, tamaño del beneficio y número de operaciones;
  • wfo_profit — beneficio;
  • wfo_sharpe — coeficiente de Sharpe;
  • wfo_pf — factor del beneficio;
  • wfo_drawdown — reducción relativa invertida  (100 - DD) calculada sobre la curva del balance;
  • wfo_profit_by_drawdown — beneficio dividido por la reducción relativa;
  • wfo_profit_trades_by_drawdown — beneficio multiplicado por el número de operaciones y dividido por la reducción relativa;
  • wfo_average — beneficio medio de la operación;
  • wfo_expression — fórmula personalizada del índice.

Y finalmente, el parámetro wfo_formula es la fórmula personalizada para calcular el índice si wfo_estimation está establecido igual a wfo_expression. Puede encontrar la información más detallada sobre las fórmulas admitidas y otras configuraciones en la guía de usuario de la librería.

Todos los parámetros tienen el prefijo wfo_, para distinguirlos con facilidad de otros parámetros de servicio del Asesor Experto.

Nótese: en cuanto Usted incluya el archivo de cabecera en su EA, ahí se crean los parámetros de entrada descritos, o mejor dicho, los parámetros meta porque ellos controlan el proceso de la optimización.

Además, cabe mencionar que el encabezado sólo declara los tipos y parámetros meta necesarios. Para que la información establecida con su ayuda entre en la librería, hace falta un conjunto de funciones abiertas, es decir la interfaz programada de la librería. Ellos también están descritas en el archivo de cabecera en forma de la directiva de importación (aquí en adelante se considera la versión para МetaTrader 5):

#import "WalkForwardOptimizer.ex5"
void wfo_setEstimationMethod(WFO_ESTIMATION_METHOD estimation, string formula);
void wfo_setPFmax(double max);
void wfo_setCloseTradesOnSeparationLine(bool b);
void wfo_OnTesterPass();
int wfo_OnInit(WFO_TIME_PERIOD optimizeWindow, WFO_TIME_PERIOD optimizeStep, int optimizeStepOffset, int optimizeCustomW, int optimizeCustomS);
int wfo_OnTick();
double wfo_OnTester();
void wfo_OnTesterInit(string optimizeLog);
void wfo_OnTesterDeinit();
#import

Las funciones con el prefijo wfo_set son opcionales. Ellas permiten establecer uno u otro modo de trabajo, pero si no se invocan, se usarán los valores predefinidos. Las funciones con el prefijo wfo_On son los manejadores (handles) de eventos. Tienen que estar insertadas obligatoriamente en el código fuente del EA.

Aquí tenemos el ejemplo del código fuente del EA con la librería incorporada. Todos los parámetros de las funciones se cogen directamente de los parámetros meta de entrada.
#include <WalkForwardOptimizer.mqh>

...

int OnInit(void)
{
  // su código de trabajo está aquí
  ...

  // opcional, por defecto wfo_built_in_loose
  wfo_setEstimationMethod(wfo_estimation, wfo_formula);

  // opcional, por defecto DBL_MAX
  wfo_setPFmax(100);

  // opcional, por defecto false
  // wfo_setCloseTradesOnSeparationLine(true);
  
  // obligatoriamente, todos los parámetros desde el archivo de cabecera
  int r = wfo_OnInit(wfo_windowSize, wfo_stepSize, wfo_stepOffset, wfo_customWindowSizeDays, wfo_customStepSizePercent);
  
  return(r);
}

void OnTesterInit()
{
  wfo_OnTesterInit(wfo_outputFile); // obligatoriamente
}

void OnTesterDeinit()
{
  wfo_OnTesterDeinit(); // obligatoriamente
}

void OnTesterPass()
{
  wfo_OnTesterPass(); // obligatoriamente
}

double OnTester()
{
  return wfo_OnTester(); // obligatoriamente
}

void OnTick(void)
{
  int wfo = wfo_OnTick();
  if(wfo == -1)
  {
    // esperamos a que se empiece la ventana
    // no tradeamos
    return;
  }
  else if(wfo == +1)
  {
    // esperamos la finalización de la simulación después de la ventana y forward
    // no tradeamos
    return;
  }

  // su código de trabajo está aquí
  ...
}

wfo_OnInit envía todos los datos necesarios a la librería: tamaño de la ventana, tamaño del paso, número del paso, tamaño personalizado de la ventana en días, tamaño personalizado del paso en por cientos de la ventana. Devuelve 0 en caso de éxito o el código del error (por ejemplo, INIT_PARAMETERS_INCORRECT) si los parámetros han sido establecidos de forma incorrecta.

wfo_OnTick controla la optimización del EA dentro de la ventana de optimización y simulación forward. Devuelve 0 si el tick actual (barra) entra dentro del timeframe en movimiento donde al EA se le permite tradear, así como -1 o +1 si el tick se encuentra fuera de la ventana y el trading debe ser desactivado temporalmente (-1 significa que la ventana aún no ha llegado, y +1, que la ventana ya se ha acabado).

wfo_OnTester calcula y devuelve el índice establecido de la eficacia al Probador.

wfo_setCloseTradesOnSeparationLine establece el modo del cierre de todas las órdenes de mercado y eliminación de las órdenes pendientes en el momento de la intersección del límite entre la ventana de la optimización y simulación forward.

Práctica

Cuando ya tenemos compilado el EA con la librería incorporada, podemos empezar a configurar el Probador.

Seleccionamos un intervalo determinado de fechas en el grupo de los campos Intervalo: es el período general D descrito más arriba. Normalmente, la fecha final es el día de hoy o algo cercano.

En el campo Forward hay que seleccionar la opción No (la simulación forward incorporada no nos conviene).

En cuanto al modo de ejecución, se recomienda Normal, por barras o puntos de referencia. Recordaremos que nuestro walk-forward trabaja debido a la adición de los parámetros meta que se incluyen en la optimización (en adición a los parámetros del EA), y por eso aumentan la carga computacional.

En el campo Optimización podemos seleccionar el modo lento (repaso completo) o rápido (con uso de la genética), mientras que el Criterio de la optimización tiene que ser obligatoriamente personalizado.

Se permite usar el algoritmo genético de la optimización, pero hay que tener en cuenta algunos detalles. El algoritmo genético omite muchas combinaciones de los parámetros de entrada, incluyendo las combinaciones de los parámetros meta que establecen el tamaño de la ventana, el paso forward y el número del paso, por eso algunas de las pruebas forward pueden faltar. Este problema puede ser evidente en caso si la dimensión del espacio de búsqueda es grande (si hay muchos parámetros del EA o sus incrementos), pero en otros casos se puede no hacer caso de eso. Las omisiones se marcan en el informe que se forma, y a base de esta información se puede tomar decisión si es necesario intentar reducir el espacio de la optimización.

Este problema suele surgir a menudo en caso de la optimización de agrupamiento (clústeres). La optimización forward consecutiva o de anclaje normalmente no tienen este problema.

El algoritmo genético puede «colocar las prioridades» irregularmente entre las ventanas de optimización con diferentes desplazamientos, dependiendo de su rentabilidad. Por ejemplo, si el primer mes del trading ha sido objetivamente más complicado que el segundo, lo más probable que el Probador prestará más atención al parámetro wfo_stepOffset con el valor 1, que con 0. En otras palabras, la optimización genética en muchas ventanas dentro del diapasón D no da tan buenos resultados que en la optimización genética en una determinada ventana W (con la librería deshabilitada). La única solución de este problema es usar el repaso completo lento de todos los parámetros y los parámetros meta.

Por otro lado, walk-forward ejecuta las tareas de comprobación de la estabilidad del algoritmo a base de los datos out-of-sample, así como las tareas de selección de la mejor profundidad del historial para la optimización y el paso de reoptimización (con qué frecuencia buscar nuevas configuraciones). Estas funciones también se realizan bien sin encontrar los parámetros óptimos.

Configure de forma habitual los parámetros del EA que necesitan la optimización. La configuración de los parámetros meta depende del modo de la optimización walk-forward que se va a usar.

La optimización consecutiva walk-forward en los períodos predefinidos
  1. Seleccione la ventana de optimización de la lista a través de wfo_WindowSize
  2. Seleccione el tamaño del paso forward de la lista en wfo_stepSize
  3. Active la optimización para wfo_stepOffset en el diapasón desde 0 hasta cualquier número de pasos que cabe en el historial disponible con el paso 1.
La optimización consecutiva walk-forward en los períodos aleatorios
  1. Seleccione custom de la lista del parámetro wfo_WindowSize
  2. Introduzca el número de días en wfo_customWindowSizeDays
  3. Seleccione tamaño custom para el parámetro wfo_stepSize
  4. Introduzca el tamaño en wfo_customStepSizePercent, como el por ciento del tamaño de la ventana
  5. Active la optimización para wfo_stepOffset en el diapasón desde 0 hasta cualquier número de pasos que cabe en el historial disponible con el paso 1.
La optimización de agrupamiento walk-forward
  1. Seleccione el tamaño de la ventana de optimización en wfo_WindowSize como custom.
  2. Active la optimización para wfo_customWindowSizeDays para cualquier diapasón conveniente e incremento en días.
  3. Seleccione el tamaño del paso forward en wfo_stepSize como custom.
  4. Active la optimización para wfo_customStepSizePercent para cualquier diapasón conveniente e incremento en por cientos desde el tamaño de la ventana (el diapasón recomendable de los valores es 5-30%, el paso 5-10%).
  5. Active la optimización para wfo_stepOffset en el diapasón desde 0 hasta cualquier número de pasos que cabe en el historial disponible con el paso 1.
Si tiene un tamaño preferible de la ventana de optimización, puede iniciar el análisis de agrupamiento (clásteres) sólo para el paso alterable, y si ya tiene ajustado el tamaño del paso, se puede cambiar sólo el tamaño de la ventana.
La optimización de anclaje walk-forward
  1. Seleccione el tamaño de la ventana de optimización en wfo_WindowSize como custom.
  2. Active la optimización para wfo_customWindowSizeDays en el diapasón deseado. Como incremento, seleccione el número de días igual a la longitud del período predefinido que será establecido en la siguiente etapa (por ejemplo, introduzca el incremento de 30 días si va a usar el paso «mes»).
  3. Seleccione el tamaño del paso de la lista de las constantes predefinidas wfo_stepSize, nótese que la constante tiene que ser igual al incremento especificado antes para el tamaño de la ventana.
  4. Desactive la optimización para wfo_stepOffset y establezca su valor en 0.

Cuando tengamos todo configurado, iniciaremos la optimización y esperaremos a que se complete. Cuando usamos la librería, no se puede parar y volver a continuar la optimización como en el caso de la optimización estándar. Eso se debe a que la parada y la continuación del trabajo del Probador no tienen los eventos de programa correspondientes en MQL5 API, y por eso es imposible sincronizar la caché de los datos de la librería con la caché del Probador. En otras palabras, cada clic en el botón Empezar llama a la inicialización completa de la librería, independientemente del estado interno del Probador, y la librería empieza a recopilar los datos de los recorridos desde el principio, o sea desde cero. Si tiene lugar el reinicio de la optimización parada antes, todos los datos recopilados por la librería antes de la pausa serán perdidos. Por si acaso, se recomienda vaciar la carpeta tester/cache antes de la optimización walk-forward.

En el proceso de la optimización, WFO crea unas variables globales especiales (se guardan en un archivo con la extensión GVF) y el archivo CSV con los datos en la carpeta MQL5/Files. Después de eso, a su base se forma automáticamente la página html con el descifrado de los resultados. Los nombres de los archivos GVF y HTML coinciden con el nombre del archivo CSV establecido en la librería a través del parámetro wfo_outputFile.

Vamos a coger un EA simple y en su ejemplo veremos qué tipos de informes se puede obtener a través de la librería en diferentes modos. El EA ha sido generado por el Asistente para MQL5 a base de dos estrategias comerciales, Envelopes y WPR. Está disponible en el Market como un producto gratuito.

¡Atención! Este EA no pretende conseguir una rentabilidad excesiva. Es un ejemplo estadístico medio cuyo objetivo consiste en servir de cobaya para la librería. 

Vamos a experimentar en el gráfico EURUSD D1. Para empezar, intentaremos obtener el informe rolling walk-forward. Establecemos el período general para la prueba 2015.01.01-2017.06.01.

Ajustes del Probador

Fig. 2 Ajustes del Probador

En este EA hay un parámetro EnableWFO que por defecto es igual a false. En este caso, la librería está desactivada y el EA tradea en un modo habitual. Para activar la librería, hay que cambiar el valor de la bandera por true.

Dejaremos el valor predefinido en wfo_windowSize, es decir year, así como el valor predefinido quarter, en el parámetro wfo_stepSize. Entonces se establece el movimiento de la ventana de optimización de tamaño de 1 año con desplazamientos en 1 trimestre, y un trimestre es una prueba forward. Eso da (2,5 años - 1 año) / 3 meses = (30 - 12) / 3 = 6 pasos de la simulación forward.

Establecemos el nombre del archivo demo.csv en wfo_outputFile.

De los parámetros del EA, vamos a optimizar los niveles Stop Loss y Take Profit, período y la desviación Envelopes, así como el período WPR. El conjunto de parámetros (wfo-demo-rolling.set) se adjunta al final del artículo.

Ajustes del EA

Fig. 3 Ajustes del EA

El informe demo.html que obtenemos después de la optimización es el siguiente.

Informe rolling walk-forward

Fig. 4 Informe rolling walk-forward

Este informe nos dice que el EA se comporta muy mal en los períodos forward. Pero como se sabe de la práctica científica, un resultado negativo también es un resultado útil.

Ahora intentaremos obtener un informe de clásteres y seleccionar los tamaños de la ventana de la optimización y el paso donde el beneficio será estable. Para eso, en los parámetros wfo_windowSize y wfo_stepSize seleccionamos la opción custom, y ajustamos wfo_customWindowSizeDays para la optimización de 90 a 180 días con el paso 30 y wfo_customStepSizePercent, de 10 a 30% con el paso 10. Obtenemos el número máximo de los pasos en wfo_stepOffset como el cociente de (2,5 años - 90 días) / (90 días * 10%) = 810 / 9 = 90. El conjunto de parámetros (wfo-demo-cluster.set) se adjunta al final del artículo.  

Abajo se muestra el ejemplo del informe obtenido (los índices más detallados se presentan en el siguiente apartado— Análisis).

Informe cluster walk-forward

Fig. 5 Informe cluster walk-forward

Muchas celdas de la tabla demuestran unos resultados satisfactorios. Precisaremos por ejemplo qué es lo se oculta bajo la configuración con la ventana 120 días y el paso de 30%. Para eso, hagamos el clic en la celda correspondiente y veremos todos los detalles de la simulación forward.

Informe detallado de rolling walk-forward

Fig. 6 Informe detallado de rolling walk-forward

A pesar de que el resultado sea positivo, la curva del balance no impresiona para nada. Al estudiar otras variantes, podremos deducir que el EA con los parámetros seleccionados para la optimización en este momento no es bastante estable. Se requiere bien la corrección del conjunto de las estrategias comerciales, o bien la optimización de otros parámetros que no han sido utilizados.

Hablando en general, el proceso del perfeccionamiento del EA siempre es bastante duradero, y lo único en que el uso de la tecnología walk-forward facilita la tarea es que permite omitir rápidamente muchas opciones para cuya comprobación con medios habituales se requeriría muchos más esfuerzos. Además, las búsquedas de los caminos para mejorar las características del robot quedan las mismas, intuitivas en muchas ocasiones. Aquí walk-forward no da ningunas recomendaciones. Lo óptimo sería aplicar el método cuando ya disponemos de un EA más o menos rentable y es necesario averiguar si sus logros no están ajustados y si están comprobados suficientemente.

Análisis

El informe generado contiene diferentes datos, dependiendo del modo de trabajo elegido de la librería. En caso del análisis de agrupamiento (clústeres), el informe se empieza con varias tablas que contienen los índices sumarios de muchas simulaciones consecutivas walk-forward. En cada tabla, las columnas corresponden a las dimensiones de la ventana W en días, mientras que las filas, a las dimensiones del paso S en por cientos. Cada celda de la tabla es un hipervínculo. Cuando hacemos clic en ella, vamos al informe correspondiente de la simulación consecutiva walk-forward. De esta manera, podemos precisar cómo hemos obtenido cualquier índice final.

En las tablas del análisis de agrupamiento se muestran los siguientes índices:

  • Beneficio anual (annualized profit/loss) — beneficio hipotético del EA durante el año al calcular las ganancias proporcionalmente a los períodos de la optimización y simulación.
  • Eficiencia (efficiency) — relación entre el beneficio anual para el período de prueba y el período del mismo recorrido.
  • Estabilidad (consistency) — porcentaje de los recorridos rentables entre todos los recorridos del forward «fusionados».
  • Integridad (completness) — cantidad de los pasos forward para unas determinadas combinaciones de los tamaños de la ventana y del paso forward; puede ser menor que el número solicitado durante la optimización genética debido a la omisión de algunos valores de los parámetros; el número de de los pasos omitidos se indica entre paréntesis con fuente pequeña.
  • Número de días (days in step) — número de días en el paso para cada combinación de los tamaños de la ventana y del paso, se usa para la conversión del tamaño del paso de los por cientos en días.

El beneficio anual, la eficiencia y la estabilidad son los criterios principales para la evaluación del éxito de la simulación forward. Está claro que si son más altos, mejor. Se recomienda tener la estabilidad por encima de 50%. En las tablas del análisis de agrupamiento, los mejores índices se marcan en verde.

Adicionalmente, tiene sentido prestar atención en la reducción (drawdown), beneficio esperado y la desviación estándar, están disponibles en los informes detallados estándar.

Los informes de las simulaciones estándar (consecutivos) se construyen no sólo como detallados para las variantes del análisis de agrupamiento (clústeres), sino por sí mismos, como resultados de la optimización simple rolling walk-forward.

Para la simulación estándar walk-forward (consecutivo) o para la simulación de anclaje, el informe representa una tabla con todos los recorridos del Probador que han formado este forward combinado. En cada fila se muestran los índices comerciales como los siguientes: beneficio, factor del beneficio, número total de las operaciones y operaciones rentables, reducción, coeficiente de Sharp (separadamente para los períodos de la optimización y simulación). Los índices de la optimización se resaltan en azul y para la simulación, en amarillo. Si el último paso pilla el tiempo «actual» (la fecha final de la simulación), se resalta en verde, indicando que son los últimos parámetros conocidos, por tanto son aplicables para el trading «actual». Desde luego, el tiempo «actual» es actual sólo si la fecha de la optimización está establecida como el día de hoy.

En las primeras tres columnas del informe forward se muestra el número del recorrido del Probador, la fecha inicial de la ventana de la optimización (in-sample), la fecha inicial del período de prueba (out-of-sample) y la fecha de su finalización. En la última columna del informe se muestran los valores de los parámetros encontrados como resultado de la optimización dentro de los límites de la ventana. Usted puede ver las descripciones emergentes si sitúa el cursor del ratón sobre el encabezado de la columna.

Al usar el método genético de la optimización, el número de los recorridos en el informe incorporado se muestra no como una cifra, sino como «número de la generación, número de la instancia», por eso podemos establecer la correspondencia entre las filas del informe incorporado y las filas del informe de la librería WFO sólo según los parámetros. Al usar el método lento de la optimización, no hay este problema, y los números de los recorridos coinciden en ambos informes. Es la particularidad de la plataforma MetaTrader 5, y no de la librería.

Al hacer clic en la fila correspondiente del informe incorporado del Probador, el usuario puede reproducir el trading del EA en una determinada ventana walk-forward de la optimización y el siguiente paso walk-forward de la simulación. Nótese que el trading no va a realizarse fuera de este diapasón de fechas. Para ver como el EA tradeaba con este conjunto fuera de la ventana, hay que desactivar la librería o poner wfo_windowSize en el valor none.

Después de la tabla se muestra el gráfico esquemático de la curva del balance.  

Pues, hagamos el balance intermedio. Hemos podido organizar la optimización walk-forward en forma simplificada directamente en el Probador del MetaTrader. Funciona y da unos resultados interesantes. Sin embargo, el ajuste de los parámetros de la librería no es un proceso trivial. Para algunos usuarios resulta complicado seleccionar los parámetros meta correctos. Otro problema está relacionado con el rendimento. Puesto que el trabajo de la librería se basa en los parámetros meta adicionales que participan en la optimización, el espacio de la búsqueda se aumenta considerablemente, y por consecuencia, se requieren menos recursos computacionales. ¿Es posible simplificar esta situación? Pues, sí, es posible. Pero para eso tendremos que volver a inventar la bicicleta, es decir revisar los principios del trabajo de la librería y realizar prácticamente otra librería. 

Walk-forward para los perezosos y ocupados

La nueva librería también va a incorporarse en el EA, pero no expone los parámetros y no supone configuraciones. Su optimización va a iniciarse en el período general D (ampliado). La diferencia de la optimización habitual consiste sólo en este período porque la optimización estándar se realiza por el usuario en la ventana W que selecciona. Durante la optimización D, la nueva librería recopila la información sobre todas las transacciones ejecutadas por el EA (para diferentes conjuntos de parámetros). En otras palabras, para cada recorrido del Probador se forma un archivo en el que en cada barra se escribe el balance actual, el beneficio flotante y el número de las posiciones abiertas. Resulta que después de la conclusión de la optimización, a base de estos datos se puede confeccionar diferentes informes walk-forward, similares a los analizados más arriba. En caso de MetaTrader 4, eso puede hacer un script separado, y en caso de MetaTrader 5, la librería.

Esta librería también tiene disponibles las versiones para MetaTrader 4 y para MetaTrader 5, pero para variar vamos a considerar aquí la implementación para MetaTrader 4. La documentación completa con todos los detalles sobre la diferencia de las versiones está publicada en el blog.

Aclararemos el principio del trabajo de la librería simplificada.

Cuando se usa, el Probador no ejecuta prácticamente la optimización como tal, sino repasa diferentes combinaciones de los parámetros de entrada. La selección de los conjuntos óptimos para cada ventana se realiza durante la confección del informe. El script selecciona la ventana W necesaria para in-sample del período general D, calcula los índices de la eficacia para todos los recorridos del Probador (cada recorrido es un conjunto separado de parámetros) y encuentra la mejor opción. Luego del mismo recorrido queda detectar los índices de la eficacia del trading en el siguiente paso out-of-sample de la simulación S.

Este algoritmo implementa walk-forward de una manera no estándar. Eso permite conseguir la facilidad del uso, pero tiene sus efectos secundarios. En particular, cuando se usa el método genético de la optimización, se introduce una idea preconcebida dado que los conjuntos de los parámetros a verificar son óptimos en el sentido global (en todo el período D, y no en la ventana actual W). Eso puede ser avaluado como la vista hacia el futuro. Sin embargo, por otro lado, los mejores parámetros en sentido global van producir los beneficios más bajos que los parámetros que podrían ser encontrados durante la optimización local en la ventana W.

En cualquier caso, este problema no se observa durante el repaso completo lento de los parámetros.

Además, cabe mencionar que el EA tradea en el período D completo, de los que se deducen dos cosas.

Primero, para el inicio de una determinada ventana W, el balance puede ser arbitrario. Analógicamente con WFO, eso quiere decir que la nueva librería es aplicable sólo para las estrategias con el lote constante.

Segundo, algunas posiciones pueden cruzar el límite inicial o final de la ventana durante su existencia, es decir una posición abierta ya puede existir y tener un beneficio flotante en el momento del comienzo de la ventana, o la posición puede abrirse dentro de la ventana y cerrarse en la fase de la simulación forward. Esta inexactitud es el pago por la simplificación del proceso. Con el aumento del número de las operaciones, el efecto negativo de eso se reducirá a una magnitud absolutamente insignificante. Por ejemplo, durante el uso de una cuenta de compensación (netting), como máximo una posición puede alterar los índices en la entrada de la ventana, y como máximo una posición, en la salida. Si en la ventana W, entran 100 operaciones dobladas entrada/salida, el error medio de los cálculos será no más de 2% del tamaño medio de la operación.

La interfaz de la librería en el archivo de cabecera wfL.mqh es muy simple. 

#import "wfL.ex4"
  int wfl_OnInit(const int cleanUpTimeout);
  void wfl_OnTick();
#import

El procedimiento de la inserción en el código del EA también se facilita considerablemente.

#include <wfL.mqh>

int OnInit()
{
  // ... código de trabajo
  wfl_OnInit(60);
}

void OnTick()
{
  // ... código de trabajo
  wfl_OnTick();
}

La optimización se realiza según el mismo procedimiento que se describe más arriba para la librería WFO.

El período de la optimización debe contener como mínimo 200 barras, pero se recomiendan 1000 y más. Eso está relacionado con el hecho de que la división del período general en ventanas y pasos de las pruebas forward se realiza por barras, y los conjuntos de los valores comprobados de los tamaños de las ventanas y desplazamientos están predefinidos en el código de la librería: los tamaños de las ventanas se varían de 10% a 50% con incremento de 10% (nótese que aquí la ventana se establece como el porcentaje del diapasón general de la simulación D), y el tamaño del paso S, de 5% a 30% con incremento de 5%.

Después de la finalización de la optimización, en la carpeta Tester/Files se crea el catálogo tipo:

<EA name>-<Symbol>-<Timeframe>-<Date>-<Time>

Ahí se encuentran los archivos csv con los datos meta recopilados por la librería durante cada recorrido del Probador. Cada entrada en este archivo contiene la información para una barra: fecha y hora, balance, beneficio flotante y el número de las operaciones abiertas. Usando esta información, se puede calcular los beneficios y las pérdidas para cualquier ventana dentro del período. La información sobre las operaciones separadas no se guarda y no se analiza.

Si movemos esta carpeta con todos los archivos de Tester/Files en MQL4/Files, se puede iniciar el script de la confesión del informe, indique el nombre de la carpeta en el parámetro de entrada. Se indica también el criterio de la optimización según el cual van a seleccionarse los mejores conjuntos de los parámetros dentro de las ventanas determinadas. Los criterios disponibles son los mismos que en la versión completa de la librerías WFO. Como resultado, se obtiene un informe de clásteres con las simulaciones consecutivas walk-forward de precisión (su ejemplo se encuentra más arriba).

Todos los pequeños defectos mencionados arriba se compensan con creces con su altísimo rendimiento y facilidad del uso. Debido a que no hay parámetros meta en este caso, la optimización walk-forward no supone ningunos gastos adicionales en comparación con la optimización habitual a base de los parámetros seleccionados del EA.

Conclusión

Pues bien, hemos considerado los posibles principios de la construcción e implementación de la tecnología de la optimización walk-forward respecto a los medios del Probador de los terminales disponibles en este momento. Las librerías descritas permiten probar el enfoque con esfuerzos mínimos. Algunas simplificaciones y limitaciones de las librerías, por un lado, diferencian la versión obtenida de walk-forward de la versión canónica, pero por otro lado, aseguran la sencillez del uso y requieren ningunos programas externos. Hasta que MetaTrader no tenga la posibilidad incorporada de realizar la optimización walk-forward, parecidas librerías ofrecen una alternativa admisible.

Tabla sumaria de los productos

Producto MT4 MT5

WFO: WalkForwardOptimizer & WalkForwardReporter

WalkForwardOptimizer
Librería
https://www.mql5.com/es/market/product/17683 https://www.mql5.com/es/market/product/23068
WalkForwardReporter
Script
https://www.mql5.com/es/market/product/17750 (no es necesario,
librería MT5 WFO confecciona los iformes automáticamente)
WalkForwardDemo
Asesor Experto
(no) https://www.mql5.com/es/market/product/23069

WFL: WalkForwardLight & WalkForwardBuilder

WalkForwardLight
Librería
https://www.mql5.com/es/market/product/23223 https://www.mql5.com/es/market/product/23224
WalkForwardBuilder
Script
https://www.mql5.com/es/market/product/23225 https://www.mql5.com/es/market/product/23226
(opcional)

Al hacer clic en el icono, pasará a la página correspondiente del producto.


Parámetros para el análisis WF consecutivo (rolling) del Asesor Experto de demostración— wfo-demo-rolling.set
Parámetros para el análisis WF de agrupamiento (cluster) del Asesor Experto de demostración— wfo-demo-cluster.set

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/3279

Archivos adjuntos |
Patrones disponibles al comerciar con cestas de divisas. Parte III Patrones disponibles al comerciar con cestas de divisas. Parte III
Este es el artículo final dedicado a los patrones que aparecen al comerciar con cestas de parejas de divisas. Se han analizado varios indicadores combinados de tendencia, así como la aplicación de las construcciones gráficas habituales.
Indicadores personalizados e infografía en CCanvas Indicadores personalizados e infografía en CCanvas
En este artículo se analizarán nuevos tipos de indicadores con una estructura de implementación más compleja. Se describirá la construcción de los indicadores de los tipos pseudo-3D y la creación de infografías que cambian de manera dinámica.
Asesor Experto multiplataforma: Gestión de capital (money management) Asesor Experto multiplataforma: Gestión de capital (money management)
En este artículo se analiza la implementación de la gestión de capital (money management) en el Asesor Experto multiplataforma. Las clases de la gestión de capital se encargan del cálculo del tamaño del lote que el Asesor Experto usará para entrar en la siguiente operación.
Interfaces gráficas XI: Controles dibujados (build 14.2) Interfaces gráficas XI: Controles dibujados (build 14.2)
En la nueva versión de la librería, todos los controles van a dibujarse en los objetos gráficos separados tipo OBJ_BITMAP_LABEL. Además, seguiremos describiendo la optimización del código: es decir, analizaremos los cambios en las clases que representan el núcleo de la librería.