Enfoque científico sobre el desarrollo de algoritmos comerciales

Maxim Romanov | 19 noviembre, 2020

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:

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:

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: 

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:

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:

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:

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.