Cadenas de Markov Como Herramienta de Diseño de Sistemas

Para celebrar que Onda4 cumple en breve 20 años, Óscar Cagigas comparte con nosotros la segunda parte del artículo sobre Cadenas de Markov que publicó el año pasado. En esta nueva entrega Cagigas nos muestra cómo generar estrategias de trading utilizando esta herramienta estadística para buscar ineficiencias. Desde X-Trader.net deseamos felicitar a Óscar por su brillante y fructífera trayectoria. ¡Enhorabuena y a por otros 20 años!

En el informe anterior vimos que las cadenas de Markov son muy útiles para encontrar ineficiencias en el mercado, incluso presenté una estrategia simple, pero a la vez rentable, localizada mediante esta metodología.

Tras publicar el informe del sábado se me ocurrió que podría utilizar todo esto con los indicadores habituales del trading a ver si encontraba alguna ineficiencia. En concreto se me ocurrió una lista de 4 variables cuyo cambio hoy creo que pueden influenciar en el precio de mañana:

  1. El retorno porcentual (ROC)
  2. El volumen
  3. El ATR
  4. Si hoy se hace un máximo o un mínimo local

En realidad esta es la metodología que Jim Simons explica en una de las entrevistas, hacer una lista de variables que crees que pueden afectar al precio y comprobar si tienen significancia estadística o es puro azar.

Al trabajar con los datos veo que el volumen se ha incrementado paulatinamente desde el año 2001 (el comienzo de mis datos) así que solamente utilizaré el criterio de mirar si el volumen hoy es mayor que la última semana (que el promedio de las últimas 5 barras). En el caso del ATR pues como ya viene promediado simplemente lo compararé con su valor de ayer.

Así que las variables con su número de estados y los valores posibles son los siguientes:

  1. El retorno porcentual ROC con tres estados (0, 1, 2)
  2. Subidas de volumen con dos estados (0, 1)
  3. Subidas del ATR con dos estados (0, 1)
  4. Existe un mínimo (0) o no hay ni mínimo ni máximo (1) o hay un máximo de 5 barras (2)

Para evitar confusiones he decidido aplicar siempre un criterio de menor a mayor y empezar a contar en el cero. De esta manera un retorno muy negativo será un estado 0, un retorno intermedio un estado 1 y un retorno muy positivo un estado 2. De la misma manera el volumen que es menor que la media de 5 días es el estado 0 y el que es mayor es el estado 1. Un ATR que cae es estado 0 y un ATR que sube es estado 1. Y finalmente si hay un mínimo de 5 barras será un estado 0, si no hay ni mínimo ni máximo será el estado 1 y si hay un máximo de 5 barras es un estado 2.

A modo de ejemplo muestro debajo que al juntar los distintos estados generamos un código que nos informa de la situación del mercado en función de esas cuatro variables:

Codigo Variables

Así, en el ejemplo vemos que el código “2101” significa que hubo un retorno elevado (estado 2), un volumen que subió (estado 1), un ATR que cayó (estado 0) y no hubo ni un máximo de 5 barras ni un mínimo (estado 1).

En este caso he utilizado solo 3 estados para los retornos, y es que como puede imaginarse aquí el número de combinaciones posibles crece muy deprisa. En concreto, para estas 4 variables que mostramos y donde las variables primera y cuarta tienen 3 estados y las otras dos estados el número de combinaciones son 36.

Debajo muestro un extracto de la hoja Excel que carga los datos de ROC, Volumen, ATR y MaxMin y con ello saca los estados (en azul) y juntando los estados saca el código (en color rojo).

Excel con ROC Vol ATR y MaxMin

El filtro Amibroker que genera los datos de partida es el siguiente:

Filtro AmiBroker

Y el procedimiento para obtener los estados de los retornos es el que expliqué en el informe anterior, a través de los percentiles, con la función JERARQUIA() de Excel.

A continuación muestro los 36 estados posibles. Los he sacado de la columna CODIGO, pegándola en una hoja nueva, ordenándola y con la función “quitar duplicados”:

Codigos Estrategia

Pues ya tenemos los 36 estados que pueden ocurrir y ahora solo es cuestión de ver qué ocurrencias hay de un estado al siguiente. Para ello utilizo la función CONTAR.SI.CONJUNTO por columnas y por filas desplazada un lugar. Eso me permite contar las ocurrencias de un código al siguiente y crear la matriz de observaciones que vemos debajo. Es una matriz de 36×36. En las filas vemos el estado inicial y en las columnas el final.

Si el mercado fuese aleatorio entonces cada pareja de estados tendría que aparecer 5088/362 = 3.926 o unas 4 veces. Pero debajo vemos que hay parejas de estados que ocurren con una frecuencia mayor de lo habitual. El mayor de todos es el estado 0110 que al día siguiente vuelve al mismo estado 105 veces. Lo muestro en color fucsia.

Hoja Estados

Este estado 0110 representaría un retorno negativo donde sube el volumen y también el ATR y además se pierde el mínimo de las últimas 5 barras. Parece que después de un día así el día siguiente también es bajista y también se pierden de nuevo los mínimos de 5 barras.

Sin embargo a la hora de implementar este código veo que su transición es muy diversa, por ejemplo en 50 ocasiones al día siguiente sale el código 1100 donde el retorno es intermedio y no se pierden los mínimos de 5 barras. Esto lo muestro en color naranja. Y también vemos que en 53 ocasiones este estado derivó en el 2110, donde hubo fuerte rebote pero igualmente se perdieron los mínimos de 5 barras. Esto lo muestro en azul. Así que este código 0110 no parece que me vaya a servir de mucho porque no acabo de tener claro si debería abrir cortos o comprar en esta situación. Al día siguiente pasa de todo.

Ahora vamos a fijarnos en lo amarillo. Al investigar el segundo mejor (89), el tercero mejor (85) y el cuarto mejor (83) veo que tanto el código 1002 como el código 2002 terminan en el estado 1002, que representa un retorno intermedio donde se superan los máximos de 5 barras. Y en su fila no veo muchos estados contradictorios, así que me parece una buena opción para abrir largos.

Mejores Resultados

Es decir, comprar con los siguientes estados suele terminar con retornos positivos y en ocasiones con nuevos máximos: 1001, 1002, 2002

Así que ahora me construyo un sistema de trading en Amibroker que haga eso. Utilizo la misma nomenclatura.

En el caso de los retornos ROC el estado 0 es una pérdida menor que un -0.22%. El estado 1 es un retorno entre -0.22% y +0.42%. Y el estado 2 es una ganancia mayor del 0.42%. Todo esto sale al ver la división que hicieron los percentiles de los retornos, en tres partes. En este contexto de pruebas sirve, pero en un sistema de trading real que se pretenda operar mucho tiempo habría que hacerlo con los percentiles y no con los valores fijos.

Codigo Sistema Trading Percentiles

En el código anterior vemos que el Setup es el siguiente:

Setup = (ROC1 OR ROC2) AND vol0 AND ATR0 AND (maxmin1 OR maxmin2);

Que es lo mismo que decir que el Volumen y el ATR tienen que tener un estado cero (00) y el ROC tiene que ser 1 o 2 y la variable maxmin tiene que ser 1 o 2; es decir, que no haya nuevos mínimos de 5 barras. Simplemente son los estados 1001, 1002 y 2002 traducidos a formato Amibroker.

Y con esto ya terminamos y podemos simular. Los resultados se muestran debajo. Son mejores de lo que yo hubiera esperado pues esto solamente es mi interpretación de esta metodología de buscar ineficiencias con cadenas de Markov. Aumentar el número de variables o trabajar más la tabla debería mejorar este sistema que de partida ya parece bastante decente.

Sistema Markov Chain 4 Variables

COMPARTIR EN: