Los activos que estoy utilizando actualmente son estos 16, combinados entre sí, lo que me dan 120 combinaciones (AUDJPY, AUDUSD, EURAUD, EURCAD, EURCHF, EURGBP, EURJPY, EURUSD, GBPCHF, GBPJPY, GBPUSD, NZDJPY, NZDUSD, USDCAD, USDCHF, USDJPY).
Lo de los resultados no esperados respecto a la cointegración es porque me dan porcentajes de acierto positivos, pero no tan positivos como lo esperado. Es decir, con la cointegración igual me salen el 60% de entradas positivas y el 40% negativas, o un pelín peor (ya no digo el importe obtenido, ya que hay spread y swap, hablo sólo del porcentaje de operaciones acabadas bien y mal). Según veo en muchos sitios (y en el curso que hice), con la cointegración debería tener un porcentaje de operaciones buenas bastante mejor, como mínimo un 70% para arriba, porque sino es muy difícil sacar algo positivo. Y viendo artículos matemáticos que no tienen que ver con las inversiones, también dicen que es bastante fiable (dentro de lo que cabe, claro está). Por eso creo que me debe de faltar algún paso en mi cálculo para saber cuando 2 pares están cointegrados.
Por si sirve de algo a alguien, voy a poner aquí un poco básico el algoritmo que tengo para mirar si dos pares están cointegrados. Pongo un ejemplo de donde yo luego hice el algoritmo. Este ejemplo está hecho en R.
--------------------
#Métodos Cuantitativos para Arbitrajes EstadÃsticos por Cointegración.
#Nuestro objetivo para realizar arbitrajes estadÃsticos es buscar series temporales
#cointegradas.
#Veamos un primer ejemplo:
#1. Nos descargamos la serie de datos EUR/USD-GBP/USD:
library(quantmod)
getFX("EUR/USD")
getFX("GBP/USD")
plot(EURUSD)
par(new=TRUE)
plot(GBPUSD,type="l",col="red")
cor(EURUSD,GBPUSD)
#las forjamos en una tabla:
FX=data.frame(merge(EURUSD,GBPUSD))
attach(FX)
plot(EUR.USD,GBP.USD)
abline(lm(GBP.USD~EUR.USD))
#2. Veamos cual es su relación mediante una regresión lineal simple:
modelo1=lm(GBP.USD~EUR.USD,data=FX)
beta=coef(modelo1)
beta
#3. Corregimos la serie temporal EUR.USD con los coeficientes.
Corregido=EUR.USD*1.6783336-0.6583499
#4. Realizamos el test de Dickey-Fuller para comprobar estacionariedad:
library(tseries)
adf.test(Corregido-GBP.USD)
#5. Vemos que la serie está cointegrada, calculamos el spread:
spread=Corregido-GBP.USD
plot(spread,type="l")
#6. Calculamos la media de los periodos y las desviaciones tÃpicas:
media=mean(spread)
desviacion=sd(spread)
#7.Adjuntamos al gráfico:
abline(media,0,col="blue")
abline(2*desviacion,0,col="red")
abline(-2*desviacion,0,col="red")
abline(desviacion,0,col="green")
abline(-desviacion,0,col="green")
#Reglas de trading:
# a)Comprar GBP/USD y Vender simultaneamente EUR/USD cuando el spread toca la lÃnea verde
# inferior.
# b)Vender GBP/USD y Comprar simultaneamente EUR/USD cuando el spread toca la lÃnea verde
# superior.
# c)Siempre comprar o vender 1,678 veces más cantidad de EUR/USD dado que la volatilidad
# del GBP/USD es más alta.
# d)Liquidar las posiciones simultaneamente al llegar a la lÃnea azul.
# e)Empezar a plantear estrategias de cobertura si el spread sobrepasa las lÃneas rojas.
#Veamos un segundo ejemplo:
#1. Nos descargamos la serie de datos EUR/USD-USD/CHF:
getFX("EUR/USD")
getFX("USD/CHF")
plot(EURUSD)
par(new=TRUE)
plot(USDCHF,type="l",col="red")
cor(EURUSD,USDCHF)
#las forjamos en una tabla:
FX=data.frame(merge(EURUSD,USDCHF))
attach(FX)
plot(EUR.USD,USD.CHF)
abline(lm(USD.CHF~EUR.USD))
#2. Veamos cual es su relación mediante una regresión lineal simple:
modelo1=lm(USD.CHF~EUR.USD,data=FX)
beta=coef(modelo1)
beta
#3. Corregimos la serie temporal EUR.USD con los coeficientes.
Corregido=EUR.USD*-0.7520281+1.9250685
#4. Realizamos el test de Dickey-Fuller para comprobar estacionariedad:
library(tseries)
adf.test(Corregido-USD.CHF)
#5. Vemos que la serie está cointegrada, calculamos el spread:
spread=Corregido-USD.CHF
plot(spread,type="l")
#6. Calculamos la media de los periodos y las desviaciones tÃpicas:
media=mean(spread)
desviacion=sd(spread)
#7.Adjuntamos al gráfico:
abline(media,0,col="blue")
abline(2*desviacion,0,col="red")
abline(-2*desviacion,0,col="red")
abline(desviacion,0,col="green")
abline(-desviacion,0,col="green")
#¿Podemos negociar esto asà tan tranquilamente? ¡NO! El valor de un pip en el EURUSD no
#es el mismo que en el USDCHF ¡¡si nuestra cuenta está en euros!!
#Por cada 1.000 euros, si nuestra cuenta está en euros:
#Valor del pip, EUR/USD:
pipUSD=1000*0.0001
pipEUR=pipUSD/1.3876
pipEUR
#Creamos el par hÃbrido EUR/CHF:
tipo=1.3876*0.8776
tipo
pipCHF=1000*0.0001
pipEUR1=pipCHF/tipo
pipEUR1
#Relación a multiplicar:
Componente=pipEUR1/pipEUR
Componente
#Reglas de trading:
# a)Comprar USD/CHF y Comprar simultaneamente EUR/USD cuando el spread toca la lÃnea
# verde inferior.
# b)Vender USD/CHF y Vender simultaneamente EUR/USD cuando el spread toca la lÃnea verde
# superior.
# c)Siempre comprar o vender 0,75 veces la cantidad de USD/CHF en EUR/USD dado que la
# volatilidad del EUR/USD es más alta, pero... a esa cantidad añadirle el componente
# del valor del pip.
# d)Liquidar las posiciones simultaneamente al llegar a la lÃnea azul.
# e)Empezar a plantear estrategias de cobertura si el spread sobrepasa las lÃneas rojas.
-------------------------------------------------------------
Ah, se me olvidaba. El sistema este está programado en C#.NET, utilizando para los cálculos matemáticos R, ya que es un lenguaje mucho más adecuado a este apartado, y mucho más rápido también y muchísimas funciones matemáticas. Para la conexión con el broker, utilizo las APIs que cada broker pone a disposición del público para poder utilizar su plataforma.
Sobre la operativa que tengo ahora mismo activa, no se trata de cointegración. Como indiqué antes, lo bueno de este sistema es que permite muchísimas estrategias distintas. Tengo ahora mismo una estrategia de combinación de pares y detección de tendencias, en un timeframe horario, con un sistema de SL dinámico llegado a determinados niveles de beneficios, y cortando las pérdidas de determinados pares cuando se detecta cierta similitud con otras entradas con pérdidas (estas características también son personalizables), de forma que cuando hay entradas similares pero con beneficios, éstas sí se dejan continuar (resumiendo, se pueden hacer entradas parecidas en varios pares, si se dan condiciones negativas algunas de esas entradas se cortan al llegar a una pérdidas menores al SL, si se dan positivas, éstas se dejan seguir a su ritmo, así se minimizan las pérdidas pero se dejan cuando hay ganancias). Todo esto, como ya digo, es parametrizable y eliges tú las condiciones para cerrarlas, o puedes elegir no utilizar esa opción y listo.
Saludos