jueves, 14 de mayo de 2015

Cadenas de Markov en Forex

Volviendo al tema de si es posible predecir la evolución futura de un símbolo en Forex basándonos en datos pasados (tema que ya hemos tratado ampliamente en este blog, como por ejemplo aquí, aquí o aquí), en esta ocasión lo que vamos a probar es la viabilidad de utilizar Cadenas de Markov de orden k. Básicamente la idea de una cadena de Markov es dadas las k últimas barras, tratar de predecir el valor de siguiente barra. Para simplificar el problema, lo que vamos a hacer es en vez de trabajar con barras completas (apertura, cierre, máximo y mínimo), trabajar con valores booleanos (1 ó 0) que nos indican si en la barra anterior el símbolo cerró al alza (cierre > apertura), o a la baja (apertura > cierre). En este caso lo que queremos predecir es si la siguiente barra cerrará al alza o a la baja.

El problema de las cadenas de Markov es que dadas k barras, es necesario calcular 2^k parámetros de ajuste. Dado el elevado número de parámetros ajustables existe un elevado riesgo de sobreoptimización del sistema. Es decir, que acabemos con un modelo que describe a la perfección el pasado, pero que tiene capacidad nula de predicción. Para evitar las sobreoptimización vamos a utilizar una técnica llamada el principio de la longitud de descripción mínima, en la que el objetivo de la optimización no es encontrar el mejor modelo que describa los datos, sino encontrar el modelo más pequeño que mejor describa los datos.

Utilizando datos de 3 años del par EUR/USD en barras de 1 hora, obtenemos los siguientes resultados:

K    Predicción
1    0 %
2    0 %
3    0 %
4    0 %
5    -0.01 %
6    -0.04 %
7    -0.09 %
8    -0.18 %


Es decir, que utilizando hasta las cuatro barras anteriores no es posible predecir si la barra actual cerrará al alza o a la baja; y a partir de la 5 barra, el modelo no sólo no tiene capacidad de predicción, sino que también empieza a pecar del problema de la sobreoptimización.

Otra aproximación al problema sería en vez de utilizar todas las barras, utilizar el número de barras al alza vs. en número de barras a la baja. Esta es la idea que subyace a algunos de los indicadores técnicos más populares, como el RSI. Además, esta técnica reduciría considerablemente el riesgo de sobreoptimización, permiténdonos utilizar como entrada al modelo un mayor número de barras pasadas.

Aplicando estas ideas, obendríamos los siguientes resultados:

K    Predicción
1    0 %
2    0 %
3    0 %
4    0 %

5    0 %
6    0 %
7    0 %
8    0 %
9    0 %
10   0 %
11   0 %
12   0 %
13   0 %
14   0 %
15   0 %

Como podemos ver, la capacidad de predicción es nula, incluso utilizando un elevado número de barras. Lo cual nos lleva a poner seriamente en duda la utilidad de algunos de los indicadores más utilizados en el análisis técnico.

lunes, 11 de mayo de 2015

¿Cómo de Aleatorios son los Mercados?

La hipóstesis del mercado eficiente afirma que el mercado lo descuenta todo, y por tanto, la variación del precio de un activo es completamente aleatoria, resultando completamente imposible predecir valores futuros dada la serie temporal de valores pasados.

Sin embargo el concepto de aleatoriedad no es tan categórico como esta hipótesis defiende, es decir, no se trata de blanco o negro, todo o nada, sino que existen distintos grados de aleatoriead. Así, la pregunta de ¿es el mercado aleatorio? no tiene demasiado sentido. Quizás, una pregunta más acertada sería ¿cómo de aleatorio es el mercado?

Si definimos que una cadena es aleatoria en la medida que no presenta patrones repetitivos, es decir, que no puede ser comprimida (de acuerdo con la definición aportada por la complejidad de Kolmogorov), podríamos utilizar la Teoría de la Información de Shannon para calcular la aleatoriead del mercado.

Por ejemplo, supongamos que tenemos los datos correspondientes al par EUR/USD para los años 2011, 2012, y 2013, en barras de un día. De las 934 barras, tenemos 746 valores diferentes. Es decir, 188 veces el par repitió un precio que ya se había observado. ¿Podemos utilizar este hecho para comprimir los datos? Es decir, ¿podemos aprender de los valores pasados para predecir valores futuros? Si suponemos una distribución uniforme para todos los posibles precios observados (mercado totalmente aleatorio), tendríamos una entropía de 9,543 bits, pero si basándonos en las frecuencias intentamos comprimir algo más, por ejemplo utilizando códigos de Huffman, podríamos llegar a tener una longitud media por símbolo de hasta 9,427 bits. Es decir, seríamos capaces de comprimir los datos un 1,22%. No parece demasiado.

Podemos repetir el experimento para otras logitudes de barra, y obtendríamos un gráfico como el siguiente:


Como vemos, cuanto más pequeña es la longitud de barra, mayor es nuestra capacidad de compresión de los datos, y por tanto, nuestra capacidad de encontar un modelo que nos permita inferir valores futuros y, potencialmente, obtener beneficos de nuestra operativa de trading.

Sin embargo, hay dos elementos a tener en cuenta. El primero de ellos es que no se gana demasiado al disminuir la longitud de barra más allá de 1 hora, al menos en terminos de capacidad de aprendizaje, que no necesariamente en términos de pérdidas y ganancias, ya que también habría que tener en cuenta el número de entradas y salidas del mercado. El segundo es que con una capacidad de aprendizaje del orden del 4%, y teniendo en cuenta las comisiones que nos cobran los brokers, resulta bastante complicado poder obtener beneficios basándonos en técnicas de arbitraje estadístico.


miércoles, 26 de marzo de 2014

¿El movimiento de EUR/USD es simplemente ruido?

En esta entrada vamos a estudiar si la variación de precios del par EUR/USD presenta algún tipo de patrón que pueda ser predecido, o se asemeja más a un ruido blanco. Supongamos que tenemos el par EUR/USD en barras de 1 hora, precio de apertura, y para el año 2013, como muestra la siguiente figura:


Y calculamos la serie temporal de la variación entre los precios:


¿Se puede sacar algo en claro, o se trata de simplemente ruido? Vamos a verlo. Calculamos si la serie de diferencias está autocorrelada para distintos desplazamientos, y vemos el correspondiente correlograma:

Y nos da la típica distribución correspondiente al ruido blanco, donde no existe autocorrelación.



lunes, 24 de marzo de 2014

La hora como factor predictivo en Forex

En una entrada anterior de este blog estudiamos si el par EUR/USD presentaba algún tipo de ciclo o estacionalid en los valores más comunes, tales como el mes del año, día del mes, día de la semana, u hora del día; pero vimos que en ninguna de estos marcos temporales parecía presentar un ciclo claro que nos pudiese ayudar en nuestro sistema de trading.

Sin embargo, esto colisiona con lo que muchos autores de robots de Forex nos dicen, a saber, que la hora en la que se hace trading tiene un gran valor predictivo. Desde un punto de vista económico, esto podría tener sentido, ya que supuestamente no es lo mismo hacer treding sólo cuando las bolas asiáticas están abiertas, que cuando están abiertas las plazas de Londres y Nueva York.

Veamos lo que nos dicen los datos. Vamos a estudiar cuatro años diferentes para cuatro pares distintos.

El primer caso es el ya visto EUR/USD, pero para cuatro periodos de tiempo (años) distintos:


No parece que existan diferencias apreciables entre el comportamiento del par entre las distintas horas. Veamos ahora el caso del GBP/USD:


El resultado es muy parecido, la hora no tiene capacidad predictiva. Veamos ahora el USD/CHF:

 
Exactamente lo mismo. Y por último, el caso del USD/JPY: 

En definitiva, la hora no tiene ningun valor predictivo sobre el valor del cambio. Y la pregunta es, ¿y por qué ciertos autores lo recomiendad? Pues por el problema de siempre: una variable más introducida en el sistema reduce el sesgo del mismo, por lo que un único backtest mejora sensiblemente, pero también incrementa la varianza, por lo que de media, el sistema es peor predictor.

viernes, 21 de marzo de 2014

Búsqueda de Ciclos en EUR/USD

Cuando se trabaja con series temporales, el primer análisis que siempre se hace es la búsqueda de tendencias y estacionalidad en los datos. Una vez identificadas estas tendencias se pueden crear modelos sencillos que nos permiten hacer predicciones sobre la evolución futura de la serie. El problema es que en las series temporales estocásticas, muy habituales en finanzas, no existen tendencias y estacionalidad bien definidos, y por tanto, se requieren de modelos más complejos para explicar el comportamiento de la serie. Por ejemplo, con el siguiente código R podemos comprobarlo en el par Euro - Dólar:

EURUSD <- read.csv('http://www.quandl.com/api/v1/datasets/QUANDL/EURUSD.csv?&trim_start=2004-01-01&trim_end=2013-12-31&collapse=monthly&sort_order=asc', colClasses=c('Date'='Date'))
Euro <- ts(EURUSD$Rate,  start = c(2004, 1), freq = 12)
layout(1:3)
plot(Euro)                  # Original data
plot(aggregate(Euro))       # Check for a trend in data
boxplot(Euro ~ cycle(Euro)) # Check for a seasonality

Que nos genera la siguiente figura:

Como podemos observar no existe una tendencia clara. A veces el par está alcista, y a veces bajista, y el cambio de tendencia parece aleatorio.

La estacionalidad de una serie temporal está referida a un año completo, pero, ¿existirían cliclos temporarles de menor tamaño? Por ejemplo, ciclos mensuales, semanales o diarios. A continuación vamos a verlo para el mismo par.

El ciclo mensual de EUR/USD para los años 2012 y 2013 es el siguiente:


Aunque existe variabilidad entre unos días y otros, no se observa ningún tipo de ciclo, y sobre todo, los boxplot no indican que podamos distinguir estadísticamente entre unos días y otros.

El ciclo semanal de siete días tiene la siguiente forma:

En este caso el resultado es aun más desesperanzador, porque todos los días de la semana tienen un corportamiento muy parecido.

Y por último, el ciclo diario de 24 horas es el siguiente:

Que al igual que el ciclo semanal, ocurre que, a priori, no son distinguibles las distintas horas de trading.

sábado, 17 de agosto de 2013

La Máquina Mágica

Cuando empecé a trabajar con los sistemas automáticos de trading, una de las primeras tareas que me autoasigné fue el desarrollar una metodología de trabajo que me permitiese determinar, de forma cuantitativa y dentro de un cierto intervalo de confianza, si un determinado sistema tiene esperanza matemática positiva, además de identificar cual es la estrategia de gestión del riesgo que mejor se le ajusta, y el tamaño óptimo de las posiciones a abrir. Una vez desarrollada la metodología, me llevé la desagradable sorpresa de que no existía en el marcado ninguna herramienta lo suficientementemente potente como para poder poner en marcha mi nueva metodología.

A partí de ahí, y gracias a mi formación como ingeniero informático, me puse a desarrollar mi propia herramienta de análisis de sistemas de trading. Con el tiempo, la herramienta llegó a un nivel de madurez que me hizo plantearme la posibilidad de venderla como un producto comercial. Como emprendedor sabía que sólo tienen éxito aquellos productos que los clientes necesitan, quieren, y están dispuestos a pagar por ellos. Pero ¿cómo no iban a querer los traders una herramienta que dado un sistema te dice si es o no rentabe, y además te ayuda a maxizar el retorno mientras minimiza el riesgo? Pues no, eso no es lo que quieren los traders. Al menos no es lo que quieren los traders individuales, que es el mercado al que me dirigía.

Efectivamente, la gente lo que quiere es una "Máquina Mágica". Es decir, una maquinita que pulses un botón y automáticamente salga dinero, sin que sea necesario dedicarle tiempo ni esfuerzo. Eso es lo que me estaban demandando. Y cuando le explicaba que dicha máquina no existe, los potenciales clientes no lo entendían, o mejor dicho, no lo querían entender. Algunos incluso se enfadaban, y me decían que el problema era que no quería compartir mis secretos (pero oiga, ha visto usted que tenga un Mercedes aparcado en la puerta de mi casa).

Así que no tuve más remedio que cancelar la versión comercial de Entropycs. Desgraciadamente ser empresario es incompatible con ser trader, ya que ambas son profesiones a tiempo completo, y hay que optar por una u otra. En cualquier caso, sigo mejorando la plataforma para mi uso interno, y seguiré dando cuenta de mis avances en este blog.

martes, 30 de julio de 2013

Indicador Técnico: RSI

El Índice de Fuerza Relativa, o RSI (del inglés Relative Strength Index), es un oscilador diseñado para medir la velocidad con la que varían los precios. El indicador RSI oscila entre los valores 0 y 100 y se calcula de la siguiente manera:

                       100
        RSI = 100 - --------
                     1 + RS

        RS = AG / AL

Donde AG es la ganancia media (del inglés Average Gain), es decir, la media aritmética de las últimas N barras con resultados positivos (y donde N es el periodo de cálculo del indicador), y AL es la pérdida media (del inglés Average Loss), o la media artimética de las pérdidas de las últimas N barras.

Por ejemplo, un RSI calculado sobre 14 barras podría ser el siguiente:


Tradicionalmente se dice que tenemos un mercado en sobrecompra cuando el RSI es superior a 70, y un mercado en sobreventa cuando es inferior a 30. Por tanto, un sencillo sistema de trading podría ser abrir en corto cuando tenemos un mercado en sobrecompra, y abrir en largo cuando está en sobreventa.

En el paquete TTR de R el indicador RSI se calcularía de la siguiente forma:

RSI(price, n = 14, maType)

donde maType es el tipo de media móvil que queremos utilizar para el cálculo del RSI (simple, exponencial, ...). Por ejemplo, el RSI(14) se calcularía como: 
 
data(ttrc)
price <- ttrc[,"Close"]
rsi <- RSI(price, n=14)

Como resultado la variable macd contendría algo similar a:


67.21311 68.33130 68.90238 71.65472 74.12134 74.12134 75.12550 70.69429 ...