miércoles, 20 de febrero de 2013

Idea de Sistema: Seguimiento de la Tendencia

Recientemente asistí a unas charlas introductorias sobre trading organizadas por un conocido broker americano. Durante el evento, varios “especialistas” en trading nos daban su opinión sobre cómo operar con éxito. En concreto, uno de estos especialistas nos decía que hacer trading es muy fácil, tan sólo tenemos que ver la evolución de un símbolo, si está alcista nos ponemos en largo, y si está bajista nos ponemos en corto. Fácil, ¿no? El problema es cómo determinar cuando un símbolo está alcista, y cuando ha dejado de estarlo. Pero esto es algo que no nos contaron.


Al hilo de aquello abrí mi consola R y programé un estrategia simple, a ver que pasaba (nota: a partir de ahora me referiré únicamente al mercado Forex, aunque ideas similares podría aplicarse a otros mercados). Si el close de una barra diaria es mayor que el open, podemos decir que el día ha sido alcista. Y si al día siguiente vuelve a suceder lo mismo, ¿podemos decir que estamos ante una tendencia alcista? ¿O son necesarios tres, cuatro, o cinco días consecutivos alcistas? Vamos a ver que dice R.

Primero nos descargamos la información del cambio EURUSD de los últimos 10 años en barras diarias, tal y como hemos explicado en entradas anteriores de este blog. A continuación calculamos un vector de tendencias, que contendrá el valor 1 si el día ha sido alcista, y 0 si ha sido bajista:

tendencia <- as.integer(eurusd$Close > eurusd$Open)

Vamos a escribir una función llamada predicetendencias que recibe como argumento la tendencia diaria de un símbolo, y el número de días consecutivos que se tienen que dar para que una tendencia sea alcista o bajista, y devuelva cómo de efectiva es esta predicción (por efectiva entendemos la tasa de error en las predicciones):

predicetendencias <- function(x, k) {

    n <- length(x)
    pred <- rep(NA, n)

    for (i in (k+1):n) {
        if (all(x[(i-k):(i-1)] == 1)) pred[i] <- 1 else
            if (all(x[(i-k):(i-1)] == 0)) pred[i] <- 0
                else pred[i] <- NA
    }

    return(mean(abs(pred-x),na.rm=T))

}

Finalmente, evaluamos la estrategia para grupos desde 1 hasta 10 días consecutivos:

resul <- NULL
for( i in 1:10) {
     resul <- c(resul, predicetendencias(tendencia, i))
}

Visualizamos los resultados

plot(c(1:10), resul, type="lines")


Y vemos que la capacidad de predicción de este sistema es prácticamente nula (recuérdese que estamos hablando de tasa de error, por lo que a valores mayores, peor resultado).

¿Y si ... lo vemos al revés? Es decir, podríamos decir que si ha habido muchos días consecutivos en la misma tendencia, es posible que estemos al final de la misma, y que se deba producir un cambio de tendencia. En este caso tenemos que:




Bueno, parece que la capacidad de predicción ha mejorado algo. Nótese que en el caso de tendencias de 10 días consecutivos no se trata de que la predicción del sistema sea perfecta, sino más bien que tenemos pocas de esas tendencias (en concreto, sólo hay 3), y que hemos tenido mucha suerte en la predicción. Evidentemente, para poder poner este sistema en producción habría que trabajarlo mucho más, y hacer un análisis más exhaustivo. Pero es un comienzo.

Como ejercicio le dejo al lector propuesto el sistema Lluvia (le llamo lluvia porque en el libro en el que leí la idea hablaba de un sistema pare predecir si un determinado día llovería o no). El sistema lluvia se basa en contar el número de días alcistas entre los k días pasados, y si supera a k/2 esperamos (con probabilidad mayor a 0.5) otro día alcista, y si no, lo esperamos bajista. El código correspondiente es:

lluvia <- function(x, k) {

    n <- length(x)
    k2 <- k/2
    pred <- rep(NA, n)

    for (i in 1:(n-k)) {
        if (sum(x[i:(i+(k-1))]) >= k2) pred[i+k] <- 1 else pred[i+k] <- 0
    }

    return(mean(abs(pred-x),na.rm=T))

}

Habría que jugar con el parámetro k y quizás aumentando la proporción k/2. Ya me contaréis que tal.

Nota: Por petición popular, a partir de hoy incrementaré la frecuencia de las entradas de este blog, pasando de una semanal a dos (lunes y miércoles). Aprovecho la ocasión para agradeceros a todos el ánimo recibido para continuar con este proyecto de formación sobre R y trading.

No hay comentarios:

Publicar un comentario