Enfoque científico sobre el desarrollo de algoritmos comerciales

19 noviembre 2020, 13:48
Maxim Romanov
0
654

Introducción

El comercio en los mercados sin un sistema comercial, provocará que, con una probabilidad cercana al 100%, el tráder pierda su depósito. No importan los mercados en los que comercia el tráder, los resultados a largo plazo de un tráder sin experiencia son los mismos. Para ganar dinero en los mercados, necesitamos un sistema o algoritmo comercial.

Existen muchos sistemas y algoritmos comerciales, y entre ellos encontramos algoritmos matemáticamente rentables: hablamos de todos los tipos de arbitraje, HFT, estrategias de opciones y varios tipos de comercio en el mercado SPOT contra sus instrumentos derivados. Pero todos los algoritmos ampliamente conocidos tienen sus desventajas. Estos, o bien tienen una baja rentabilidad, o bien requieren una alta competencia por la liquidez y la velocidad de ejecución de las órdenes. Por consiguiente, los tráders se esfuerzan por desarrollar algoritmos comerciales propios, basados ​​en una lógica única.

Como norma general, la mayoría de los algoritmos comerciales se basan en el análisis del movimiento de los precios de los activos y en los intentos de predecir de una forma u otra el valor del precio futuro con cierta probabilidad. Hay algoritmos que, además del análisis de precios, también utilizan datos externos que consideran tanto el trasfondo fundamental como el informativo, incluido el análisis de rumores.

El problema es que muy pocas personas comprenden exactamente cómo buscar patrones, qué patrones funcionan y cuáles no, y por qué. ¿Por qué, al agregar al gráfico de indicadores estándar o indicadores no estándar descargados de la red en el gráfico, no obtienen un algoritmo rentable? Porque estos tratan de optimizar los parámetros de su estrategia en el optimizador con la esperanza de obtener ganancias, pero al final solo adaptan los parámetros de su estrategia a una pequeña sección de la historia, obteniendo pérdidas de forma natural en el futuro. El optimizador es una herramienta necesaria y útil, pero debemos usarla para encontrar los parámetros óptimos de un algoritmo ya rentable, no para llevar un sistema perdedor a una zona positiva configurando los parámetros sobre los datos históricos.

A diferencia de otras áreas de actividad, el trading es un área poco desarrollada, debido a la alta competencia. En general, las ideas rentables y rompedoras quedan en secreto y no se difunden. Las ideas no rentables o las ideas que no suponen ningún beneficio, al contrario, se difunden muy rápidamente. Esto se debe a que si una persona o grupo de personas desarrollan algo que realmente vale la pena, entonces no tienen necesidad alguna de compartirlo con los demás, simplemente convierten su inteligencia en dinero. Y al contrario, descubriendo las bases de su sistema, se crearán un competidor que aspirará a una liquidez nada modesta. Por consiguiente, todos los que comienzan a dedicarse al comercio algorítmico deben recabar información desde cero y ganar experiencia. La comprensión de las reglas básicas, sin embargo, puede necesitar años.

A causa de esta particularidad, en el trading hay más supersticiones que reglas verdaderemante efectivas. Sin embargo, el enfoque científico es el mismo en cualquier esfera, y nos permite progresar más rápido en el desarrollo de algoritmos rentables. Por eso, en el presente artículo, utilizando como ejemplo un sistema comercial simple, analizaremos cómo adoptar el enfoque científico y evitar supersticiones al desarrollar un algoritmo comercial.

Buscando patrones en la formación de los precios

El desarrollo de un algoritmo comercial debe iniciarse con la búsqueda de un patrón de precios que nos permita conseguir una expectativa positiva de ganancias durante el comercio. El patrón puede surgir como consecuencia de una hipótesis de precios desarrollada previamente o encontrarse por casualidad. A menudo, en la ciencia nos encontramos con ambos escenarios: algunos inventos se hacen al azar, otros, por el contrario, son producto de investigaciones a largo plazo. Con anterioridad, en el artículo "Discretización de series temporales con generación aleatoria de "ruidos"", analizamos la transición de los gráficos de velas a los gráficos de bloques, y también describimos los motivos de dicha transición, por lo que en el futuro estudiaremos los gráficos de bloques, no los gráficos de velas.

En el artículo anterior "¿Qué son las tendencias y cómo es la estructura de los mercados: de tendencia o plana?", desarrollamos la definición para el concepto de tendencia e investigamos si la estructura del mercado es de tendencia o plana. Para comprender las ideas del presente artículo, le recomendamos familiarizarse con el anterior.

El análisis demostró que la mayoría de los mercados tiene una estructura de tendencia, es decir que la probabilidad de la continuación de la tendencia es mayor que la de viraje. De aquí podemos deducir que la densidad de la distribución de los incrementos en N saltos para las series de precios es más amplia y más baja que la densidad de la distribución de los incrementos para un proceso con un 50% de probabilidad de viraje en cada salto. Mostramos un ejemplo en la figura 1.

amd distrib

Figura 1.

En la figura 1, mostramos en rojo la distribución de referencia de la densidad de la probabilidad de los incrementos para un proceso de 40 saltos con una probabilidad de viraje para cada salto siguiente igual al 50%, utilizando para ello 5000 muestras. El gráfico de barras blancas indica los valores medidos para 40 saltos de acciones de AMD para las mismas 5000 muestras. Hemos calculado el número de saltos verticales, cuántas veces ha pasado el precio en 40 saltos de 5000 mediciones, mostrando esto en forma de histograma.

En otras palabras, hemos tomado 5000 segmentos de 40 saltos, midiendo después cuántos saltos ha pasado verticalmente cada uno de los segmentos y hemos mostrado todo en forma de histograma. Por ejemplo, en 40 saltos para una acción de la empresa "AMD", el precio ha pasado 0 saltos verticalmente 390 veces, para la referencia debería subir 626,85 veces.

Este gráfico nos indica que el precio de mercado ha pasado en 40 saltos 0 saltos verticalmente con bastante menos frecuencia que el proceso cuya probabilidad de viraje cada salto siguiente es del 50%. Por consiguiente, en el gráfico analizado, la probabilidad de continuación de la tendencia es superior al 50%, y la acción tiende a continuar la tendencia. En otras palabras, el precio, tras pasar 10 puntos, con poca probabilidad pasará otros 10 puntos en la misma dirección en la que virará. 

vertical steps
Figura 2.

En la figura 2, mostramos un ejemplo sobre cómo se ha calculado el número de saltos en vertical. Tomamos una muestra de 40 bloques (saltos) y calculamos cuántos bloques ha pasado el precio verticalmente en estos 40 bloques. En la figura, en 40 saltos, el precio ha pasado 7 saltos verticalmente. A conitnuación, tomamos otras 4999 muestras de 40 saltos y medimos cuántos saltos verticales se han pasado. Luego, mostramos los resultados medidos con histograma en el que el eje Х expresa la amplitud, y el eje Y expresa el número de veces que se cae en esta amplitud.

Análisis del patrón encontrado

Después de encontrar un patrón, debemos analizarlo. Para hacerlo, debemos tomar otros instrumentos comerciales y otras escalas de tamaño de bloques, para que quede claro: esta particularidad es característica solo para un instrumento comercial específico y con una escala específica, o es inherente a todos los instrumentos bursátiles a cualquier escala. En el presente ejemplo, hemos analizado más de 30 parejas de divisas, una gran cantidad de acciones comerciadas en los mercados ruso y estadounidense, y más de una docena de las principales criptomonedas e instrumentos de materias primas. A la hora de estudiar cada instrumento, hemos usado todas las escalas con un tamaño de bloque de 1 punto a miles de puntos. Podemos entonces deducir que todos los instrumentos comerciales analizados tienden a poseer una estructura de tendencia a cualquier escala, pero, a medida que dicha escala aumenta, la tendencia del instrumento disminuye.

Así, hemos encontrado un patrón: los mercados tienden a mostrar una tendencia a cualquier escala, pero, al aumentar la escala, la tendencia disminuye, es decir, después de pasar N puntos en vertical, con una probabilidad de más del 50%, el seguirá irá mucho más en la misma dirección. Este patrón es bueno porque permite utilizar una estrategia de tendencia sencilla para comerciar, según la cual podemos abrir una posición de compra después de cada salto hacia arriba y abrir una posición de venta después de cada salto hacia abajo. 

A continuación, viene el análisis del enfoque utilizado. Puede que no encontramos un patrón, sino un error en nuestro método de análisis de la estructura del mercado. En dicho caso los mercados no serán de tendencia y no resultará posible ganar dinero con ellos. Por eso, necesitamos empezar con lo básico, es decir, con cómo se construyen los bloques sobre los que encontramos las tendencias. Podemos encontrar el indicador de bloques en el artículo anterior "¿Qué son las tendencias y cómo es la estructura de los mercados: de tendencia o plana?". En este caso, la serie de precios se cuantifica ("corta") en bloques de N puntos. Dicho de otra forma, cada vez que el precio supera N puntos desde el punto de referencia anterior, se forma un bloque de N puntos. Si el bloque tiene un tamaño de 10 puntos, el precio se mueve 10 puntos y se forma un bloque que contiene los precios de apertura y cierre. A continuación, esperamos hasta que el precio supere otros 10 puntos en una dirección y cerramos otro bloque, y así sucesivamente. En principio, no parece que haya problemas, pero, para construir bloques, se usan los precios de cierre de las velas de minutos, y esto es importante en el futuro.

delta

Figura 3.

Los análisis posteriores descubren 2 problemas:

  1. El delta entre el cierre de la vela y el bloque. En la figura 3, mostramos una situación en la que el precio de cierre del bloque descendente resulta por encima del precio de cierre de la vela descendente. El delta resultante entre el precio de cierre del bloque y el precio de cierre de la vela puede reducir a cenizas todo el beneficio que planeamos obtener de la tendencia del mercado. El motivo es que planeábamos usar un algoritmo simple: abrir posiciones de compra después de cada bloque ascendente y abrir posiciones de venta después de cada bloque descendente. Pero, como los bloques se forman al cierre de la vela, obtendremos la señal de que el bloque se ha formado solo después del cierre de la misma, lo cual indicará que podemos abrir/cerrar la posición a un precio peor del necesario. Este delta podría compensar todos los beneficios que obtendremos gracias a que el mercado está en tendencia, y el beneficio esperado continuará siendo igual a cero.
  2. Comisiones y spread. Es posible que el mercado sea de tendencia lo justo para compensar el spread y las comisiones. En dicho caso, si abrimos/cerramos posiciones según el mercado, las pérdidas derivadas de la apertura al peor precio, así como las comisiones, neutralizarán todas las ganancias obtenidas utilizando este patrón. Sí, en los mercados bursátiles podemos utilizar órdenes límite, y entonces no tendremos que pagar el spread, pero las comisiones se mantendrán. En FÓREX, las órdenes límite no ayudarán a combatir este problema a causa de las peculiaridades de ejecución.

En la etapa actual, hemos identificado dos posibles problemas que podrían impedirnos ganar dinero utilizando el patrón hallado. Para entender en qué grado influirán estos problemas al beneficio final, podemos:

  • Medir la probabilidad de que la tendencia continúe para un instrumento concreto en una muestra grande, de forma que obtengamos el valor exacto de la probabilidad para calcular el benficio esperado;
  • Recabar estadísticas en puntos según el delta surgido entre el cierre de un bloque y el precio de apertura esperado de una posición, encontrando el valor promedio;
  • Encontrar el spread medio, si estamos trabajando con órdenes de mercado o en Fórex, sumando las comisiones;
  • Restar los costes generales totales calculados al beneficio esperado resultante en la divisa del depósito y obtener una previsión de la esperanza real del sistema;
  • Si el beneficio esperado final continúa por encima de cero, podemos seguir con el siguiente paso.

Seguir todos los pasos mencionados sería correcto, pero no tan obvio e interesante cómo escribir un robot sencillo y verificar cómo funciona realmente. Es decir, en nuestro caso, haríamos precisamente eso, pero dentro del propio marco del artículo, resulta más interesante observar los resultados del algoritmo terminado. Probablemente existan otras características que no tomamos en cuenta. Ahora, supongamos que lo hemos calculado todo, hemos obtenido un resultado positivo y queremos crear un algoritmo comercial que explote este patrón. Entonces, procederemos al siguiente paso.

Desarrollando una hipótesis que explique la presencia de este patrón

Utilizar el patrón localizado sin una hipótesis que explique su naturaleza resulta peligroso. Todavía no sabemos por qué ha aparecido y qué nivel de estabilidad tiene, por lo que no podemos saber cuándo desaparecerá o cuándo volverá a surgir. Durante el comercio con dinero real, deberíamos poder monitorear la presencia actual de un patrón y entender si el depósito se halla en un retroceso largo respecto a su máximo y todo se recuperará, y cuándo el patrón ha desaparecido y es hora de desactivar el robot. Precisamente esta característica distingue a un robot rentable de uno que no lo es. Por consiguiente, debemos desarrollar una hipótesis que explique la existencia de este patrón, de forma que podamos transformar aquella en una teoría y utilizarla para corregir los modos de funcionamiento del algoritmo.

En nuestro caso, el patrón existe en todos los instrumentos comprobados y a todas las escalas, pero, a medida que aumenta la escala, el grado de la tendencia disminuye. Es probable que los dos factores descritos anteriormente (delta y comisiones) realmente influyan en este patrón. Entonces, podemos postular dos tesis:

  • Cuanto mayor sea el tamaño de los bloques, menor será el delta relativo al cerrar un bloque, y menor será el error al abrir/cerrar una posición. Por eso, los bloques se construyen según los precios de las barras de minuto, mientras que su tamaño es bastante estable en un intervalo determinado. Por consiguiente, cuanto mayor sea el tamaño de un bloque y menor el delta, menor tendencia tendrá el instrumento. Es decir, disminuirá el error en nuestro método de definición de la tendencia.
  • Cuanto mayor sea el tamaño del bloque, menor será el spread; las comisiones influyen en las características del mercado porque el tamaño del spread y las comisiones disminuyen en relación con el tamaño de los movimientos. Como el mercado es bastante eficiente, puede reaccionar a este hecho reduciendo la tendencia en proporción. 

Aquí, debemos adelantarnos un tanto y aclarar que, a pequeña escala, incluso si eliminamos los errores derivados del delta, los mercados sí tendrán tendencia, pero esta será exactamente igual, para compensar así el spread y las comisiones. Ignorando este hecho, los desarrolladores de scalpers con frecuencia caen en esta trampa. Piensan: "tengo que encontrar un bróker con menores comisiones: así mi scalper comenzará a ganar dinero, ya que si reducimos el spread y las comisiones, el scalper mostrará unos resultados fabulosos". Normalmente, no, no lo hará: el mercado a escalas pequeñas tiene una tendencia apenas suficiente para compensar el spread y las comisiones. Si el spread y las comisiones fueran menores, entonces los otros participantes del mercado ya habrían usado este patrón y lo habrían destruido. Aquí no escribimos sobre todos los scalpers, sino sobre robots sencillos que no utilizan frontrunning, análisis de volumen en la profundidad de mercado y otras técnicas de trabajo.

Supongamos que además de los mercados analizado, todos los demás tienen tendencia, y que, a continuación, respondemos a la pregunta: "¿por qué todos los mercados tienen tendencia?"

Comencemos por algo simple: ¿de dónde procede el beneficio al comerciar en el mercado? Como los participantes en el mercado comercian entre sí (incluso si usted comercia con un bróker en FÓREX), para ganar dinero, necesitará que alguien pierda la misma cantidad, más la comisión del corredor. Los activos son comprados y vendidos por los tráders entre sí, y cada uno busca beneficiarse de ellos. Esto significa que el comprador y el vendedor, al cerrar una transacción, tratan de obtener el máximo beneficio de la misma. Es decir, se da el caso de que el comprador piensa que es rentable comprar y el vendedor que es rentable vender, los dos al mismo tiempo. Pero, ¿alguno de ellos se equivoca claramente o no? Como resultado, ambos tráders pueden obtener ganancias cuando el comprador vende su activo a un tercero, pero, tarde o temprano, habrá una contraparte que perderá dinero en esta transacción. Por ello, todas las operaciones se construyen sobre el supuesto de que una de las contrapartes se equivoca al determinar su beneficio.

Si no sabe cómo se forman los precios en los mercados bursátiles, le recomendamos que lea en primer lugar el artículo "Principios de formación de precios en el mercado bursátil tomando de ejemplo la Sección de Derivados de la Bolsa de Moscú". Si ya está familiarizado, le resultará más sencillo. Por lo general, no importa en qué mercado operemos: la bolsa de valores, de criptomonedas o FÓREX. Los principios de fijación de los precios son los mismos en todas partes, pero las condiciones comerciales y las opciones de análisis son distintas.

Asimismo, para que resulte más sencillo y comprensible, debemos considerar las variantes límite para la forma de la serie de precios. Para los gráficos de precios, son posibles dos opciones opuestas de desarrollo de eventos: una tendencia lineal infinita y una sinusoide. Lo conveniente sería que, si el gráfico tuviera la forma de una sinusoide, todos supieran cuándo comprar y vender un activo. Igualmente, sería adecuado que si el gráfico ascendiera linealmente, resultara obvio que no hay necesidad de vender, solo de comprar constantemente y seguir teniendo ganancias. Pero dichas formas para los gráficos resultan imposibles, porque no habrá compradores en los máximos, ni vendedores en los mínimos. La fig.1 muestra un ejemplo hipotético en el que el gráfico de precios es sinusoidal, y un ejemplo de profundidad de mercado para él.

sinus
Figura 4.

Como podemos ver en la figura 4, si un gráfico de precios es sinusoidal, al acercase al mínimo, en la profundidad de mercado no habrá quien desee vender el activo, dado que todos saben que el precio no va a descender más, pero todos querrán comprar este activo cuando se acerque al mínimo. En el mercado habrá compradores, pero como no existirá intención de vender los activos; por consiguiente, no se realizarán transacciones, y el precio no se moverá durante esa trayectoria. Así, se buscará un precio de equilibrio al que ambos compradores querrán comprar y los vendedores querrán vender.

Una situación similar ocurrirá también si el gráfico de precios es linealmente ascendente. Como todos los tráders están al tanto de que el precio de un activo aumenta todo el tiempo, nadie lo venderá y, si nadie vende el activo, nadie lo comprará, lo cual significa que semejante gráfico de precios tampoco será posible. De esto podemos deducir que para que exista un gráfico de precios, los compradores deberán comprar y los vendedores deberán vender. Dicho de otra forma, alguien siempre deberá fallar al definir su propio beneficio. Pero, como cada participante busca maximizar su beneficio y no desea cometer errores por voluntad propia, el gráficó deberá tener la forma menos obvia: deberá ser más complejo que una sinusoide y más complejo que un ascendente lineal.

El gráfico de precios en un mercado eficiente deberá ser lo más intermedio posible entre lineal y sinusoidal. Asimismo, deberá poseer una estructura lo suficientemente compleja como para que el beneficio sea lo menos obvio posible tanto para los compradores como para los vendedores. Los gráficos sinusoidales y lineales se caracterizan por una baja entropía. Para que se puedan dar las transacciones, la entropía deberá ser mayor. Cuantos más participantes haya en el mercado, y más "inteligentes" sean estos, más fuerte será la tendencia del gráfico de precios hacia un estado de máxima entropía.

Si, por ejemplo, tomamos la entropía de Shannon, entonces adopta su máximo valor en una distribución uniforme. Sin embargo, nuestro proceso no es uniforme, sino más bien normal. Pero la distribución normal se puede conseguir a partir de la uniforme y al contrario: tanto más que estamos utilizando bloques con un tamaño de salto fijo. Dicho de otra manera, la máxima entropía forma parte de un proceso irregular; la probabilidad de cambiar la dirección para cada próximo movimiento es del 50%. No obstante, el análisis realizado muestra que la probabilidad de un cambio de dirección para el gráfico de mercado es diferente del 50%, lo que significa que existe cierta memoria y la entropía no resulta máxima.

Es importante que el mercado tianda a alcanzar la máxima entropía, pero solo alcanzará este estado cuando exista un número infinito de participantes (liquidez muy alta) o sean infinitamente "inteligentes". Entendemos por "inteligencia" la capacidad de identificar patrones complejos. Cuanto más complejos y menos obvios resulten los patrones que un participante puede identificar, más inteligente será. Un participante infinitamente "inteligente" será capaz de identificar y explotar absolutamente todos los patrones. La condición (o bien un número infinito de participantes, o bien que estos sean infinitamente inteligentes) vale la pena porque un número infinito de participantes poseerá una capacidad computacional infinita, y aunque esta no resulte muy "inteligente", podrá desvelar todos los patrones usando la fuerza bruta

La hipótesis expuesta explica por qué los gráficos de precios de los instrumentos financieros son cada vez más complejos. A principios del siglo XX era posible obtener beneficio comerciando a partir del promedio; pero con el desarrollo del comercio algorítmico, los participantes se han vuelto "más inteligentes", los patrones se han vuelto más complejos, la entropía ha aumentado y se ha vuelto más difícil ganar dinero en el mercado. ¿Significa esto que los participantes se han vuelto "más inteligentes"? Significa que aumenta su potencia computacional, así como la velocidad en la toma de decisiones, la capacidad para determinar su beneficio de forma más rápida y exacta, y también la capacidad de detectar patrones cada vez más sofisticados, aunque sea usando la fuerza bruta.

Pero nosotros hemos hallado un patrón bastante simple. Podemos explicar esto porque en el mercado hay una entrada constante de capital. Los participantes no disponen de tiempo suficiente para tomar todo el beneficio, por lo que vemos que aparece un componente de tendencia. La entrada de capital se da gracias a la emisión de dinero. Cada país emite continuamente su propia moneda, manteniendo un cierto nivel de inflación. Lo más probable es que sea precisamente esta emisión la que cree un componente de tendencia.

Las conclusiones derivadas de la hipótesis que explica el patrón son estas: 

  • La emisión continua de fondos provoca que el mercado se vuelva de tendencia. En este caso, los activos que se desarrollan activamente y tienen un alto atractivo para la inversión deberían estar más de moda que en los mercados donde no se desarrollan y tienen un bajo atractivo para la inversión.
  • El nivel de tendencia del instrumento descenderá con el tiempo, porque el número de participantes sube, los participantes se van volviendo "más inteligentes" y el activo no puede tener un desarrollo indefinido; la velocidad de desarrollo y el atractivo del activo descienden con el tiempo, pero cada activo es distinto.
  • Las parejas de divisas desarrolladas (como EURUSD) deberían tener una tendencia más baja que las acciones emergentes, porque las parejas de divisas avanzadas implican a un mayor número de participantes que efectúan más operaciones, lo que hace crecer la entropía. Además, los bancos comercian con divisas, se ven obligados a ejecutar operaciones de cambio con estas y tienen grandes recursos para crear algoritmos comerciales "inteligentes" para generar beneficios adicionales. Asimismo, las parejas de divisas como EURUSD tienen una gran liquidez, y una alta liquidez provoca una reducción de la tendencia.

Comprobando la hipótesis

Aquí, debemos aclarar que en el apartado "Desarrollando una hipótesis que explique la presencia de este patrón", solo hemos planteado una hipótesis que trata de explicar la presencia de un patrón. Dicha hipótesis no pretende ser correcta al 100%, y puede tener inexactitudes, porque se trata solo de un paso en el desarrollo de un algoritmo. Este es un ejemplo de cómo se puede construir un razonamiento lógico intentando explicar el patrón detectado. Necesitamos dicho enfoque para evitar todo lo posible las supersticiones relacionadas con el mercado. Por ejemplo, si tuviéramos un patrón como: "RSI (Estocástico, MACD, ondas de Elliott, ofrezca su propia variación) ha entrado en la zona de sobrecompra, ha formado un patrón y necesita vender", entonces sería importante preguntarse: "¿por qué debería funcionar esto?" y "¿cuáles son las razones fundamentales para que esto funcione?"

La comprobación de la hipótesis será aproximada, sin profundizar en detalles: ahora lo más importante es comprender si nuestras conclusiones se correlacionan con los datos reales. Podemos efectuar la comprobación comparando el grado de tendencia de diferentes instrumentos. Para ello, hemos asumido que los instrumentos comerciales en desarrollo activo y atractivos para la inversión deberían estar más de moda que los desarrollados o los instrumentos que representan un menor atractivo para la inversión. El segundo supuesto implica que cuantos más participantes operen con un instrumento comercial y cuanto mayor sea su liquidez, menor será la tendencia. Vamos a verificar esta suposición de forma simple.

Al final del artículo "¿Qué son las tendencias y cómo es la estructura de los mercados: de tendencia o plana?", comparamos varios instrumentos comerciales, como EURUSD, AMD, AAPL y otros, dependiendo del grado de tendencia. En este artículo, vamos a hacer una comparación parecida; para ello,tomaremos 4 instrumentos como ejemplo:

  • La pareja de divisas EURUSD como instrumento con mayor número de participantes, bajo atractivo de inversión y alta liquidez. Tenemos que aclarar que las divisas tienen poco atractivo para la inversión, debido a la inflación, el dinero siempre se devalúa y no resulta rentable invertir en una divisa a largo plazo.
  • Las acciones de "Appl" (AAPL) se toman como el instrumento de inversión y desarrollo más atractivo, negociado por un gran número de particulares. La acción posee una alta liquidez, pero sustancialmente inferior a EURUSD.
  • Las acciones de "Sberbank" (SBER) poseen una liquidez sustancialmente inferior a las anteriormente mencionadas, su atractivo de inversión a escala global es significativamente menor que el de Appl, y su número de participantes, por ello, resulta también menor.
  • Las acciones de "Ashinskiy MZ" (AMEZ) tienen un bajo atractivo de inversión incluso para los estándares del mercado ruso, y también poca liquidez.

EURUSD

Figura 5а.

AAPL

Figura 5b.

SBER

Figura 5c.

AMEZ

Figura 5d.

Como podemos ver en las figuras número 5, EURUSD tiene una tendencia baja de 1.068; la acción "Appl" tiene una tendencia alta de 1.3; Sberbank tiene una tendencia de 1.168, menor que la de Appl, pero mayor que la de EURUSD. Las acciones de AMEZ poseen una estructura plana, es decir, su nivel de tendencia está por debajo de 1.

Podemos extraer la siguiente conclusión: el supuesto de que un alto atractivo de inversión incrementa el nivel de tendencia, y de que una alta liquidez y un gran número de participantes hace disminuir el grado de comercio, no contradice en absoluto los datos experimentales, lo cual indica que la hipótesis se puede usar en el futuro.

Desarrollando un algoritmo comercial

Una vez tenemos un patrón, podemos desarrollar un algoritmo comercial para él. El patrón es sencillo, por consiguiente, el algoritmo comercial no será complicado. El comercio se realizará en bloques, es decir, primero deberemos convertir los gráficos de velas m1 en bloques de N puntos. El algoritmo de construcción de bloques se integrará en el robot. El algoritmo comercial procederá directamente de la fórmula para definir el beneficio esperado:

m=(P(tp)*tp)-(P(sl)*sl)

donde:

  • m  esperanza de beneficio,
  • P(tp)  probabilidad de una transacción rentable, 
  • P(sl)  probabilidad de una transacción no rentable,
  • tp  tamaño medio de las transacciones rentables,
  • sl — tamaño medio de las transacciones no rentables.

y funcionará así:

  1. Abrimos la posición después de que se cierre el siguiente bloque descendente o ascendente;
    • si se ha cerrado un bloque descendente, abriremos una posición Sell;
    • si se ha cerrado un bloque ascendente, abriremos una posición Buy;
    • después de abrir la posición, esperamos la señal de cierre.
  2. Cerramos la posición después de que se forme un bloqueo en sentido opuesto al que nos ha servido como señal de apertura. Si tenemos una posición de compra abierta, esperamos la formación de un bloque descendente y cerramos la posición. Después de que el bloque descendente se haya cerrado, podremos abrir una posición de venta. Así, siempre disponemos de una posición en el mercado.
  3. La figura 3 muestra el caso en el que una vela y un bloque cierran a diferentes precios y se forma una delta. Estas son características del algoritmo de formación de bloques, por consiguiente, tenemos que prever el control de precios para que no abrir a un precio desfavorable. Vamos a añadir una condición de que si la delta entre los precios de cierre de la vela y el bloque es superior a un cierto valor, no abriremos una posición, sino que esperaremos a que el precio retorne al precio de cierre del bloque, y solo entonces abriremos la posición.
  4. Bien, ahora añadiremos la configuración de Take Profit y Stop Loss. Estos se necesitan si el tamaño de la vela es sustancialmente mayor que el tamaño del bloque, de modo que las posiciones rentables/no rentables se cierren no solo cuando el bloque está cerrado, sino también con valores atípicos grandes;
    • el precio SL lo calcularemos así: multiplicamos el tamaño del primer bloque (BS) por el coeficiente de los ajustes (ksl), y para las posiciones Sell respecto al precio de cierre del bloque (Bclose(op)) en el que estaba la señal de apertura de la posición, añadimos el resultado obtenido Sl=Bclose(op)+BS*ksl. Para las posiciones Buy, debemos restar al precio de cierre del bloque Sl=Bclose(op)-BS*ksl;
    • el precio TP lo calculamos así: multiplicamos el tamaño del bloque (BS) por el coeficiente de los ajustes (ktp), y para la posición Sell, restamos al precio de cierre del último bloque (Bclose(0) el resultado obtenido Tp=Bclose(0)-BS*ktp. Para las posiciones Buy, debemos sumar al precio de cierre del último bloque Tp=Bclose(0)+BS*ktp. Aquí, a diferencia del Stop Loss, debemos tomar el precio de cierre de cada nuevo bloque, y después de cerrar cada nuevo bloque, recalcular el Take Profit. Esto es necesario para poder obtener beneficios adicionales cuando surjan velas sustancialmente más grandes que el tamaño del bloque.
  5. Función de gestión de lotes. Aparte de las funciones estándar para el control de lotes, vamos a añadir una función que modificará el tamaño del lote a partir del tamaño del bloque actual. Esto es necesario para que el nivel de riesgo y rentabilidad continúe estable con el aumento del tamaño del bloque. Para ello, vamos a introducir el concepto de tamaño mínimo de bloque (BS minimum), con respecto al cual ajustaremos el tamaño del lote. El lote para la apertura de posiciones será el lote de los ajustes dividido por la relación del tamaño actual del bloque respecto al mínimo de los ajustes lot=lot(set)/(BS/minimum BS).
  6. Definir el tamaño del bloque. Esta función es muy importante para que el algoritmo funcione de forma estable. Aquí podemos actuar de varias formas:
    • utilizando el tamaño de bloque fijo indicado en los ajustes en el formato de precio, por ejemplo 0.02;
    • utilizando un tamaño de bloque automático vinculado al tamaño de las velas del marco temporal en el que estemos trabajando. Podemos obtener el tamaño de las velas del indicador ATR, y luego multiplicar el valor actual de ATR por el coeficiente para obtener el tamaño del bloque. Por ejemplo, supongamos que queremos comerciar con bloques de 5*ATR. Entonces, si aumenta la volatilidad, el tamaño del bloque aumentará y el sistema se adaptará a los parámetros cambiantes del mercado. El ATR se puede tomar en el marco temporal con el que estamos comerciando o en un marco temporal mayor, si deseamos experimentar.
  7. Permiso para abrir posiciones Buy/Sell. Vamos a construir una función que permita abrir posiciones Buy y Sell. Necesitaremos esto para analizar cómo funcionan las señales de compra y venta.

Adjuntaremos el robot resultante al artículo. El robot final dispone de un poco más de funcionalidad que la descrita, pero no la analizaremos en el marco del artículo. 

Comprobación del algoritmo comercial

Vamos a comprobar el funcionamiento del algoritmo con aquellos instrumentos cuyo comportamiento hemos analizado. Ya hemos predicho anteriormente con qué instrumentos debería resultar hipotéticamente rentable el algoritmo, ahora, necesitamos comprobar cómo funciona el algoritmo con estos instrumentos, para entender cómo de correcta era la hipótesis.

Lo comprobaremos con EURUSD. Con este instrumento había tendencia débil, y, quizás, esto no resulte suficiente para cubrir las comisiones y la delta cuando se construyan bloques. El algoritmo final funciona como se muestra en las figuras 6a y 6b.

EURUSD Trade

Figura 6а.

EURUSD Trade2

Figura 6b.

La simulación se realiza del 01.01.2018 al 28.07.2020, con el marco temporal m1 en el modo de ticks reales. Los ajustes han sido establecidos sin optimización, porque con este enfoque queremos mostrar que, perfeccionando el algoritmo al detalle, podemos renunciar a la optimización para cada instrumento comercial. Solo cambiarán el tamaño del bloque, el tamaño mínimo del bloque y el lote, para seleccionar un tamaño del beneficio sustancialmente superior a las comisiones.



Figura 7.

Para el EURUSD, como se esperaba, el spread y el delta al construir los bloques han compensado todo el beneficio que deberíamos haber obtenido gracias a la tendencia del instrumento. Como resultado, tenemos un beneficio esperado de -1.67$ por transacción. El lote ha cambiado dinámicamente a partir del tamaño del bloque, con un lote promedio de 0.078. Vamos a averiguar de dónde ha salido la pérdida. El robot escribe el spread en los logs. Al abrir y cerrar las posiciones, el spread promedio ha sido de 0.00008. Los swaps se han pagado a 159.76$, abriéndose un total de 614 posiciones. Por consiguiente, el swap promedio por posición ha sido de 159.76/614=0.2602$.

Si el spread promedio es 0.00008 y el lote promedio es 0.078, 1 pip en EURUSD con un lote de 0.078 valdrá $ 0.078, por consiguiente, el spread valdrá 0.078*8=0.624$. En total, las comisiones totales suman 0,624$+0,2602$=1,104$. Resulta que si perdiéramos una comisión en cada transacción, la expectativa sería -1.104$ y 1.67$, que suponen 0.566$ más. El tamaño mínimo de bloque se encuentra limitado a 0.002 en los ajustes, para un lote promedio de 0.078 es 15.6$. Vamos a valorar de forma aproximada cómo podría disminuir de promedio el balance si el gráfico de equilibrio fuera un paseo aleatorio y el tamaño del bloque fuera siempre el mínimo. Para esto, 15.6*(614 ^ 0.5)=386.55$. Ahora, vamos a añadir la comisión promedio por transacción multiplicada por el número de las mismas. 1.104*614+386.55=1064.406$.

Así hemos obtenido la magnitud 1064.406$ en dólares, según la cual, de promedio, el gráfico de saldo debería volverse negativo, si la probabilidad de abrir una posición en la dirección "correcta" es del 50% y pagamos una comisión por cada posición abierta. En realidad, hemos obtenido unas pérdidas de 1027.45$, lo cual coincide más o menos. Podemos sacar la conclusión de que hemos obtenido pérdidas porque la esperanza matemática de nuestro algoritmo en EURUSD es igual a cero. 

Vamos a echar un vistazo a los resultados obtenidos con acciones más populares, como "Appl" (AAPL): los resultados se encuentran en la figura 8, un poco más abajo.



Figura 8.

Con las acciones de AAPL, hemos conseguido un resultado positivo con una esperanza matemática de 19.33. Era una simulación con un lote dinámico en función del tamaño del bloque, y el tamaño del bloque cambió dinámicamente con la volatilidad. Veamos qué ocurre si no modificamos el lote de forma dinámica. El tamaño promedio del lote en la figura 8 ha sido de 39. Vamos a fijar el tamaño del lote en 39 y a ver los resultados en la figura 9.



Figura 9.

En general, la situación general no ha cambiado mucho, salvo por la última transacción rentable y algunos retrocesos de balance mayores. En las acciones de "Appl", el tamaño del bloque aumenta a lo largo del tiempo, y un tamaño de bloque incrementado con un lote fijo puede mostrar un gran beneficio, pero la tendencia a las reducciones puede aumentar de manera proporcional.

Ahora, vamos a ver qué ocurre si solo permitimos posiciones de venta. Los resultados se muestran en la figura 10.



Figura 10.

En el modo de solo Sell, hemos obtenido unas pequeñas pérdidas, pero la figura 5b muestra la asimetría de la distribución con respecto a cero, por lo que podríamos esperar este resultado. Ahora, vamos a considerar la situación para el modo de solo Buy; los resultados se muestran en la figura 11.



Figura 11.

Como podemos ver en la figura 11, el modo de solo Buy muestra resultados positivos, pero sigue siendo peor que el modo en el que se permiten tanto posiciones Buy como Sell. Dado que las acciones son propensas a alternar secciones de tendencia con caídas y aumentos, la utilización simultánea de posiciones Buy y Sell nos permitirá hacer más uniforme el gráfico de rendimiento.

Vamos a ver cómo funciona el algoritmo con las acciones de otras empresas en desarrollo activo. Comencemos con las acciones de AMD. Aquí, la simulación se ha realizado desde 2018.06.01 hasta 2020.07.28, porque la historia de minutos con nuestro bróker comienza desde esta fecha. Realizaremos la simulación en el modo de lote dinámico, y con posiciones Buy/Sell permitidas. Podemos ver los resultados en la figura 12.



Figura 12.

Como podemos ver en la figura 12, en las acciones de "AMD", el algoritmo muestra un resultado positivo estable, lo cual coincide con las suposiciones realizadas sobre la base de la distribución mostrada en la figura 1. A conitnuación, vamos a tomar otra coompañía de desarrollo activo, "Tesla", y a mirar en la figura 13 cómo se comporta el algoritmo con sus acciones.



Figura 13.

Como podemos ver, en las acciones de TSLA, el algoritmo se muestra estable gracias a que esta empresa, al igual que las anteriores, tiene un alto atractivo de inversión y un gran potencial de crecimiento.

A modo de comparación, vamos a realizar una prueba con las acciones de uno de los líderes del mercado ruso, Sberbank. Efectuaremos la simulación en el mismo periodo que en los casos anteriores. Las comisiones en el simulador se indican como las proporcionadas por el bróker Otkritie, es decir, el 0,057% por volumen. Las simulaciones se han realizado sin apalancamiento, usando ticks reales. El resultado de la simulación se muestra en la figura 14.



Figura 14.

Como podemos ver, a pesar de que Sberbank no resulta un activo tan atractivo como los descritos anteriormente, gracias a su menor liquidez, la acción sigue siendo tendencia y aún puede ganar dinero utilizando un algoritmo tan simple.

Todos los ajustes e informes del simulador de estrategias se adjuntan al artículo, por lo que lector podrá analizarlos por sí mismo.

Conclusión

Tras analizar el comportamiento del algoritmo comercial creado, podemos sacar las siguientes conclusiones:

  • El patrón detectado nos ha permitido crear un algoritmo capaz de generar beneficios sin la necesidad de optimizar los parámetros para cada instrumento comercial. La configuración se modifica manualmente, pero sabemos de antemano por qué ajustamos este o aquel parámetro en la configuración.
  • Conociendo el mecanismo para modificar los parámetros, podemos construir un algoritmo completamente automatizado en el que no necesitaremos modificar la configuración de cada instrumento por separado.
  • Comprendemos con claridad qué patrón explotamos para obtener beneficios, lo cual significa que en el futuro podremos aprender a predecir su fortalecimiento o debilitamiento.
  • Podemos predecir la presencia de un patrón en un instrumento concreto, teniendo una hipótesis sobre su aparición.
  • Debemos desarrollar una hipótesis sobre el surgimiento de tendencias en los mercados, para convertirla en una teoría completa que describa los patrones de precio. Tras desarrollar lo suficientemente bien la teoría, podremos mejorar la estabilidad, la fiabilidad y la versatilidad del algoritmo.
  • Con el desarrollo de un instrumento comercial concreto, el patrón se hará menos pronunciado, y necesitaremos pasar a nuevos instrumentos en desarrollo activo.
  • El método comercial puede ser rentable, pero requiere mejoras. Necesitamos minimizar el delta entre el precio de cierre del bloque y el precio de apertura de la posición, que aparece como causa de las peculiaridades del algoritmo de formación de bloques. Una de las opciones para lograr esto es pasar al análisis de gráficos de ticks, en lugar de a gráficos de minutos.
  • Conociendo el nivel de tendencia promedio de un instrumento, podremos recabar estadísticas sobre el cambio en el nivel de tendencia a lo largo del tiempo y aproximarlo mediante ecuaciones no lineales. En el futuro, conociendo la ley de cambio de tendencia de un instrumento en el tiempo, podremos desarrollar un mecanismo para controlar la desviación de la tendencia promedio, con el fin de aumentar la rentabilidad del sistema.
  • En su forma actual, este algoritmo resulta muy simple, y lo necesitábamos para probar la idea, pero la idea ha demostrado su viabilidad y potencial, por lo que puede modificarse sustancialmente para funcionar en mercados reales.
  • Resulta más fácil obtener beneficios en el mercado de valores que en FÓREX, y uno de los motivos es que los instrumentos del mercado de valores están más de moda. Pero también hay instrumentos planos, como el ejemplo de AMEZ que hemos mostrado. Para comerciar con dichos instrumentos, podemos modificar el algoritmo para que realice el viraje, y no para la continuación de la tendencia. Pero este tema se presta a un estudio aparte, porque los activos con poco atractivo para la inversión pueden tener problemas de liquidez.
  • El algoritmo realiza transacciones en el mercado; para incrementar la rentabilidad, podemos actualizar la lógica de las órdenes límite. Esto sin duda complicará la lógica, pero, probablemente, aumentará la rentabilidad: necesitamos seguir investigando y desarrollando.
  • Hemos mostrado un método práctico para aplicar el concepto de tendencia descrito en el anterior artículo ¿Qué son las tendencias y cómo es la estructura de los mercados: de tendencia o plana?, y también para aplicar de forma práctica el paso de los gráficos de velas a los gráficos de bloques, como hemos descrito en el artículo. 

    Discretización de series temporales con generación aleatoria de "ruidos".

Autor de la idea y el desarrollo, Maxim Romanov; el código del asesor ha sido escrito por Sergey Chalyshev según la tarea técnica desarrollada con anterioridad.


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

Archivos adjuntos |
report.zip (706.34 KB)
robot.zip (13.68 KB)
Set.zip (6.23 KB)
Sistema de notificaciones de voz para evetos comerciales y señales Sistema de notificaciones de voz para evetos comerciales y señales

En nuestros tiempos, los asistentes de voz juegan hace mucho un papel considerable en la vida del hombre, ya sea como navegador, buscador de voz o traductor. Por eso, en el presente artículo trataremos de desarrollar un sistema sencillo y comprensible de notificaciones de voz para los diferentes eventos comerciales, los estados del mercado o las señales de los sistemas comerciales.

Trabajando con las series temporales en la biblioteca DoEasy (Parte 47): Indicadores estándar de periodo y símbolo múltiples Trabajando con las series temporales en la biblioteca DoEasy (Parte 47): Indicadores estándar de periodo y símbolo múltiples

En el presente artículo, comenzaremos a desarrollar los métodos de trabajo con los indicadores estándar, lo cual nos permitirá crear indicadores estándar de periodo y símbolo múltiples basados en las clases de la bibliotecas. Asimismo, añadiremos a las clases de las series temporales el evento "Barras Omitidas" y aligeraremos el código del programa principal, trasladando las funciones de preparación de la biblioteca de dicho programa a la clase CEngine.

Uso de criptografía con aplicaciones externas Uso de criptografía con aplicaciones externas

En el presente artículo, analizaremos la encriptación/desencriptación de objetos en MetaTrader y los programas externos para aclarar las condiciones en las que se obtendrán los mismos resultados con los mismos datos iniciales.

Trabajando con las series temporales en la biblioteca DoEasy (Parte 48): Indicadores de periodo y símbolo múltiples en un búfer en una subventana Trabajando con las series temporales en la biblioteca DoEasy (Parte 48): Indicadores de periodo y símbolo múltiples en un búfer en una subventana

En el presente artículo, analizaremos la creación de indicadores estándar de periodo y símbolo múltiples que utilizan un búfer de indicador para sus construcciones, y que funcionan en una subventana del gráfico. Asimismo, prepararemos las clases de la biblioteca para trabajar con los indicadores estándar que funcionan en la ventana principal del programa, o que tienen más de un búfer para mostrar sus datos.