Algoritmo de autoadaptación (Parte III): Renunciando a la optimización

7 abril 2021, 12:56
Maxim Romanov
0
277

Introducción

Antes de comenzar a analizar el presente artículo, le recomendamos leer el segundo artículo de la serie: "Desarrollando un algoritmo de autoadaptación (Parte II): Aumentando la efectividad". La metodología del artículo actual se distinguirá sustancialmente de todo lo analizado anteriormente, pero, para comprender el problema en general, nos resultará útil el conocimiento de los artículos anteriores de la serie.

Analizando los defectos

Como la última vez, comenzaremos analizando las deficiencias de la anterior versión exitosa. Durante el análisis, hemos identificado las siguientes deficiencias:

  • La señal de apertura y cierre de posiciones se genera usando como base el análisis de velas. Las velas son de tamaño inestable: algunas de ellas son grandes y otras son pequeñas. Con frecuencia, surgen situaciones en las que las posiciones se abren según la preponderancia de las velas ascendentes o descendentes, y luego las velas ascendentes o descendentes se igualan, pero el beneficio de las posiciones abiertas sigue siendo negativo. Entonces, nos hacemos la siguiente pregunta: ¿cerramos las posiciones o esperamos hasta obtener beneficio? Si cerramos, el sentido de la negociación se reducirá a la nada, y el algoritmo comenzará a obtener pérdidas. Si no cerramos, tarde o temprano esto provocará una reducción significativa.
  • El precio se mueve independientemente del tipo de velas. El mercado puede verse dominado por velas descendentes y el precio subirá porque las velas ascendentes tendrán mayor tamaño que las descendentes. Este momento resulta especialmente negativo cuando las posiciones están abiertas.
  • En sí misma, la predicción del futuro tamaño de las velas es una tarea que nadie puede resolver.
  • A veces, después de abrir posiciones, la preponderancia de un tipo de vela no disminuye durante mucho tiempo y el precio puede continuar moviéndose contra las posiciones abiertas. Esto provoca reducciones significativas. Además (y más importante), no podemos saber cuándo se invertirá el precio y si se invertirá en absoluto.
  • Las posiciones se abren a lo largo del tiempo. Hay momentos en que el precio se detiene durante bastante tiempo y las posiciones siguen abriéndose porque llegan velas nuevas. Estos momentos son especialmente peligrosos durante las vacaciones, como la Navidad, cuando la actividad comercial es baja y el algoritmo simplemente va abriendo posiciones debido al paso del tiempo.
  • Debemos optimizar los ajustes del algoritmo individualmente para cada instrumento comercial. El único motivo por el que se establecen estas configuraciones es porque funcionaron mejor en historia. Sí, hemos superado backtests desde hace 21 años, pero no para todos los instrumentos, y configurar los parámetros de acuerdo con la historia no es la mejor solución.
  • No resulta obvio por qué funciona mejor y es más estable para algunos instrumentos comerciales y mucho peor para otros.
  • No sabemos cuándo cambiará el comportamiento de un instrumento comercial de forma que el algoritmo sufra pérdidas. De hecho, no sabemos cuándo nos veremos en una situación de riesgo. Podemos calcular la probabilidad de un momento semejante, pero se tratará de un resultado muy aproximado.
  • No existe una teoría que explique cómo cambiará la naturaleza de un instrumento en el futuro ni por qué lo hará, por consiguiente, debemos usar previamente parámetros no óptimos para tener un margen de fluctuación en las características estadísticas de la serie de precios. Esto reducirá enormemente la rentabilidad.

Consideramos que todas las deficiencias anteriormente mecionadas son significativas. Podemos seguir modificando este algoritmo, o mejorando las características una a una, pero será más adecuado sacar lo mejor de él, es decir, ganar experiencia y empezar el desarrollo prácticamente desde cero. Tenemos que comenzar modernizando la base teórica.

El algoritmo debe ser completamente autoadaptable, por lo que lo desarrollaremos para los mercados de divisas y bursátiles. Para él, los instrumentos con los que se comercia no deberían suponer una diferencia. Esto es importante porque debemos comprender claramente en qué se diferencian algunos mercados de otros. Y si existe tal idea, tendrá sentido convertirla en un algoritmo. En esta ocasión, hemos usado la plataforma MetaTrader 5, porque tiene un simulador de estrategias más funcional, que además permite trabajar no solo con instrumentos FÓREX, sino también con instrumentos bursátiles.

Durante el desarrollo, deberemos cada vez responder a la pregunta: ¿por qué un parámetro en particular tiene exactamente ese valor? Hablando en términos ideales, el motivo por el que establecemos cualquier valor en la configuración debe estar justificado.

Convirtiendo un gráfico de velas en un tipo diferente

En la nueva versión, dejaremos de utilizar velas debido a los parámetros inestables de estas. Para ser más exactos, usaremos velas, pero en el marco temporal M1 y solo porque el cambio al procesamiento de ticks provoca un aumento significativo en el consumo de recursos. En términos ideales, resulta mejor manejar los ticks.

Analizaremos bloques con un tamaño de N puntos. Son bloques parecidos a renko, pero construidos con un algoritmo ligeramente distninto. Ya hablamos sobre los gráficos de bloques y sus ventajas al realizar análisis en el artículo "¿Qué son las tendencias y cómo es la estructura de los mercados: de tendencia o plana?".

Block

Figura 1. Aspecto del gráfico de bloques

La figura 1 muestra el aspecto de los bloques que analizaremos. A continuación, mostramos una vista general del gráfico de bloques. La parte superior representa los bloques en el gráfico de precios. Los bloques se construyen en el pasado y en el futuro partiendo de un tiempo fijo. En la figura, el tiempo registrado se representa con una barra vertical amarilla. Este es el punto cero, desde el cual se construyen los bloques en el pasado y en el futuro; el algoritmo de construcción resulta ser un espejo. El hecho de que los bloques se construyan en el pasado y el futuro resultará importante en el desarrollo posterior.

Necesitamos los bloques porque sus parámetros principales son estables, controlables y, lo más importante, los beneficios/pérdidas dependen principalmente del movimiento del precio en puntos.

Modelo de mercado

El patrón básico será similar al que usamos en los algoritmos anteriores, es decir: la desviación local del número de bloques desciendentes respecto al número de bloques ascendentes y el posterior retorno a un cierto equilibrio. El patrón es estadístico, por lo que debemos comenzar analizando las características estadísticas de los gráficos de bloques. Con este objetivo, desarrollamos el indicador especial Max_distribution, que ya analizamos con detalle en el artículo "¿Qué son las tendencias y cómo es la estructura de los mercados: de tendencia o plana?"

Si explicamos brevemente la tarea del indicador, diremos que mide las características estadísticas de una serie de precios dividida en bloques. Podemos mostrar información en la pantalla simultáneamente para varios tamaños de bloque. Por ejemplo, nos interesan las características estadísticas de los gráficos con un tamaño de bloque de 10 a 1000 puntos. El tamaño de bloque mínimo se establece en los ajustes del indicador; luego los bloques de todos los demás tamaños se obtienen usando el factor de multiplicación.

El principal modo de funcionamiento del indicador consiste en medir el número de bloques en los que el precio se mueve verticalmente en N saltos.

blocks vertically

Figura 2. Ejemplo de medición vertical del número de bloques en 24 pasos

La figura 2 muestra un ejemplo. Mide cuántos bloques verticales ha superado el precio en N saltos. Así se recopila el número necesario de muestras (por ejemplo, 100) y luego se encuentra el valor promedio. Un tipo similar de análisis se realiza para los bloques de diferentes tamaños.

distribution

Figura 3. Amplitud promedio para diferentes tamaños de bloque

La figura 3 muestra un ejemplo de distribución vertical de la amplitud promedio en bloques con 24 saltos. Cada barra del histograma representa el valor de la amplitud promedio para su tamaño de bloque. Número de muestras = 1000. Las medidas a la izquierda son para el tamaño de bloque más pequeño, las de la derecha, para el más grande. Para un tamaño de bloque de 0,00015 en 24 saltos y 1000 muestras, el precio atraviesa un promedio de 5,9 bloques verticalmente. Para un tamaño de bloque de 0,00967 para los mismos 24 saltos y 1000 muestras, el precio se desplaza verticalmente un promedio de 4,2 bloques.

La línea roja muestra el valor de referencia que tendríamos si la serie de precios fuera un paseo aleatorio. Para 24 saltos, este valor es de 3.868 bloques verticales. El valor de referencia se calcula usando el método combinatorio y podemos representarlo claramente en el recuadro de la figura 4.

probability table

Figura 4. Cálculo de la referencia para 24 saltos.

En la figura 4, mostramos el cálculo del valor de referencia del número de bloques en vertical que superará el precio como promedio en 24 saltos, si se trata de un paseo aleatorio. En la última columna, este valor se convierte en una potencia. Podemos decir que la amplitud media del paseo aleatorio tiende al valor 24^0,4526. Para cada número de saltos, podemos volver a calcular la referencia. Adjuntamos al artículo el recuadro en formato .xlsx.

Hemos realizado una investigación sobre varios instrumentos comerciales: aproximadamente 35 parejas de divisas, más de 100 acciones, 10 criptomonedas y aproximadamente 10 instrumentos de materias primas. No existen desviaciones importantes. En general, la imagen es más o menos similar para todos los instrumentos. La amplitud promedio oscila de 7 en las criptomonedas de crecimiento rápido a 3.8 en las parejas de divisas. Algunas acciones de baja liquidez pueden incluso caer por debajo de 3.8.

Hemos obtenido un valor de amplitud promedio de 24 saltos o de algún otro número de saltos, pero ¿qué significa esto? Vamos a representar el gráfico como una sinusoide convertida en bloque, igual que en la figura 5.

Sinus

Figura 5. Sinusoide en forma de bloque

Dejaremos tal tamaño de bloques que haya 24 saltos en la mitad del periodo de la sinusoide. Entonces el periodo será de 48 saltos. Si medimos la amplitud promedio en 25 muestras de 24 saltos, obtendremos una amplitud promedio de 10,33 bloques en 24 saltos. Con un aumento en el número de muestras, la amplitud promedio tenderá a 12, o al número de saltos dividido por 2. La serie de precios no supone una sinusoide, pero nos conviene más operar en una sinusoide. Ahora, si al medir la amplitud promedio, obtenemos un valor superior a 12, el tamaño de los bloques no será lo suficientemente grande y 24 bloques no cabrán en la mitad del periodo. Un valor inferior a 12, sin embargo, nos indicará dos razones: los bloques son demasiado grandes o el movimiento de la tendencia en la serie de precios no es tan lineal como en la sinusoide. Ahora no estamos analizando la inclinación de la tendencia; eso lo haremos más tarde.

Según las lecturas del indicador Max_distribution que hemos desarrollado, podemos valorar cómo de semejantes son la serie de precios y una sinusoide. Para hacerlo, analizaremos en la figura 6 el aspecto del histograma del indicador para una sinusoide.

distribution2

Figura 6. Dependencia de la amplitud promedio respecto al tamaño del bloque para una sinusoide.

En la figura 6, podemos ver que con bloques pequeños, el precio se mueve verticalmente en 24 saltos de 24 bloques. Pero, con un aumento en el tamaño del bloque de 24 saltos, el precio pasará por un número cada vez menor de bloques, y después, cuando el tamaño del bloque se vuelva comparable a la amplitud de las fluctuaciones, el número de bloques descenderá verticalmente hasta cero. En el gráfico de la figura 3, no observamos tal imagen; ahí, el valor máximo fue 5.9 y tendió a la referencia 3.868. Esto significa que podemos representar la serie de precios como una sinusoide, pero llena de ruidos, conteniendo siempre un cierto componente de tendencia en algunas escalas. En otras palabras, el mercado siempre debe tener la escala en la que se encuentra ahora el flat (la probabilidad de un viraje es mayor que la probabilidad de la continuación de la tendencia) y la escala en la que se encuentra la tendencia ahora (la probabilidad de continuación es mayor que la probabilidad de un viraje).

El lector podrá ver por qué hemos adoptado esta definición de tendencia y flat en uno de los artículos anteriores "¿Qué son las tendencias y cómo es la estructura de los mercados: de tendencia o plana?".

Utilizando el indicador Max_distribution, hemos medido el número promedio de bloques a lo largo de la vertical para diferentes instrumentos comerciales, no solo en 24 saltos, sino también para otros valores del número de saltos. En la figura 7, mostramos un ejemplo.

multysample

Figura 7. Dependencia de la amplitud promedio respecto al número de saltos en la muestra

En la figura 7, las columnas blancas muestran la amplitud de movimiento medida para los valores de un número de saltos de 10 a 120, con un salto de 2 y 1000 muestras para cada medición. Las líneas rojas muestran el valor de referencia para el número de saltos dado. Como podemos ver, al aumentar el número de pasos, no se observan desviaciones significativas respecto a la tendencia principal. La forma general de la curva de los valores medidos es similar a la de la referencia. Las mediciones se realizaron para GBPUSD, pero también hemos investigado para otros instrumentos. Hay muchos instrumentos comerciales cuyos valores de histograma son superiores a la referencia, pero la tendencia general persiste y puede ser descrita usando una ecuación no lineal.

Ya sabemos que no puede haber patrones simples estables en el mercado. Esto significa que la escala en la que se encuentra la tendencia y el grado de la tendencia cambian todo el tiempo. En este caso, además, las escalas con flat también se convierten en tendencia.

Vamos a tomar la amplitud promedio para 24 saltos de la figura 7, este valor será 3.86. Asumiremos que, por analogía con una sinusoide, el movimiento constará de una tendencia y un flat. Luego, podremos calcular cuál será la parte de tendencia para una amplitud promedio. Para hacer esto, redondearemos: 3,86*2=7,72 bloques verticalmente en 24 saltos hasta 8, porque los bloques solo pueden ser enteros. Si llegamos al área de tendencia, el precio se moverá 8 bloques verticalmente en 24 saltos. Sí, el precio puede pasar 24 bloques verticalmente en 24 saltos, nada se lo impide, pero luego quedará claro por qué esto no resulta importante.

Ha resultado que en el área de tendencia, el precio pasa por 24 saltos 8 bloques en vertical. Esto significa que habrá un movimiento en el que tendremos 16 bloques en una dirección y 8 bloques en la contraria. También sabemos que a una parte tendencia le debe seguir una parte de flat para que la amplitud promedio permanezca estable (y resulte lo suficientemente estable en un gran número de muestras). Pero el mercado no es una sinusoide y, como podemos ver en la figura 7, al aumentar el número de saltos, aumenta en vertical el número de bloques. Por consiguiente, asumiremos que la desviación respecto a la media que ocurra en menos saltos volverá a la media en más saltos.

Utilizando el gráfico de la figura 7, vamos a ver cuánto debería pasar el precio de media en 26, 28, 30, 32, 34 saltos:

26 saltos = 3.98; 28 saltos = 4.11; 30 saltos = 4.2; 32 saltos = 4.36.

En 24 saltos, el precio ya ha pasado 8 bloques en vertical, pero en 28 saltos, de media, debe pasar 4.1 bloques en vertical, redondeando, obtenemos un número entero = 4. Esto significa que en los siguientes 4 saltos será posible un retroceso del movimiento anterior del cuarto bloque. El mercado no es tan predecible; tampoco resulta probable que los eventos se desarrollen según este escenario. En el mismo gráfico de la figura 7, podemos descubrir que el precio supera los 8 bloques verticalmente en un promedio de 116 saltos.

rollback 1

rollback 2

Figura 8. Posibles variantes del desarrollo de eventos

La figura 8 muestra 2 escenarios para el desarrollo de eventos. Estas son 2 variantes extremas, es decir, poco probables, y se muestran para la visualización. Lo más probable es que los eventos se desarrollen según uno de los escenarios intermedios. Pero ahora es importante que se sepamos cuánto debe desplazarse el precio de media por cada número de saltos. Podemos ver que cuanto más nítido sea el viraje, más profundo será, pero cuanto más superficial sea este, menor será su profundidad.

En última instancia, el intervalo de movimiento tenderá a su valor medio. Para 24 saltos, será de 3.8 bloques verticalmente, y para 116 saltos, de 8 bloques verticalmente.

Así es como se construye un modelo que permite, usando como base los parámetros del movimiento de la tendencia y el comportamiento posterior del precio, calcular el retroceso concreto específicamente para cada instrumento comercial. Cuanto más brusco sea el movimiento de la tendencia y más rápido sea el retroceso, más profundo será este. Cuanto menor sea la tendencia y mayor sea el retroceso, menor será la profundidad del mismo. Ahora podemos expresar todo esto en números, tomando como base las características estadísticas del instrumento.

rollback

Figura 9. Ejemplo de movimiento de tendencia y profundidad de retroceso

La figura 9 muestra qué aspecto tiene esto en un gráfico real. Podemos ver que ha habido un movimiento brusco y un retroceso brusco a la izquierda, mientras que la profundidad del retroceso ha resultado ser superior al 60%. A la derecha, vemos un movimiento más suave y un retroceso prolongado, lo cual ha dado como resultado un retroceso del 30%. Esto ha sucedido porque en la figura de la derecha el precio pasó por un mayor número de saltos y su amplitud aumentó durante la formación del movimiento.

Podemos explicar las razones de este comportamiento no solo por el hecho de que la serie de precios tenga una amplitud promedio y se ajuste a dicha magnitud, sino también por el hecho de que los movimientos bruscos sean causados ​​por una fuerte entrada/salida de capital hacia un activo con unas cantidades que superan sustancialmente la liquidez actual. Después de abrir una posición por una gran cantidad, deberemos cerrarla. En este caso, no importa a quién pertenezca el volumen de fondos: a un participante o a varios. Si cerramos inmediatamente la posición por el monto total, entonces el precio volverá al nivel original, es decir, el viraje será del 100%. Pero si cerramos la posición gradualmente, considerando la liquidez entrante, una cantidad mayor provocará un movimiento menor. Cuanto más rápido salga el jugador de la posición, más fuerte será el retroceso del movimiento que creó con su capital.

Es importante que el patrón sea confirmado por las características fundamentales de la fijación de precios. 

El presente punto no describe la teoría completa, pero es suficiente para comenzar a desarrollar el algoritmo; el resto lo iremos describiendo a medida que avancemos.

Seguimiento de la tendencia

Al igual que en los algoritmos anteriores, el robot comerciará con el movimiento en contra de la tendencia y la posición se llenará con una serie de órdenes. El algoritmo generará una señal para abrir una serie y su tarea consistirá en determinar el punto de entrada con la mayor precisión posible. Hablando en términos ideales, cuanto mayor sea la frecuencia con la que se genera la señal al comienzo de la serie, más beneficio podremos obtener por unidad de tiempo. Esto significa que la señal debe ser frecuente y de calidad.

El robot analizará el número de bloques descendentes y ascendentes. Si encuentra una desviación significativa en el número de bloques ascendentes respecto al valor normal, generará una señal para una serie de posiciones de venta. Para los bloques descendentes, es lo mismo, solo la desviación de los bloques descendentes generará una señal para una serie Buy.

Ahora vamos a desarrollar un algoritmo básico que modificaremos posteriormente, por lo que sus módulos deberían ser flexibles. Como base para la señal al comienzo de la serie, tomaremos el porcentaje de umbral de la preponderencia de los bloques descendentes/ascendentes. Estableceremos el número de bloques a analizar en un rango que va del valor mínimo al máximo, como en los algoritmos anteriores, solo que haremos esto para otros fines.

Umbral de porcentaje para el inicio y la finalización de la serie

Como el análisis usa un intervalo de bloques (por ejemplo, 24-34), tomar un porcentaje de umbral fijo para cada número de bloques sería una decisión incorrecta. La probabilidad de que ocurra una combinación de 24 bloques con una preponderancia del 75% de bloques predominantes no es igual a la probabilidad de que ocurra dicha combinación para 34 bloques. Es necesario que la probabilidad de aparición de combinaciones sea la misma, lo cual implica que deberemos usar un porcentaje de umbral dinámico, y esto depende de la probabilidad de aparición de esta combinación.

En los ajustes, estableceremos el porcentaje de umbral según la probabilidad de entrada en el rango, y luego deberemos volver a calcularlo para el número requerido de bloques. La probabilidad de entrada en el rango se calcula usando las reglas de la combinatoria, por lo que hemos desarrollado un recuadro según el cual la probabilidad se puede convertir en un porcentaje de umbral para cada número de bloques. 

probability table

Figura 10. Recuadro de probabilidad 

En la figura 10, mostramos un recuadro con el que se recalcula la probabilidad de alcanzar el rango como un tanto por ciento para la apertura. En el recuadro, se asume que el 100% de los movimientos se encontrarán en el rango de 0 a 16 bloques en vertical en 16 saltos. La probabilidad de alcanzar el rango del 2.1% (para el recuadro en la figura 10) implica que solo el 2.1% de todos los movimientos pasarán verticalmente en 16 pasos de 10 a 16 bloques. En los ajustes, estableceremos la probabilidad de entrada en el rango, por ejemplo, un 2.2, y el algoritmo buscará el valor más cercano menor o igual a 2.2 según el recuadro; a continuación, tomará el porcentaje correspondiente a este valor, en este caso, 81.25%. Entonces, cada número de bloques tendrá su propio porcentaje de umbral. Adjuntamos al artículo el recuadro en formato .xlsx.

En las versiones anteriores, las posiciones se cerraban cuando el beneficio total de una posición abierta superaba el umbral. Esta no es la mejor solución, ya que conlleva muchos problemas. Como en esta versión estamos trabajando con bloques de tamaño fijo, podremos cerrar las posiciones cuando el porcentaje de preponderancia descienda hasta el valor deseado. Si abrimos posiciones con un número fijo de bloques, durante el funcionamiento aumentará el número de bloques en la muestra. 

El porcentaje de umbral para el cierre también se calcula usando la probabilidad de entrada en el rango. Pero la probabilidad de entrada en el rango tiene una escala inversa. Este es un punto sin importancia, simplemente lo implementamos así. En el recuadro, se resalta una columna aparte para calcular el porcentaje de cierre. Supongamos que queremos cerrar las posiciones cuando el valor sea superior o igual a 75. Entonces, el valor más próximo será superior a 75. Para 16 bloques, esto será 78,9, que se corresponde con un porcentaje de cierre de umbral = 62,5%. 

Durante el funcionamiento, el número de bloques de la muestra aumenta porque nuevos bloques se van cerrando. Por consiguiente, siempre que las posiciones estén abiertas, el porcentaje a cerrar en cada nuevo bloque se recalculará para un mayor número de bloques.

En el supuesto punto de cierre con beneficios, estableceremos un take profit para todas las posiciones en la serie. Así se implementa el algoritmo para controlar la magnitud del retroceso según el estado actual del mercado. Cuantos más bloques de la muestra se hayan formado tras el inicio de la serie (movimiento de tendencia), menor será el valor de retroceso obtenido.

Esta implementación de los porcentajes de umbral no es ideal: la desarrollamos al comenzar a diseñar el algoritmo. En el futuro, modernizaremos esta técnica y todos los valores de los porcentajes de apertura y cierre se corregirán en función de la medición de la amplitud promedio para un número determinado de bloques. La versión actual no tiene en consideración que las características de la serie de precios son asimétricas para un mercado alcista y bajista. Podemos descuidar este punto en el mercado FÓREX, pero para el mercado de valores, este aspecto (considerado esencial) se tendrá en cuenta en versiones posteriores del algoritmo.

Ya hemos desarrollado la metodología del porcentaje de umbral, por lo que podemos responder a la pregunta (sin utilizar la optimización): ¿qué porcentaje de umbral debemos utilizar? Para ello, hemos desarrollado una fórmula:

%open

  • Nb - es el número de bloques a analizar;
  • aa - es la amplitud promedio según las lecturas del indicador para un número determinado de bloques;
  • Ka - es el coeficiente de multiplicación de la amplitud media. Para una sinusoide, será un coeficiente de 2, pero para el mercado, necesitaremos personalizarlo de forma que podamos aumentarlo un poco;
  • Kc - es el coeficiente de multiplicación de la amplitud media para calcular el porcentaje de cierre;
  • %open - es el porcentaje de umbral del inicio de la serie.

Podemos implementar este proceso solo para un número de bloques, el resto se puede recalcular usando el recuadro de probabilidad.

El porcentaje de cierre también se puede calcular de antemano según las lecturas del indicador.

%close;

La fórmula para calcular el porcentaje de cierre parece la misma: solo utilizamos un coeficiente de multiplicación Kc diferente. Es mejor hacerlo igual a 1, pero debemos prever la posibilidad de una corrección.

Usando como base el análisis de una amplitud promedio igual a 3.8, podemos establecer un porcentaje umbral de apertura para 24 bloques igual al 66.67%, y recalcular para el resto de los valores usando el recuadro de probabilidad.

Seguimiento de la tendencia

Como hemos escrito anteriormente, el mercado no tiene patrones estables y una amplitud estable de fluctuaciones. Y analizar el grado de tendencia en un número fijo de bloques con un tamaño fijo resulta cuestionable. La ventana de análisis debe ser dinámica y ajustarse en tiempo real. Vamos a permitir que el número de bloques para el análisis se establezca en el rango de 24 a 28. 

Respondemos de inmediato a una pregunta necesaria: ¿por qué la ventana de análisis es exactamente de 24 a 28 bloques? Estos valores se seleccionan en función de una amplitud media = 3,8 y dependen del porcentaje de umbral de apertura/cierre. Con este número de bloques, después de la señal al inicio de la serie, obtendremos 4 bloques de beneficio. Cuantos más bloques haya en la ventana para el análisis, mayor será la precisión de funcionamiento del algoritmo. No existe una diferencia fundamental en el número de bloques de beneficio que obtendremos: 4 o 10, si el tamaño del bloque se cambia proporcionalmente. Pero como las posiciones se abrirán en cada nuevo bloque, su número crecerá conforme aumente la precisión del funcionamiento, y esto no tendrá un efecto muy positivo en los resultados. 

A continuación, deberemos determinar el tamaño de bloque mínimo que tiene sentido analizar. Los bloques se construyen según las velas de minuto formadas. La frecuencia mínima de muestreo será de 1 minuto. No podemos hacer que los bloques sean demasiado pequeños, porque entonces comenzarán a construirse dentro de la vela, y no tendrá sentido realizar tal análisis. Por consiguiente, determinaremos el tamaño mínimo del bloque según el tamaño de las velas. Para hacerlo, podemos utilizar el indicador ATR durante un periodo prolongado, por ejemplo, 1440 minutos (un día) o más, y multiplicar su valor por el valor del coeficiente. Un coeficiente de 2 a 5 debería resultar aceptable, pero dependerá de las características del instrumento comercial.

Si el tamaño de las velas resulta muy desigual, será mejor utilizar un coeficiente mayor. El segundo criterio serán las comisiones y el spread. El beneficio obtenido por 4 bloques debería ser sustancialmente superior a las comisiones que pagaremos. Cuanto menor sea el tamaño del bloque, con mayor frecuencia se darán las señales al comienzo de la serie y más beneficios podremos obtener. Aquí necesitaremos encontrar un equilibrio. Como resultado, el tamaño mínimo del bloque dependerá del tamaño de las velas y las comisiones. Existen criterios claros para seleccionar el tamaño mínimo de bloque.

El método descrito para seleccionar el tamaño del bloque es suficientemente bueno tanto desde un punto de vista teórico como desde un punto de vista práctico. Así exactamente lo implementamos, pero ahora hemos desarrollado un mecanismo mejorado, basado en un modelo de mercado mejorado. La explicación del nuevo mecanismo requerirá un artículo aparte, por lo que en este artículo nos limitaremos a analizar la técnica descrita anteriormente.

Si el robot analiza un número fijo de bloques con un tamaño fijo, entonces no resultará rentable, porque los parámetros del mercado siempre están cambiando, y las tendencias del mercado tienen diferentes tamaños y retrocesos, por lo que necesitaremos un mecanismo adaptativo.

El robot analizará los bloques con el tamaño mínimo, pero cuando localice un área de tendencia pequeña con un porcentaje de preponderancia superior al umbral, deberá determinar la escala máxima para la presencia de una tendencia. Para lograrlo, necesitará escanear un área más grande. Como el número de bloques para el análisis es fijo, deberemos aumentar el tamaño de los bloques y ver qué sucede en un tamaño de bloque más grande. Hemos asignado el nombre TF1 al tamaño de bloque mínimo por analogía con el marco temporal. Este es un marco temporal de bloque sintético. Obtendremos los bloques más grandes usando un coeficiente de multiplicación, KTF, por ejemplo, de 1,1.

1. Señal de inicio de la serie

Debemos introducir el concepto de marco temporal básico (en adelante, siempre que hablemos de marcos temporales, nos referimos a marcos temporales de bloque). El marco temporal básico es aquel en el que se ha encontrado la señal al inicio de la serie.

El algoritmo debe crear varios marcos temporales de bloque adicionales y buscar la señal para el inicio de una serie de marcos temporales más altos. 

Para un coeficiente KTF=1.1, bastará con mirar los próximos 5 marcos temporales, por lo que el tamaño de bloque del mayor marco temporal será 1.6 veces superior al mínimo. Si se detecta una señal para el comienzo de la serie en uno de los marcos temporales más altos, el algoritmo cambiará a este marco temporal y lo hará básico. Una vez hayamos encontrado un nuevo marco temporal básico, deberemos crear nuevamente 5 marcos temporales de tamaño superior y repetir el proceso de escaneo. Así encontraremos el marco temporal máximo con una preponderencia por encima del umbral.


work

Animación 1.

En esta etapa, la tarea consistirá en encontrar el marco temporal máximo en el que existe una señal para el comienzo de la serie, y convertir dicho marco temporal en básico. En la animación 1, mostramos con un ejemplo cómo funciona esto. Podemos ver que el algoritmo escanea bloques pequeños y, cuando encuentra una señal, aumenta el tamaño del bloque y selecciona el marco temporal básico con el máximo tamaño de bloques. Luego calcula el retroceso para cerrar posiciones, pero ya para la tendencia más grande que ha podido determinar.

En este punto, es importante que usemos un rango de número de bloques, en lugar de un valor fijo. En el ejemplo, la señal se busca en un rango de 24-28 bloques. Consideraremos prioritaria la muestra con un gran número de bloques. Si encontramos una señal tanto en 24 bloques como en 28 bloques, entonces los 28 bloques se convertirán en la muestra básica. Lo mismo ocurre en los marcos temporales adicionales: buscamos la señal en el rango de 24-28 bloques. Vamos a considerar prioritario el marco temporal con un gran tamaño de bloques, y dentro de este marco temporal, le daremos prioridad a la muestra con un gran número de bloques.

Necesitamos este mecanismo porque al construir los bloques, existe cierto margen de error. Un marco temporal con un gran tamaño de bloque no siempre cubre un rango de datos más grande.

size error

Figura 11. Error de construcción de los bloques

La figura 11 muestra que 10 bloques de gran tamaño pueden abarcar menos datos que 10 bloques de tamaño menor. Para minimizar este efecto, el rango del número de bloques para análisis será 24-28. El robot podrá pasar a un marco temporal básico mayor y aumentar el número de bloques en la muestra. Entonces le resultará más fácil pasar a un marco temporal aún mayor con menos bloques en la muestra.

Vamos a responder a la pregunta: ¿por qué exactamente KTF = 1.1? Cuanto menor sea el coeficiente de multiplicación, con mayor precisión funcionará el algoritmo, pero más marcos temporales necesitará ver al mismo tiempo. Para que el tamaño del bloque aumente 1,6 veces en relación con el marco temporal básico, deberemos ver solo 5 marcos temporales. Si establecemos KTF = 1.05, ya tendrá que mirar 10 marcos temporales, y esto supone una carga computacional adicional. Pero cuanto menor sea el coeficente de multiplicación, con mayor precisión funcionará.

2. Retraso en la apertura de posiciones

Hemos encontrado una señal para el inicio de la serie, pero si comenzamos a abrir posiciones ahora, el resultado será una autoadaptación dudosa y débil. Puede que el precio continúe moviéndose en la misma dirección y es probable que lo haga. Debemos asegurarnos de encontrar la escala máxima y de que la tendencia haya terminado. Para ello, será necesario que en el siguiente marco temporal a partir del básico no haya señal al comienzo de la serie, y también que el algoritmo no pueda aumentar el marco temporal básico. La señal para el inicio de una serie en el marco temporal más alto actualmente está ausente, pero los bloques del marco temporal mayor abarcan un rango de datos más grande y se desplazan hacia el pasado en relación con el comienzo de la tendencia.

Después de determinar el marco temporal básico, debemos darle tiempo al precio para formar una señal en el marco temporal más alto. El precio deberá recorrer una distancia suficiente para poder avanzar a un marco temporal mayor. Y solo si ha pasado el tiempo suficiente para que se forme una señal en el marco temporal superior, pero la señal no se ha formado, podremos abrir una posición. Primero resolvimos este problema, como describiremos en el punto (a), y luego mejoramos significativamente el mecanismo, con lo que también mejoraron mucho los resultados; describiremos esto en el punto (b).

a) Retraso a lo largo del área de tendencia

Los bloques del marco temporal superior, por lo general, se adentran más en la historia que los bloques del marco temporal básico. Esto significa que deberemos esperar hasta que los bloques de 24 a 28 del marco temporal superior encajen en el mismo rango histórico que los bloques de 24 a 28 del marco temporal básico. Tenemos que realizar la comprobación en cada vela nueva.

delay a

Figura 12. Retraso en la apertura de posiciones para pasar a un marco temporal superior

La figura 12 muestra que hemos tenido que esperar 2 minutos para que los bloques de mayor tamaño encajaran en el rango temporal que ocupaban los bloques de menor tamaño. Si hay un retraso y durante el retraso en uno de los marcos temporales mayores (varios de ellos se ven simultáneamente) se detecta una señal al comienzo de la serie, entonces el marco temporal básico aumentará y el retraso se repetirá. Si, después de finalizar el retraso, el algoritmo no ha podido desplazarse a un marco temporal superior, significará que hemos encontrado la escala de tendencia máxima y podremos abrir una posición.

En general, la técnica funciona, pero está lejos de ser ideal. La hemos implementado en una versión temprana del algoritmo, cuyas pruebas mostraremos, por eso hemos destacado su funcionamiento. Durante el proceso de modificación, desarrollamos un algoritmo de retraso mejorado que describimos en el párrafo (b).

b) Retraso en función de las características estadísticas del instrumento

El objetivo de este método es similar al que persiguíamos en el punto (a). Necesitamos que los bloques del marco temporal superior abarquen la misma área de tendencia que los bloques del marco temporal básico.

En este método, usaremos las características estadísticas del instrumento comercial para determinar cuándo termina el retraso. Durante el retraso, es importante que el algoritmo determine la finalización de la tendencia, o que se desplace a un marco temporal superior o que abra una posición. Por consiguiente, la mejor solución sería usar los bloques del marco temporal superior para calcular el tiempo de retardo. Como ya hemos tenido en cuenta las principales características estadísticas de un instrumento comercial en el porcentaje de de umbral %open, lo usaremos para determinar la duración del retraso.

Primero, determinamos cuántos bloques se mueve verticalmente el precio al recibir una señal al comienzo de la serie, denominada Vb en la fórmula. Luego, partiendo de los tamaños de bloque del marco temporal básico y del tamaño de bloque del siguiente marco temporal, encontramos cuántos bloques del marco temporal más alto deben moverse verticalmente para formar todos los bloques Vb del marco temporal más alto; obtenemos el valor Nd. Después de eso, sabiendo que el precio, por lo general, no se desplaza de una forma estrictamente vertical y conociendo la naturaleza del movimiento, debemos calcular el número de bloques de retraso del marco temporal Nbd más alto.

formula dalay;

  • Vb — es el número de bloques predominantes para el inicio de la serie;
  • mnb — es el número mínimo de bloques del rango para el análisis. Si el rango es 24-28, entonces serán 24 bloques;
  • Nd — es el número de retraso;
  • Bsd  — es el tamaño de bloque del marco temporal más alto;
  • BSB  — es el tamaño de bloque del marco temporal básico;
  • kfd — es el coeficiente de multiplicación para corregir el número de bloques de retardo;
  • addkfd — es el coeficiente de suma para corregir el número de bloques de retraso.

Ejmplo: digamos que mbn=24; %open=75; BSB=0.00064; Bsd= 0.0007. Entonces Vb=18. Esto significa que de 24 bloques, 18 deberán tener la misma dirección. Contamos cuántos puntos ha pasado el precio en 18 bloques en el marco temporal básico. Para esto, 18*BSB = 0.01152; calculamos cuánto debe pasar el precio en 18 bloques del marco temporal más alto. Para esto, 18*Bsd = 0.0126; encontramos cuántos puntos no son suficientes para formar todos los bloques del marco temporal superior. Para esto, 0.0126-0.01152=0.00108, y dividimos el valor resultante por el tamaño de bloque del marco temporal más alto. Nd=0.00108/0.0007=1.54. Resulta que el bloque 1.54 no es suficiente para pasar a un marco temporal superior.

El valor obtenido es válido si el precio se desplaza estrictamente en vertical, pero este no es el caso, y de los 24 bloques, tenemos que solo hay 18 en una dirección, y 6 en otra. Por consiguiente, deberemos recalcular 1.5 bloques hasta el número correcto de bloques para el instrumento comercial dado, por lo que obtendremos el valor Nbd = 3. Entonces, en realidad, dadas las características del movimiento de tendencia de este instrumento comercial, deberemos esperar la formación de tres bloques del marco temporal más alto.

No obstante, esperar sin más a que pase el número requerido de bloques de retraso (3 en el ejemplo) no resulta efectivo. Tendrá sentido esperar solo si el precio se desplaza en la dirección de la tendencia detectada y resulta posible la transición a un marco temporal superior. Debemos tomar el número mínimo de bloques Nd, multiplicarlo por el tamaño del bloque Bsd y destacar el número requerido de puntos desde el precio de cierre del bloque del marco temporal básico hacia la tendencia. Este será el punto de control al que deberá llegar el precio para poder pasar a un marco temporal superior. Ahora, tras cerrarse cada nuevo bloque del marco temporal superior, será necesario verificar si quedan suficientes bloques para que el precio alcance el punto de control establecido. 

Por ejemplo: Nbd = 3 bloques, tendencia descendente. Calculamos el punto de control; este se encuentra a una distancia de 1,54 bloques por debajo del precio de cierre del bloque del marco temporal básico. Se ha formado un bloque descendente del marco temporal superior, luego se ha formado un bloque ascendente y ha quedado 1 bloque de retraso. No tiene sentido esperar más, porque si se forma otro bloque de retraso, ya no cruzará el punto de control. Como hemos entendido que no tiene sentido continuar con el retraso, no llevaremos a cabo la transición a un marco temporal superior, y podremos abrir una posición. 

En la animación 2, mostramos cómo funciona esto.

work 2

Animación 2.

Como ejemplo, tomaremos una onda sinusoidal. Por el momento, la versión de trabajo no puede determinar las características estadísticas del instrumento comercial, por eso, hemos ajustado manualmente el porcentaje de apertura y cierre. En las próximas versiones, implementaremos esto, y el propio algoritmo determinará las características del instrumento comercial. Él mismo determinará el tamaño de los bloques y el momento adecuado para abrir una posición.

Podemos ver que la prueba comienza con bloques pequeños, y que luego el algoritmo, tras rastrear la tendencia, aumenta el tamaño del bloque. Una vez se ha determinado el tamaño máximo de la tendencia, se abre una posición. Después, se calcula el retroceso de esta tendencia. Para una sinusoide, el viraje será del 100%, por lo que calculamos el punto de cierre y establecemos un take profit. Hemos elegido una onda sinusoidal para visualizar mejor y simplificar la comprensión del proceso de trabajo. Podemos ver que el algoritmo utiliza casi toda la amplitud de la sinusoide para obtener beneficios, excepto por una pequeña sección del segundo bloque al inicio de una nueva sección de tendencia.

3. Monitoreando las series

Una vez abierta la primera posición en la serie, el algoritmo sigue buscando una oportunidad para pasar a un marco temporal superior para corregir su trabajo y pasar a marcos temporales superiores en caso de que continúe la tendencia. Naturalmente, habrá situaciones en las que algunas posiciones se abrirán en un marco temporal inferior y algunas posiciones se abrirán en un marco temporal superior. El tamaño del retroceso siempre se calculará a partir de la mayor tendencia que detecte el robot.

El algoritmo resultante ignorará dos condiciones de mercado extremas. Si el mercado es plano y no hay tendencia en ninguna escala, y esto no es típico de este instrumento comercial, entonces el robot nunca iniciará una serie. Pero si el mercado está en tendencia, y la tendencia es estable y firme, como sucede con los descensos o ascensos bruscos del mercado, el algoritmo no podrá abrir una posición, porque aumentará constantemente el marco temporal hasta que finalice la tendencia. En este caso, los criterios para finalizar la tendencia se ajustarán en proporción a la escala de la tendencia en sí y al cambio en las características estadísticas del instrumento comercial.

Conclusión

Nuestro objetivo principal es construir un algoritmo al que no importe qué datos se le suministren. Si los datos de entrada no cumplen los criterios de estabilidad, el algoritmo no comerciará. Por consiguiente, la tarea no consistirá en desarrollar un algoritmo rentable para un mercado específico e intentar predecir en qué dirección irá el precio: consistirá en rentabilizar el algoritmo en determinadas condiciones y características estadísticas de la serie de precios. Solo debemos comerciar cuando se cumplan estas condiciones. Si conocemos las condiciones con las que el algoritmo operará para obtener beneficio, no será necesario comerciar cuando no se cumplen estas condiciones. Después de crear un algoritmo de este tipo, deberemos añadirle conocimientos sobre las características de la formación del precio de mercado para aumentar la eficiencia del algoritmo.

La funcionalidad descrita todavía resulta insuficiente para que el funcionamiento sea totalmente automático y estable; no obstante, hemos desarrollado un modelo teórico básico y una base para el funcionamiento del algoritmo. La cantidad de trabajo realizado es muy grande y resulta difícil encajar todo en un artículo, así que continuaremos describiendo el resto de funciones y poniendo a prueba lo que hemos conseguido en los próximos artículos. 

Hemos trasladado a la configuración los parámetros de las funciones desarrolladas, para poder así configurarlos. Las razones para establecer este o aquel valor en la configuración del algoritmo tienen una explicación muy específica, o bien se expresan usando fórmulas que permiten realizar los cálculos. Habrá muchas configuraciones en el algoritmo final, pero son necesarias para configurar el algoritmo propiamente dicho, este porque será complejo, y sus módulos individuales deberán interactuar entre sí de forma efectiva. La configuración de este algoritmo no ha sido pensada para ajustar según la historia los parámetros de rendimiento. Los ajustes están diseñados para optimizar el funcionamiento de los módulos y su interacción entre sí.

Adjuntamos al artículo los códigos de los indicadores que construyen los bloques en la ventana del gráfico y en la ventana del indicador. Estos indicadores son iguales, solo difieren en la visualización. Asimismo, adjuntamos la tarea técnica para estos indicadores, así como la tarea técnica completa para la versión inicial del algoritmo.

Artículos anteriores sobre este tema

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



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

Archivos adjuntos |
TZ-50cV3.zip (694.09 KB)
Buscando patrones estacionales en el mercado de divisas con la ayuda del algoritmo CatBoost Buscando patrones estacionales en el mercado de divisas con la ayuda del algoritmo CatBoost
En el presente artículo, mostramos la posibilidad de crear modelos de aprendizaje automático con filtros temporales y también descubrimos la efectividad de este enfoque. Ahora, podremos descartar el factor humano, diciéndole simplemente al modelo: "Quiero que comercies a una hora determinada de un día concreto de la semana". Así, podremos delegar en el algoritmo la búsqueda de patrones.
El mercado y la física de sus patrones globales El mercado y la física de sus patrones globales
En el presente artículo trataremos de comprobar la suposición de que cualquier sistema con un mínimo conocimiento del mercado puede operar a escala global. No vamos a inventar teorías ni leyes: reflexionaremos únicamente sobre la base de hechos conocidos por todos, convirtiendo paulatinamente dichos hechos al lenguaje del análisis matemático.
Aproximación por fuerza bruta a la búsqueda de patrones (Parte II): Nuevos horizontes Aproximación por fuerza bruta a la búsqueda de patrones (Parte II): Nuevos horizontes
Este artículo prosigue con el tema de la fuerza bruta, ofreciendo al algoritmo de nuestro programa nuevas posibilidades para el análisis de mercado, y acelerando la velocidad de análisis y la calidad de los resultados finales, lo cual brinda un punto de vista de máxima calidad sobre los patrones globales en el marco de este enfoque.
Trabajando con los precios en la biblioteca DoEasy (Parte 63): Profundidad del mercado, clase de orden abstracta de la Profundidad del mercado Trabajando con los precios en la biblioteca DoEasy (Parte 63): Profundidad del mercado, clase de orden abstracta de la Profundidad del mercado
En el presente artículo, empezaremos a desarrollar la funcionalidad para trabajar con la Profundidad del mercado. Crearemos la clase del objeto de una orden abstracta de la Profundidad del mercado y sus clases herederas.