Hola a todos, ante todo quisiera aprovechar la ocasión para saludar a toda la comunidad de X-Trader. Hace tiempo le comenté una idea a un buen amigo y compañero de trading, la cual le pareció interesante y me sugirió compartirla en el foro con todos ustedes para poder contrarrestar opiniones. No pude estar más de acuerdo con él, así que os explico la idea a continuación.
Un día, buscando extensos datos históricos para intentar desarrollar una estrategia, me vino a la cabeza la siguiente pregunta: ¿existe la manera de poder generar datos que siguen el mismo comportamiento que el mercado? Entonces pensé que si averiguamos la distribución de las variaciones de un activo cualquiera, podríamos intentar aproximar su curva de densidad y una vez obtenida dicha función, podríamos generar números aleatorios siguiendo las mismas probabilidades. Para quienes la estadística no sea su fuerte, simplemente se trata de contar cuantas veces se ha producido una determinada variación al lo largo del histórico y luego generar números aleatorios que sigan la misma frecuencia.
Lo que obtenemos es una serie de datos totalmente diferente pero que teóricamente siga la misma probabilidad que el mercado. Entonces podemos utilizar los datos generados para poner a prueba los sistemas y ver si funciona. Sería como un simulador de mercado. La ventaja es que si generamos nosotros mismos los datos, podemos generar un histórico tan largo como queramos y tantos como queramos. Ya que al ser aleatorios cada serie será distinta pero su distribución será la misma.
A continuación mostrare paso a paso, como he logrado generar dichos números. He utilizado un programa estadístico muy potente y gratuito llamado R para que todo el mundo tenga acceso. También se puede hacer con otros programas comerciales tipo Matlab o Mathematica, pero estoy seguro que preferís no malgastar el “buying power” en licencias de software. Me saltare los pasos de cómo instalarlo, pero si tenéis algun problema, no dudéis en preguntar.
En primer lugar, necesitamos datos históricos de muestra para poder modelizarlos. Podemos utilizar datos de cualquier activo, en este ejemplo utilizaré los precios de cierre diarios del Índice Dow Jones Average desde el año 2000. Para facilitar las cosas, he utilizado el archivo DJA.txt que genera VisualChart cuando queremos exportar los datos del gráfico. (Edité el archivo para tener sólo los datos entre el 2000 y el 2009 para trabajar con menos datos).
Arrancamos R y determinamos nuestro directorio de trabajo de la siguiente manera (para usuarios de Windows): Vamos a Archivo, Cambiar dir… entonces aparecerá una lista de directorios en forma de árbol y seleccionamos nuestro directorio de trabajo. Puede ser cualquiera, es para que el programa sepa donde tenemos los archivos que trabajaremos. Una vez sabemos nuestro directorio de trabajo, colocamos allí el archivo que contiene el histórico (DJA.txt). Con el siguiente comando cargamos los datos:
Código: Seleccionar todo
historico <- read.table("DJA.txt",dec=".", sep=",",header=T)
Código: Seleccionar todo
historico[1:5,]
Código: Seleccionar todo
dja <- historico[,8]
Código: Seleccionar todo
plot(dja, type="l")

Para calcular las variaciones realizamos el siguiente proceso
Calculamos el tamaño de la variable dja:
Código: Seleccionar todo
length(dja)
Código: Seleccionar todo
vardja <- 1:(length(dja)-1)
Código: Seleccionar todo
for(i in 2:length(dja)) vardja[i-1]=(dja[i]-dja[i-1])/dja[i-1]
Código: Seleccionar todo
dja[1:10]; vardja[1:10]
Código: Seleccionar todo
plot(vardja, type=”l”)

El gráfico muestra claramente el paseo aleatorio o movimiento browniano característico de los mercados financieros. En pocas palabras, la idea consiste en que las variaciones del mercado son puramente aleatorias e independientes entre ellas, esto imposibilita predecir futuras fluctuaciones. Esta idea se opone a la tradicional teoría de Dow y del análisis técnico en general, porque se basan en que las variaciones no son puramente aleatorias y sí siguen unos ciclos que mediante la experiencia pueden ser “reconocidos”.
Después de este inciso, visualizamos el histograma, el cual representa gráficamente la frecuencia en que se dan las variaciones. Los parámetros hacen que el grafico muestre las frecuencias relativas, que se divide la muestra en 100 intervalos y que el eje de las ordenadas vaya de 0 a 50..
Código: Seleccionar todo
hist(vardja, prob="T", breaks=100, ylim=c(0,50))
El programa R tiene la función “density()” que genera un objeto con la función de densidad, sin embargo, utilizare el paquete “Logspline” ya que genera una curva más suave y dispone del generador de número aleatorios que permite determinar que función de densidad utilizar a la hora de generarlos.
Código: Seleccionar todo
install.packages("logspline", dependencies=TRUE)
Código: Seleccionar todo
library(logspline)
La variable dvardja contendrá el objeto con la función de densidad ajustada:
Código: Seleccionar todo
dvardja <- logspline(vardja)
Código: Seleccionar todo
hist(vardja, prob="T", breaks=100, ylim=c(0,50))
plot.logspline(dvardja, add="T")

Perfecto, observad como se ajusta la recta al histograma. Ahora solo nos falta generar una serie de “variaciones aleatorias” que siguen la misma probabilidad. Generaremos el mismo número de variaciones para luego poder comparar:
Código: Seleccionar todo
rvardja <- rlogspline(length(vardja), dvardja)
Código: Seleccionar todo
hist(rvardja, prob="T", breaks=100, ylim=c(0,50))
Código: Seleccionar todo
plot.logspline(dvardja, add="T")
Código: Seleccionar todo
acumrvardja <- 1:(length(rvardja)+1)
acumrvardja[1]=dja[1]
for(i in 2:length(acumrvardja)) acumrvardja[i]=acumrvardja[i-1]*(rvardja[i-1]+1)
plot(acumrvardja, type="l")
Ahora solo nos queda exportar los datos para poder trabajar con nuestra aplicación de estrategias:
Código: Seleccionar todo
write.table(acumrvardja,"rDJA.txt",dec=".", sep=",")
A continuación se exponen unos gráficos para comparar los datos originales con los datos obtenidos:

Me despido agradeciendo vuestro interés y ya sabéis que cualquier crítica u opinión será bienvenida,
Saludos
Emer