Desarrollando un algoritmo de autoadaptación (Parte I): Encontrando un patrón básico

19 marzo 2021, 09:45
Maxim Romanov
0
687

Introducción

Cualquier algoritmo comercial es generalmente una herramienta que puede aportar beneficios a un tráder experimentado o acabar instantáneamente con el depósito de un principiante. El principal problema a la hora de crear un algoritmo rentable y fiable es que no podemos entender qué debemos hacer para ganar dinero y qué métodos usan los "tráders exitosos". Mientras que el HFT, el arbitraje, las estrategias de opciones y los sistemas basados ​​en el spread de calendario cuentan con una sólida base teórica que indica claramente lo que debemos hacer para obtener beneficios, los algoritmos basados ​​en el análisis de los precios y los datos fundamentales son mucho más ambiguos. Esta área carece una base teórica completa que describa los precios, lo cual hace extremadamente difícil crear un algoritmo comercial estable. Aquí, el comercio se convierte en un arte, mientras que la ciencia ayuda a sistematizar todo.

Pero, ¿es posible crear un algoritmo comercial totalmente automatizado que se base únicamente en el análisis de los cambios de precio y que funcione con cualquier instrumento comercial sin optimización y sin necesidad de configurar manualmente los parámetros para cada instrumento comercial por separado? Colocas el instrumento comercial necesario en un gráfico, y él mismo determina los parámetros que generarán beneficios para este instrumento. 

¿Puede existir un algoritmo que no pierda dinero independientemente de los cambios del mercado? Creo que es posible crear uno, aunque es una tarea bastante complicada. Podemos resolver este problema de dos formas:

  1. Utilizando redes neuronales con aprendizaje automático y obteniendo una "caja negra" en la salida, que, según algunos de sus criterios, analice el mercado y genere dinero. A pesar de su aparente obviedad y atractivo, este enfoque posee sus propias dificultades. Si fuera tan fácil de implementar, entonces empresas como GOOGLE y Yandex, con su vasta experiencia en el uso del aprendizaje automático y sus grandes presupuestos, habrían resuelto este problema hace mucho tiempo, o al menos se encontrarían entre los líderes en el análisis de datos de mercado y la calidad de previsiones. Estoy seguro de que es posible crear tal algoritmo. Eso sí, deberemos perfeccionarlo constantemente a medida que se desarrolle la tecnología, para que siga siendo competitivo. Además, tendremos que competir con los gigantes tecnológicos.
  2. Estudiando los patrones de fijación de precios, desarrollando un modelo teórico de fijación de precios y creando un algoritmo que considere el máximo de los factores que influyen en la fijación de los precios. En nuestra opinión, este enfoque resulta incluso más complicado que el aprendizaje automático, pero, al igual que el caso anterior, resulta real. Dicho algoritmo se desarrollará a medida que mejoren la base teórica y los conocimientos del desarrollador. También necesitará una modernización constante.

Hemos decidido ir por el segundo camino: vamos a crear una teoría completa y a desarrollar un algoritmo basado en ella. En esta serie de artículos, desarrollaremos un algoritmo de este tipo, y veremos cómo el proceso evoluciona desde un pequeño patrón a un gran proyecto. Paralelamente, analizaremos cómo encontrar patrones, estudiarlos y mejorar la eficiencia del trabajo.

El primer algoritmo se hará solo para el mercado FOREX y el terminal MetaTrader 4; en el proceso, evolucionará hacia un algoritmo universal escrito para MetaTrader 5, que podrá funcionar tanto en el mercado FOREX como en los mercados bursátiles.

El patrón básico

Vamos a empezar buscando el patrón básico que constituirá la base del algoritmo. Este patrón deberá ser fundamental e inherente a la mayoría de los mercados para poder escalarlo fácilmente a cualquier mercado en el futuro. La escalabilidad para cualquier mercado sugiere que el algoritmo, en realidad, se adapta a sí mismo.

Para empezar, intentaremos esclarecer lo siguiente: ¿por qué resulta difícil ganar dinero en el mercado de forma constante? La respuesta a esa pregunta se halla en la competencia directa. La tarea de algunos tráders consiste en realizar una transacción rentable con otros; el problema es que cada una de las partes quiere realizar una transacción rentable, y para ello, una de las dos debe perder. Por consiguiente, el mercado no debería tener patrones simples estables que todos puedan detectar.

En nuestro primer artículo Discretización de series temporales con generación aleatoria de "ruidos" escribimos sobre el componente aleatorio en el mercado y sobre el hecho de que la distribución de incrementos para una serie de precios es muy similar a la distribución de incrementos para un paseo aleatorio. Es decir, al echar un primer vistazo a la serie de precios, parece que no hay patrones, que todo es accidental y resulta imposible ganar dinero consistentemente.

Por ello, hemos tomado como regla básica que haya exactamente el mismo número de velas ascendentes y descendentes para cualquier instrumento. Se trata de un patrón muy simple, y cualquier desviación respecto al mismo redundará en beneficios estables para todos los que la detecten, y muchos lo harán, porque resulta elemental. Pero, como sabemos, no todo el mundo puede ganar dinero, por lo que no puede haber una desviación significativa de la cantidad de velas descendentes respecto al número de velas ascendentes a largo plazo. Esto también se desprende del artículo anterior. Teóricamente, puede haber desviaciones respecto a esta regla, porque no hemos verificado todas las herramientas, sino solo unas cien, pero en esta etapa no resulta tan importante. 

Por ejemplo, vamos a tomar 100.000 velas de hora de GBPUSD para cualquier periodo y calcular cuántas de ellas serán ascendentes y cuántas descendentes. Nosotros hemos tomado 100,000 velas para el periodo desde 2020.10.27 en el pasado y hemos comprobado que 50007 de ellas son ascendentes y 48633 descendentes; el precio de apertura del resto es igual al precio de cierre. Como resultado, GBPUSD tiene un 50,7% de velas ascendentes y un 49,3% de velas descendentes; el resto de velas tiene un precio de apertura igual al precio de cierre. Es decir, la proporción es aproximadamente igual, y si hay una muestra más grande, el resultado tenderá al 50%.

En el marco de este artículo, no mediremos todos los instrumentos. Hemos tomado medidas en cientos de instrumentos y los resultados han sido los mismos en todas partes. Pero para resultar convincentes, hemos tomado un instrumento de un mercado completamente diferente, GAZP (Gazprom), con el marco temporal M15, y hemos medido el número de velas descendentes y ascendentes en 99914 velas. El resultado ha sido de 48237 ascendentes y 48831 descendentes; el resto son neutras. Como podemos ver, el número de velas ascendentes y descendentes es aproximadamente igual.

Este patrón es bueno no solo porque está presente en una gran cantidad de instrumentos, sino que también porque permanece en cualquier marco temporal. Para asegurarnos de ello, vamos a analizar GBPUSD en el marco temporal M1, y a tomar como ejemplo las acciones de AAPL en crecimiento constante en el marco temporal M15. Hemos combinado todos los datos en un recuadro.

Instrumento Marco temporal Número total de velas Porcentaje de velas ascendentes Porcentaje de velas descendentes
GBPUSD M1 100 000 50.25% 49.74%
GBPUSD H1 100 125 50.69% 49,30%
GAZP M15 99 914 49.69% 50.30%
 AAPL  M15  57 645 50.60% 49.40%

Como podemos ver en el recuadro, la proporción de velas ascendentes y descendentes tiende al 50% en los instrumentos analizados y resulta válida para todos los marcos temporales considerados. A continuación, adjuntamos un archivo XLSX que contiene los datos usados en nuestras mediciones, así como los resultados de las mismas.

Los resultados mostrados en el recuadro confirman la conclusión de que los parámetros estadísticos de la serie de precios sobre un gran número de muestras resultan muy similares a los parámetros del paseo aleatorio. Además, en un pequeño número de muestras, encontraremos desviaciones de la distribución de referencia. El algoritmo se basará en el supuesto de que la distribución de los incrementos para una serie de precios es similar a la normal solo de una forma superficial.

En un pequeño número de muestras, la forma de distribución se distingue respecto a la de referencia, mientras que al aumentar el número de muestras, la forma tiende a la de referencia. Y, lo más importante, la velocidad con la que la distribución tiende a la de referencia resulta individual para cada instrumento y es bastante estable. 

distribution

Figura 1.

En la figura 1, podemos ver lo que hemos descrito anteriormente. Aquí, la distribución de referencia de los incrementos se muestra en rojo, mientras que la distribución de los incrementos para una serie de precios con un gran número de muestras se representa en negro. Los colores púrpura, verde y azul muestran la distribución de los incrementos de las series de precios en un pequeño número de muestras.

Hemos encontrado una regularidad fundamental propia de una gran cantidad de instrumentos comerciales, por lo que hemos hecho una suposición sobre la procedencia de la ganancia. El número de velas descendentes es igual que el número de velas ascendentes, y cuando ocurre una desviación del equilibrio, la tasa de retorno al equilibrio para cada instrumento es individual, estable y oscila dentro de ciertos límites. Este es el patrón que utilizaremos para obtener beneficios.

Desarrollando el algoritmo de prueba

A continuación, deberemos desarrollar el algoritmo más simple posible que explote este patrón, para después ponerlo a prueba y comprender si merece la pena desarrollar más la teoría. Para el comercio, usaremos una desviación local del número de velas descendentes y acendentes del 50%. Ya sabemos que, de media, existe aproximadamente el mismo número de velas ascendentes y descendentes, pero, de manera local, la preponderancia de un tipo de velas sobre las otras puede resultar muy distinta al 50%, tendiendo posteriormente al equilibrio. El algoritmo funcionará de la forma siguiente:

Algoritmo de trabajo general simplificado

  • escaneamos una ventana de N velas; 
  • comprobamos de qué tipo de velas hay más, descendentes o ascendentes;
  • si la preponderancia es superior al valor de umbral, entonces tendremos una señal de inicio de una serie de posiciones; 
  • más velas descendentes = señal Buy, más ascendentes = Sell;
  • calculamos el lote;
  • abrimos una nueva posición en cada vela posterior hasta que se active la condición para cerrar la serie; 
  • se activa la condición para cerrar la serie;
  • se cierran todas las posiciones;
  • buscamos una nueva señal.

Para mayor simplicidad, el algoritmo aplicará órdenes de mercado. El algoritmo utiliza solo los precios de cierre y todas las acciones se realizan después de que se forme una nueva vela. No es necesario analizar nada dentro de la vela. Solo necesitamos controlar los beneficios y los fondos actuales. Cualquier otro cálculo resulta innecesario.

Señal de apertura de posición

  1. Ventana de análisis. Establecemos el número de velas (ventana de análisis) para comprobar el porcentaje actual de velas descendentes y ascendentes. Analizar un número fijo de velas no es una buena idea, porque puede haber secciones más largas o más cortas con desviaciones del 50% o más. Por ello, deberemos establecer la ventana de análisis desde el número mínimo al máximo de velas ofreciendo prioridad a una mayor cantidad de velas, ya que un área pequeña puede formar parte de una grande, pero debe captar todo el rango. La ventana de análisis se configura con los parámetros "MinBars" y "MaxBars". El algoritmo busca la preponderancia de las velas descendentes o ascendentes en el rango de "MinBars" a "MaxBars". En cuanto se detecta, el algoritmo selecciona el número máximo de velas con un exceso de velas descendentes o ascendentes por encima del umbral.
  2. Porcentaje de umbral de preponderancia para abrir una posición. Debemos determinar qué porcentaje de preponderancia de posiciones descendentes o ascendentes se considera el umbral para la generación de señales. Podemos seleccionar este parámetro usando la optimización. En los ajustes, hemos creado el parámetro "OpenPerc". Este parámetro se da como porcentaje y constituye el porcentaje de apertura. Si el porcentaje de velas descendentes en la muestra es mayor o igual al porcentaje para la apertura, necesitaremos abrir una posición Buy. Si el porcentaje de velas ascendentes en la muestra es mayor o igual al porcentaje para la apertura, necesitaremos abrir una posición Sell. 
  3. Enumeración de rango. Necesitamos analizar las velas del rango con un cierto paso. Un paso extraño no resultará adecuado, ya que inevitablemente presentará la desviación del 50% que ofrece una señal de entrada falsa; por ello, el paso para verificar el rango se podrá encontrar en la configuración (parámetro Step). La enumeración del rango irá de menor a mayor.

Número máximo de posiciones en una serie

A la hora de comerciar, una posición se rellena con una serie de órdenes, por lo que debemos limitar el número máximo de posiciones. Para lograrlo, tendremos que calcular la cantidad de velas a las que la preponderancia puede igualar hasta alcanzar un 50%. Vamos a tomar la muestra que sirvió de señal al inicio de la serie (compuesta por "N" velas); se calcula el número de velas predominantes, se le resta el número de velas restante y se suma al número de velas en el muestra original, luego multiplicado por el coeficiente de corrección "K". El factor "K" está indirectamente relacionado con las características estadísticas del instrumento.

Así es como hemos obtenido el número esperado de velas, en el que debería desaparecer la desviación del 50%.

R=(N+NB-NM)*K
N - number of candles in the sample featuring an excess above the threshold
NB - number of dominant candles
NM - number of remaining candles
K - adjusting factor defined in the settings

A continuación, deberemos calcular el número máximo de posiciones que abrirá el robot. Para hacerlo, del número total de velas "R", deberemos restar el número de velas en la muestra inicial "N". El resultado será el número máximo de posiciones "E", que el robot no deberá superar al abrir las posiciones en la serie.

E=R-N
Е - maximum number of positions in the series
R - total number of candles, at which the return to 50% is planned

Este algoritmo aún no se autoadapta, pero hemos dado los primeros pasos para ello: el número de posiciones se ajusta partiendo del número de velas en la muestra inicial.

Selección del lote

El algoritmo se ha creado para comprobar un patrón. Por lo tanto, necesitaremos añadir varios ajustes para determinar el lote. Vamos a suponer que el tamaño del lote depende del número esperado de posiciones en la serie. Cuantas más posiciones haya en la serie, menor será el lote. Para lograrlo, añadiremos dos ajustes: "Depo" y "RiskPerc". Para simplificar, supondremos que 1000$ = 1 lote (500$ = 0,5 lotes). Tomamos el valor de la configuración de "Depo" y lo multiplicamos por "RiskPerc". Dividimos el valor obtenido por el número máximo de posiciones E y lo redondeamos hasta el valor correcto más cercano. Así es como obtenemos el tamaño del lote de una posición.

Asimismo, necesitamos añadir la función de aumento automático del lote si el depósito crece. En este caso, si el ajuste "Depo" = 0, el valor actual del depósito se multiplicará por "RiskPerc" y el lote para las posiciones de apertura se calculará usando el valor obtenido.

Cierre de posiciones

El cierre ocurrirá en varios casos:

1) El beneficio total de las posiciones abiertas ha alcanzado el valor establecido en la configuración "CloseProfit". Dado que el número de posiciones abiertas por el robot no es constante y el tamaño del lote puede cambiar, no sería correcto establecer un valor de beneficio fijo en dólares. Necesitamos que el beneficio en dólares dependa del número actual de posiciones abiertas y del lote total en el mercado. Para ello, deberemos introducir el concepto de "beneficio por lote".

En la configuración "CloseProfit", se indica el valor de beneficio para la posición total de 1 lote; el robot calcula de nuevo dicho valor para el número de lotes que ha abierto. Si se abren 10 posiciones a 0.01 lote, entonces el lote total será de 0.1. Entonces, para obtener el valor de beneficio para el cierre de una posición, necesitaremos Profit = "CloseProfit" * 0.1. Deberemos ajustar el beneficio para el cierre de posiciones cada vez que cambie el número de posiciones. Como resultado, cuando el beneficio total sea mayor o igual al valor de beneficio calculado, el robot cerrará las posiciones.

2) Cuando el porcentaje actual de preponderancia sea menor o igual que el valor "ClosePerc". En la configuración "ClosePerc", establecemos el porcentaje de preponderancia de las velas predominantes para generar una señal y cerrar una serie de posiciones. Cuando se abrió la primera posición, la preponderancia se detectó en el número de velas N. Ahora, con la aparición de cada nueva vela, el número de velas aumenta y se convierte en N+1; N+2; N+3, etcétera... Con la aparición de cada nueva vela, deberemos verificar el porcentaje actual de preponderancia de los bloques predominantes en la muestra con el número de velas aumentando en 1. Finalizar una serie tras cumplirse la condición.

3) Al alcanzar el valor "MinEquity". Si los fondos actuales han caído por debajo del valor establecido, deberemos finalizar la serie abierta y evitar abrir nuevas hasta que aumenten los fondos. Esta es una función Stop Loss que protege el depósito contra posibles pérdidas.

Simulación

El algoritmo es bastante primitivo. No se puede adaptar a las condiciones cambiantes del mercado y se usa solo para verificar la viabilidad de la idea. Por consiguiente, seleccionaremos la configuración utilizando la optimización. Realizaremos la optimización iterando todas las opciones, sin algoritmo genético. El asesor se desarrolló en 2014 y se hizo para MetaTrader 4. Primero lo podremos a prueba en GBPUSD H1. Estableceremos artificialmente un margen alto de 40, de forma que la optimización se realice en condiciones no ideales, garantizando así un cierto margen de estabilidad en el futuro. Se necesita un spread aumentado porque el asesor controla el beneficio actual en las posiciones abiertas y se ve influido por el spread.

Optimizaremos solo 3 condiciones: el número mínimo de velas "MinBars", el porcentaje para abrir posiciones "OpenPerc" y el beneficio por lote "CloseProfit". Supuestamente, cuanto mayor sea el número mínimo de velas para el análisis y mayor sea el porcentaje de apertura, más fiables (pero menos frecuentes) serán las señales. "CloseProfit" depende indirectamente de la volatilidad, por lo que, antes de realizar la optimización, deberemos observar la volatilidad del instrumento e indicar un rango adecuado. La optimización se realizará para un año, desde el 25.11.2019 hasta el 25.11.2020 en el marco temporal H1.

optimization GBPUSD

Figura 2. Resultados de la optimización

La optimización por fuerza bruta resulta necesaria para ver cómo afectan los parámetros al resultado y comprobar hasta qué punto coinciden los resultados con las suposiciones sobre cómo debería funcionar el algoritmo en teoría. La figura 2 muestra algunos de los resultados. Deberemos activar la clasificación según el beneficio máximo y seleccionar los ajustes que tengan los indicadores de reducción y rentabilidad más adecuados. Los ajustes resaltados parecen encajar.

Después de analizar con más detalle los resultados de la optimización, podemos ver que con el aumento de los valores "MinBars" y "OpenPercent", la rentabilidad disminuye, pero junto con ella, cae también el valor de la reducción. Luego tomamos los parámetros resaltados, probamos el año, obtuvimos los resultados y valoramos los cambios para ver si aumentaban/disminuían los valores "MinBars" y "OpenPercent". Llegamos a la conclusión de que, a medida que aumentan "MinBars" y "OpenPercent", el número de transacciones disminuye y la fiabilidad de la señal aumenta. Por consiguiente, debemos encontrar un equilibrio entre la rentabilidad y la reducción.

Para el trading, tomamos parámetros deliberadamente más conservadores para que hubiera un margen de seguridad para los eventuales cambios en la situación del mercado. La forma en que el robot abre posiciones se muestra en la figura 3 a continuación.

trade

Figura 3. Ejemplo de apertura de posiciones

La figura 3 muestra que, de ser necesario, una posición se compone de varias transacciones. La señal de entrada se alarga con el tiempo. La primera versión del algoritmo presenta una señal aproximada considerablemente alargada en el tiempo en algunos puntos. Podemos decir que se parece más a una entrada difusa que a un promedio estándar. Esta es un área con límites difusos en la que las velas descendentes son más probables que las ascendentes. Podemos sacar provecho de esta probabilidad.

El algoritmo sigue siendo fiable con "MinBars" = 70, pero lo hemos configurado en 80 para que haya un margen para las fluctuaciones en las características del instrumento comercial. La lógica resulta similar al seleccionar el parámetro "CloseProfit". En el ejemplo, es igual a 150. Si el valor fuera menor, el algoritmo se volvería más estable, pero el beneficio se reduciría. Si lo aumentamos a 168, el algoritmo ya no será fiable, por lo tanto, nos quedaremos con 150. Como resultado, hemos obtenido un gráfico de rentabilidad para un año como en la figura 4. El valor "CloseProfit no es más que la volatilidad promedio convertida en USD.

GBPUSD 2019 Chart

GBPUSD 2019 report

Figura 4. GBPUSD H1, 2019.11.25 - 2020.11.25

El tamaño del depósito de 10,000$ lo establecimos para la optimización. Además, cuando se realice la investigación, la cantidad se podrá optimizar. La prueba y la optimización se han realizado en el modo checkpoint, porque el algoritmo trabaja sobre los precios de cierre y no importa lo que pase dentro de la vela. Pero la figura 5 mostrará la prueba para el mismo periodo en el modo "todos los ticks".

GBPUSD tick 2019 Chart

GBPUSD tick 2019 report

Figura 5. GBPUSD H1, 2019.11.25 - 2020.11.25 modo "todos los ticks"

La figura 5 muestra que en el modo "todos los ticks", el beneficio incluso ha aumentado ligeramente, porque las pruebas son más precisas. La forma del gráfico de rendimiento se ha mantenido prácticamente sin cambios. En ambas pruebas se ha obtenido un excelente factor de beneficio de poco más de 5.

No sería correcto sacar conclusiones sobre la estabilidad del patrón basándonos en pruebas para un año optimizado, así que vamos a ver cuántos años dura el algoritmo con estos parámetros en el pasado. La figura 6 muestra el resultado de la prueba fuera del periodo optimizado.

GBPUSD 2001 Chart

GBPUSD report 2001

Figura 6. GBPUSD H1, 2001.01.01 - 2020.11.25

La figura 6 muestra el backtest desde 2001 con los mismos parámetros que obtuvimos durante la optimización de un año desde el 2019.11.25 hasta el 2020.11.25. La prueba muestra que la reducción ha aumentado solo un par de dólares en un intervalo de gran tamaño, mientras que el beneficio ha aumentado significativamente y el factor de beneficio ha crecido hasta 7.5. La prueba se realizó para un depósito de 3000$ sin refinanciamiento para comprender cómo se comporta el patrón durante largos periodos de tiempo. 

El hecho de que la optimización se haya realizado en un año, mientras que el algoritmo muestra un resultado estable durante 20 años, indica que el patrón es bastante estable y que los parámetros no se ajustan a la historia. Por algún motivo, la pareja GBPUSD no se desvía mucho de sus características estadísticas propias. 

Sería incorrecto sacar conclusiones basadas en la prueba de una pareja de divisas y un marco temporal único. Por consiguiente, analizaremos las pruebas para otra pareja, EURUSD. Al igual que en el caso anterior, la optimización se llevó a cabo en un año desde el 25.11.2019 hasta el 25.11.2020 en H1. Abordamos la selección de los parámetros de la misma forma que en el caso anterior. Los resultados se muestran en la figura 7.

EURUSD 2019 Chart

EURUSD 2019 report

Figura 7. EURUSD H1, 2019.11.25 - 2020.11.25

Como podemos ver en la figura 7, la rentabilidad en EURUSD es más baja que en GBPUSD, y la reducción es ligeramente mayor. El gráfico de rentabilidad muestra que hubo un sitio donde se abrieron muchas posiciones. Si ajustamos ligeramente los parámetros "MinBars" y "OpenPercent" , podemos reducir el número de posiciones y, en consecuencia, la reducción. Vamos a pasar al periodo a largo plazo. La figura 8 muestra la prueba de EURUSD desde el 2007.01.01 hasta el 2020.11.25.

EURUSD 2007 chart

EURUSD 2007 report

Figura 8. EURUSD H1, 2007.01.01 - 2020.11.25

El trabajo con EURUSD no es tan estable como con GBPUSD, y el periodo de trabajo estable en el pasado resultó ser 6 años menor. El resultado sigue siendo bueno. La optimización de los parámetros se llevó a cabo en un año y el trabajo estable duró casi 14 años. Este hecho nuevamente nos sugiere que los parámetros no solo se ajustaron a la historia, y que existe un patrón bastante estable en el instrumento comercial.

A continuación, debemos comprobar cómo se comporta el algoritmo en otros marcos temporales. Teóricamente, con una disminución en el marco temporal, la estabilidad debería reducirse, porque el tamaño de las velas en un marco temporal más bajo en relación con el spread disminuye significativamente. En consecuencia, habrá menos beneficios y más costes comerciales. Además, en marcos temporales más pequeños, el punto de entrada puede alargarse aún más en el tiempo, lo cual provocará la apertura de un mayor número de posiciones y, en consecuencia, grandes reducciones.

Vamos a realizar una prueba en el marco temporal M15 de GBPUSD. La optimización se realizará, como en el caso anterior, para un año, desde el 2019.11.25 hasta el 2020.11.25. Sin embargo, no vamos a mostrar el gráfico de optimización durante un año, mostraremos directamente el intervalo más grande posible que el algoritmo puede pasar sin problemas.

GBPUSD m15 chart

Figura 9. GBPUSD m15 2000.01.01-2020.11.25

La figura 9 muestra la prueba de GBPUSD M15 realizada desde el año 2000. Pero el número de señales de entrada y de posiciones es pequeño. Como hemos dicho antes, un marco temporal más bajo muestra menos estabilidad, y su configuración resulta muy conservadora. Rara vez se genera una señal de entrada, y la rentabilidad no es alta, pero resulta adecuada en relación a la reducción.

A continuación, realizaremos la prueba en el marco temporal más alto GBPUSD H4. H4 tiene pocas velas para optimizar. Por lo tanto, realizaremos la optimización en un segmento de dos años, desde el 2018.11.25 hasta el 25.11.2020. El resultado se mostrará en el intervalo máximo.

GBPUSD H4

GBPUSD H4 Report

Figura 10.  GBPUSD H4 2000.01.01-2020.11.25

En el marco temporal H4, se mostró un resultado estable en un intervalo de casi 20 años, desde el 2000.01.01 hasta el 2020.11.25. Como en los casos anteriores, la optimización consistió solo en encontrar un equilibrio entre beneficio y estabilidad. La configuración conservadora del marco temporal M15 funciona de manera muy estable en los marcos temporales H1 y H4, pero no tiene sentido ahí, porque las señales son poco frecuentes y la cantidad de transacciones es pequeña.

También podemos probar cualquier otro instrumento comercial. Para algunos, el algoritmo funciona mejor, para otros peor. Pero la tendencia se mantiene: la optimización durante un año nos permite trabajar de manera estable durante varios años. A continuación, mostraremos los resultados para GBPJPY, con un marco temporal H1. La optimización se llevó a cabo durante un año; mostramos el resultado en la figura 11.

GBPJPY chart

GBPGPY report

Figura 11. GBPJPY 2009.01.01 - 2020.11.25

Para GBPJPY, hemos podido pasar un backtest estable desde 2009. El resultado no es tan llamativo como en GBPUSD, pero lo principal es que funciona. 

Hemos añadido la capacidad de reinvertir los fondos ganados en el robot, y debemos usarla. Antes hemos mostrado varias pruebas con configuraciones conservadoras, pero ¿qué sucederá si creamos configuraciones muy agresivas y habilitamos un aumento en el lote? No nos gusta asumir riesgos elevados, pero queremos comprobar de qué es capaz el algoritmo. Realizaremos el test en GBPUSD desde el 2006.01.01 hasta el 2020.11.25 en el modo "todos los ticks". Podríamos personalizar otra herramienta. Reduciremos el spread hasta un valor de 20, que se encuentra ligeramente por encima del promedio. La figura 12 muestra el resultado del backtest durante casi 15 años.


GBPUSD max risk

Figura 12. GBPUSD desde el 2006.01.01 hasta el 2020.11.25 con ajustes agresivos

Como el lector recordará, el algoritmo usa los precios de cierre. Por consiguiente, este resultado no supone un "grial de prueba". Además, hemos establecido un margen adecuado de 20. El resultado del funcionamiento del algoritmo en el mercado real suele coincidir con el obtenido en el simulador. Nunca lo habíamos utilizado para comerciar con entornos tan agresivos. Además, en MetaTrader 4 resulta imposible tener en cuenta los spreads reales, por lo que no vamos a argumentar que habría pasado igualmente bien este periodo en el comercio real.

Análisis de los resultados

El robot ha resultado simple y sencillo de optimizar. Es importante que la optimización durante un corto periodo de tiempo y el uso de parámetros no óptimos de antemano le permitan permanecer estable durante varios años, y en ocasiones decenas de años. Esto nos indica que el patrón hallado no es accidental y que por alguna razón está realmente presente en el mercado. No obstante, el algoritmo de trabajo resulta bastante "rígido"; sus grados de libertad son mínimos y opera con parámetros rigurosamente especificados. Si la serie de precios va más allá de las capacidades del algoritmo, perderá su estabilidad de inmediato. 

Un hecho importante es que podemos usarlo en cualquier marco temporal, comenzando por un marco temporal cuyo tamaño de vela sea mucho mayor que el spread y las comisiones del instrumento. A medida que aumente el marco temporal, la estabilidad aumentará hasta el marco temporal diario. Pero también aumentarán los requisitos para el depósito, porque el tamaño de las velas se volverá significativo, lo cual provocará importantes reducciones en los fondos.

Podemos concluir que la suposición de que la serie de precios es similar a un paseo aleatorio solo de forma superficial (como describimos en nuestro primer artículo "Discretización de series temporales con generación aleatoria de "ruidos"") ha resultado correcta; la serie de precios contiene al menos un patrón oculto.

Por otra parte, conociendo y comprendiendo bien el patrón que nos permite obtener beneficios, podremos comenzar un trabajo de modernización serio.

Uso comercial

Un gran inconveniente del algoritmo actual es su baja rentabilidad en relación a los riesgos. Debemos ser honestos con nosotros mismos y comprender que existen riesgos (como en cualquier otro lugar). Pero mientras se desarrollan las mejoras, podemos comerciar con este robot. Para hacerlo, debemos aumentar su rentabilidad y mantener el nivel de reducción. Para ello, es necesario usar las características del algoritmo. Este rara vez genera señales para instrumentos comerciales y, por regla general, están significativamente espaciadas en el tiempo para los diferentes instrumentos comerciales. La mayoría de las veces no hay transacciones en el instrumento, y es necesario cubrir estos "tiempos de inactividad". 

Generalmente, no existe una correlación estable entre señales para los diferentes instrumentos. Debemos aprovechar esta característica para aumentar el beneficio mientras mantenemos el nivel de reducción.

Para aumentar la rentabilidad, debemos analizar varios instrumentos al mismo tiempo. Cuando aparezca una señal para uno de los instrumentos, abriremos posiciones en él. Si hay posiciones abiertas para un instrumento, entonces deberemos ignorar las señales al comienzo de una serie de otros instrumentos. Esto nos permitirá usar el tiempo de la manera más eficiente posible, aumentando el número de señales y, en consecuencia, incrementando proporcionalmente el beneficio. La reducción máxima se mantendrá al nivel de un instrumento.

Las señales para el comienzo de una serie están débilmente correlacionadas no solo entre instrumentos independientes, sino también entre los diferentes marcos temporales del mismo instrumento. Por consiguiente, utilizando 3 marcos temporales de un mismo instrumento a la hora de comerciar, podremos usar el tiempo de manera aún más eficiente y hacer posible situaciones en las que casi siempre haya posiciones abiertas en el mercado. El nivel de reducción se mantendrá en el mismo nivel, mientras que el beneficio aumentará significativamente.

Hemos hecho varias modificaciones para trabajar en cuentas reales:

1) Hemos añadido otros 9 instrumentos comerciales independientes, cada uno con sus propios parámetros. Por ello, podremos analizar y comerciar con 10 instrumentos comerciales a la vez. Asimismo, podemos optimizar los parámetros de casi cualquier instrumento en uno u otro grado, por lo que esta decisión es toalmente lógica.

2) La apertura simultánea de posiciones para varios instrumentos comerciales es limitada. Para ello, hemos añadido el parámetro "MaxSeries". Si establecemos el valor en 1, el comercio se realizará solo en 1 instrumento; si es 2, las posiciones se podrán abrir simultáneamente para dos instrumentos, y así sucesivamente. Esto permitirá al robot generar más a menudo señales para abrir posiciones, usando su "tiempo libre". El beneficio aumenta proporcionalmente y la reducción máxima se mantendrá al nivel de un solo instrumento.

El simulador de MetaTrader 4 no sabe cómo realizar pruebas de divisas múltiples, pero si comerciamos con más de un instrumento a la vez, es probable que la reducción aumente en proporción a la raíz cuadrada del número de instrumentos comerciados simultáneamente, siempre que no exista correlación entre las señales de diferentes instrumentos. Si esperamos una reducción de 1000$, cuando comerciemos con tres instrumentos simultáneamente, podremos esperar un aumento en la reducción al nivel de 1000$*raíz(3)=1732$.

3) Hemos añadido una limitación al número mínimo de fondos "MinEquity". Cuando se alcanza este valor, el comercio se detiene y las posiciones se cierran. Esto resulta necesario a la hora de planificar los riesgos de antemano y cumplir con estos.

4) Podemos usar el robot en varios marcos temporales a la vez para aumentar la rentabilidad. Según nuestras pruebas, las señales de apertura de posiciones suelen muestrar una correlación entre distintos marcos temporales, pero lejos del 100%.

Hemos usado este robot para comerciar simultáneamente en 25 parejas de divisas y dos marcos temporales (H1 y H4) con configuraciones conservadoras, logrando mantener un rendimiento del 10% mensual. Por otra parte, con configuraciones un poco más agresivas, hemos logrado un rendimiento del 15% mensual. Hemos tenido muchas transacciones.

Conclusiones y desarrollo posterior

  • Hemos encontrado un método comercial no estándar que no resulta obvio a primera vista;
  • El patrón básico seleccionado ha resultado ser universal y, de hecho, está presente en instrumentos comerciales de eficacia comprobada;
  • El patrón es simple y claro: debemos estudiar las razones de su aparición y desarrollar mejoras en la calidad de las señales;
  • El algoritmo está perfectamente optimizado y permanece estable durante mucho tiempo;
  • El punto de entrada se extiende largamente en el tiempo: necesitamos mejorar la localización de la señal en las posiciones abiertas;
  • Los factores no considerados terminan por influir negativamente en la estabilidad del algoritmo;
  • Necesitamos continuar el desarrollo de un modelo teórico para reducir el número de factores no considerados con cada nueva versión y, como resultado de ello, tener en cuenta todos los factores posibles que influyan en este patrón;
  • La próxima versión del algoritmo debería ser más flexible y comenzar a ajustar ligeramente sus parámetros a los cambios en el mercado.

En el próximo artículo, hablaremos de los mecanismos que desarrollamos para mejorar la estabilidad del algoritmo y de cómo dotamos a este de mayor flexibilidad.

Adjuntamos al artículo el código y la tarea técnica del robot.

Autor de la idea y la tarea técnica: Maxim Romanov. Código escrito por: Vyacheslav Ivanov.

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

Archivos adjuntos |
50p_V1.mq4 (100.93 KB)
Technical_task.zip (30.59 KB)
AAPL_GAZP_statistics.zip (12989.18 KB)
GBPUSD_statistics.zip (14471.42 KB)
Trabajando con los precios en la biblioteca DoEasy (Parte 60): Lista de serie de datos de tick del símbolo Trabajando con los precios en la biblioteca DoEasy (Parte 60): Lista de serie de datos de tick del símbolo
En este artículo, vamos a crear una lista para almacenar los datos de tick del símbolo único, después, verificaremos su creación y obtención de los datos requeridos en el Asesor Experto. Dichas listas —siendo aplicada cada una de ellas para cada símbolo usado— van a componer luego la colección de datos de tick.
Utilizando hojas de cálculo para construir estrategias comerciales Utilizando hojas de cálculo para construir estrategias comerciales
El artículo describe los principios y técnicas básicos que nos permiten analizar cualquier estrategia usando hojas de cálculo: Excel, Calc, Google. Asimismo, hemos comparado los resultados con el simulador de MetaTrader 5.
Trabajando con los precios en la biblioteca DoEasy (Parte 61): Colección de series de tick de los símbolos Trabajando con los precios en la biblioteca DoEasy (Parte 61): Colección de series de tick de los símbolos
Dado que el programa puede utilizar varios símbolos, entonces, es necesario crear su propia lista para cada uno de estos símbolos. En este artículo, vamos a combinar estas listas en una colección de datos de tick. En realidad, se trata de una lista común a base de la clase de la matriz dinámica de punteros a las instancias de la clase CObject y sus herederos de la Biblioteca estándar.
Redes neuronales: así de sencillo (Parte 8): Mecanismos de atención Redes neuronales: así de sencillo (Parte 8): Mecanismos de atención
En artículos anteriores, ya hemos puesto a prueba diferentes variantes para organizar las redes neuronales, incluyendo las redes convolucionales, adoptadas de algoritmos de procesamiento de imágenes. En el presente artículo, les proponemos analizar los mecanismos de atención, cuya aparición impulsó el desarrollo de los modelos de lenguaje.