Rankia España Rankia Argentina Rankia Brasil Rankia Chile Rankia Colombia Rankia Czechia Rankia Deutschland Rankia France Rankia Indonesia Rankia Italia Rankia Magyarország Rankia México Rankia Netherlands Rankia Perú Rankia Polska Rankia Portugal Rankia Romania Rankia Türkiye Rankia United Kingdom Rankia USA
Acceder

¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

14 respuestas
¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex
2 suscriptores
¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex
Página
1 / 2
#1

¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Hola,

He programado un sistema de trading automático completo, (al cual le falta optimizar sobre todo la parte de cointegración). Lo que me gustaría mejorar es la parte del cálculo de la cointegración. Estuve haciendo un curso de cointegración pero por desgracia se cortó a medio curso, sin ninguna razón a simple vista, simplemente desapareció el profesor y no se volvió a saber nada de él. El tema es que tengo en principio la parte de calcular si dos pares están cointegrados, pero los resultados no acaban de salir como era de esperar con esta estrategia, y me gustaría encontrar a alquien que tenga conocimientos de cointegración (lo ideal sería aplicada al trading, pero si es alguien matemático y no tiene ni idea de trading también me vendría perfecto). Al quedarse el curso a medias, tengo dudas de que tenga todo lo que hace falta, o incluso si algunas cosas que nos explicó son así realmente. Buscando información por otros sitios, sí parece que el algoritmo que tengo implementado es correcto, pero al no acompañar los resultados en esa estrategia siempre te queda la duda.

Me gustaría encontrar un colaborador para completar lo que me falta y que he mencionado arriba. Sobre cómo colaborar, pues sería cuestión de hablarlo, hay muchas opciones: determinadas licencias del programa para poder utilizarlo él o XX personas, ir a medias en una cuenta en común, pagar XX dinero por la colaboración. Sobre la colaboración, malo será que no se encontrase alguna forma para llegar a un acuerdo entre los 2 o los que fuésemos.
A quien le interese, puede ponerse en contacto conmigo mandando un mensaje a través de este mismo foro.

Para que veais por arriba cómo es el programa, éste actualmente tiene las siguientes características:

1) Conexión directa con el broker FXCM (con la opción de añadir más brokers si fuese necesario, tan sólo se necesitaría la API correspondiente y programar las operaciones necesarias con esa API).
2) Obtención automática de precios de los activos definidos.
3) Definición por parte del usuario del spread y el swap de cada activo para que las operaciones lo tengan en cuenta (de esta forma podrías cambiar estos valores para simular en los distintos brokers que te interesen)
4) Múltiples opciones de cálculos para definir entradas y salidas de las operaciones:
4.1) Se pueden definir múltiples sistemas para detectar entradas:
4.1.1) Cointegración, utilizando pares de divisas para calculas cuando están cointegradas
4.1.2) Tendencial (definiendo unos puntos de entrada cuando se detecten cambios de tendencia)
4.1.3) Sistemas sobre pares de divisas (ej. EURUSD-EURCAD) o sobre divisas simples (ej EURUSD)
4.1.4) Muchos otros sistema que el usuario quiera ya que se pueden definir las condiciones que tienen que cumplir las posibles operaciones
4.2) Se pueden utilizar varios tipos de coberturas (con pares equivalentes, coberturas simuladas, sin cobertura, ...)
4.3) Se puede definir cuantos datos históricos utilizar para los cálculos a la hora de predecir las posibles entradas (por ejemplo utilizar 500 datos o 1500 datos, lo que el usuario prefiera)
4.4) Se pueden utilizar múltiples timeframes para las estrategias (desde 1 minutos hasta 1 mes, yo normalmente utilizo el timeframe de 1 hora, por ser bastante fiable y las operaciones tener una duración aceptable)
4.5) Se puede definir el punto donde entrar y salir de las operaciones (basada en una serie de condiciones)
4.6) Se puede definir un mínimo y máximo de pips a la hora de buscar operaciones
4.7) Se puede definir un mínimo y máximo de lotaje en las operaciones
4.8) Se puede definir el porcentaje de riesgo que se correrá en cada operación (decidiendo también si tener en cuenta las ganancias/pérdidas obtenidas en el riesgo de cada operación)
4.9) Se puede definir el número de operaciones abiertas máximas
4.10) Se pueden definir SL dinámicos llegados a ciertos puntos de beneficios, por si queremos asegurar x beneficios pero no perder la oportunidad de obtener más si la operación sigue obteniendo más beneficios.
4.11) Se puede definir un período máximo de duración de una operación, y cuando finalice ese período se cerrará la operación, o se esperará a que cumpla unas condiciones específicas si queremos que se cierre sólo en determinadas circunstancias.

Todas las opciones indicadas en el punto 4 (y todavía existen más pero no veo necesario mostrar absolutamente, sólo puse las más importantes), están disponibles para utilizar en una cuenta en tiempo real, pero además, y es de las partes más importantes, puedes hacer una simulación con las opciones que prefieras en el pasado, es decir, puedes realizar los backtesting que consideres oportunos antes de utilizar las distintas opciones. De esta forma no es necesario dejar pasar un mes o dos con unas características concretas para saber si son buenas o no, sino que puedes utilizar el backtesting sobre un año o dos o lo que sea, con esas opciones, y el programa simulará las entradas que realizaría igual que ocurrirá cuando se haga en tiempo real.


5) Cuando se utiliza en tiempo real, se pueden hacer las entradas automáticamente en una cuenta de un broker, con lo que se puede comparar si los resultados simulados por el programa se corresponden con los del broker.
6) Tanto los backtesting como la operativa en tiempo real, se pueden hacer varias a la vez, incluso en distintas cuentas del broker. Simplemente hay que abrir el programa tantas veces como se quiera y realizar ahí la operativa.
7) Opción de enviar un email cuando se encuentren operaciones, de esta forma, si no quieres que la operativa sea totalmente automática, puedes enviarte un email cuando haya una operación y analizar tú mismo si la consideras adecuada o no. Con esto se podría enviar avisos a una lista de emails que haya definidos en el programa, si por ejemplo lo utilizan 10 personas, pues que mande 10 emails en cada operación a esas 10 personas.
8) Cuando se haga un backtesting u opere en tiempo real, se deben de definir tantos pares como se desee, de esta forma puedes operar con 5 pares si quieres, como con muchos (por ejemplo si eliges la cointegración, que son combinaciones de pares, puedes obtener muchísimas combinaciones. Un ejemplo práctico de para que sirve utilizar por ejemplo 1000 combinaciones (que se antoja a priorio demasiadas) es porque puedes hacer un backtesting de un año con esas 1000 combinaciones y luego te quedas para tiempo real con las X mejores combinaciones.
9) Además de todo esto, todos los backtesting o operativas en tiempo real (que no deja de ser igual que un backtesting sólo que se va haciendo en tiempo real en lugar del pasado), quedarán registrados al detalle en el programa, con lo que posteriormente (o incluso mientras se ejecutan) se podrán analizar las operaciones realizadas, los beneficios, las pérdidas. Todo ello se hace imprescindible para encontrar una buena estrategia ya que según los datos que se obtienen de los distintos backtesting se pueden ir modificando las opciones para optimizar la estrategia utilizada y crear una mejor.
10) Todas las estrategias y pares utilizados en cada estrategia, se pueden almacenar en una lista de favoritos (esto no es el resultado del backtesting en sí, sino las opciones que tiene ese backtesting). De esta forma, puedes definir las opciones y los pares, y guardaslos como favoritos, y luego si quieres hacer esa misma estrategia pero cambiando alguna opción en concreto, simplemente cargas ese favorito y cambias la opción que desees. Más que nada esto es por comodidad, porque como hay tantas opciones y pares posibles, sería un incordio si hay que definir todo nuevamente.

Esto que indico arriba es lo que ya está hecho y funcionando bastante bien.

Por si a alquien le interesa, acabo de publicar en myfxbook mi estrategia en tiempo real que estoy probando actualmente (tan sólo lleva activo desde el 08-12-2015, así que tiene todavía pocos datos, pero los backtesting que hice sobre 3 años son prometedores): https://www.myfxbook.com/members/lectum/calcoin-v10017/1446923

Os envío también unas imágenes generales de cómo es el programa a simple vista (estéticamente no es muy allá, pues sólo lo hice en principio para mi y aún lo estoy acabando, si consigo que funcione bien, pues entonces ya me meteré más con la parte visual, así que no os dejéis engañar porque no sea todo lo bonito que podría ser, jajaja)

http://prntscr.com/9j2nol -> Aquí podemos ver la pantalla del login. Actualmente funciona sólo FXCM, pero está pensado para funcionar con varios brokers a la vez y realizar entradas en los que se indique.
http://prntscr.com/9j2o4p -> Aquí se establecen las opciones que se indican en el punto 4, para realizar los backtesting o la operativa en tiempo real.
http://prntscr.com/9j2nz5 -> En esta pantalla podemos ver el resultado general de todos los backtesting realizados. Hay más detalle de lo que se ve, ya que muchas listas puedes pulsar ver más detalle de las cosas.
http://prntscr.com/9j2oaq -> En cada operación realizada o simulada, se guarda toda la información de esa operación y se muestra gráficamente para su análisis posterior.
http://prntscr.com/9j2ogc -> Como casi todos los programas que se precien, cuando ocurra alguna incidencia o error o mensaje informativo, se guardará y se podrán consultar esos mensajes.
http://prntscr.com/9j2olp -> Aquí se definirían los activos que queramos utilizar, así como los spread y los swaps (aquí se ponen los activos que queramos del broker, y en la pantalla de las opciones elegiremos los que queramos analizar)
http://prntscr.com/9j2ot9 -> Aquí se definen las estrategias de entrada y salida de las operaciones.

Saludos y muchísimas gracias a los que habéis seguido leyendo hasta el final puesto que es bastante larga la explicación, jajaja.

#2

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Buenas, yo he estudie algo de cointegración pero lo tendría que volver a revisar, no se si podría ayudarte. De todas formas me parece muy interesante el uso de la cointegración y todo el programa que has hecho, esta muy bien.

A que te refieres con que los resultados no son los esperados, parece que obtienes buena rentabilidad. ¿Qué pares usas para hacer cointegración?

Un saludo!

#3

¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

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

#4

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Hola lectum. sin haberme revisado todavía la cointegración, me viene a la cabeza un par de cosas.

1) La rentabilidad que obtienes es global?, es decir, con todos los pares de divisas o par por par?. Esta claro que practicamente todos los cruces involucran al dólar pero si la rentabilidad que obtienes es global mi sugerencia es que  muchas combinaciones de las que utilizas pueden sugerir cointegración cuando no la hay; dado que la regresión lleva a estimar los coeficientes que hagan que los residuos sean estacionarios; por sentido común, pueden estar más cointegrados los siguientes pares, por ejemplo: GBPCHF-EURCHF;  NZDJPY-AUDJPY;  AUDUSD-NZDUSD; .... Con ello quiero decir que tal vez estas suponiendo cointegración en un par como el AUDJPY-EURUSD cuando realmente no lo hay.

2) Cuando haces el contraste DFA (Dickey-Fuller ampliado) cuantos retardos incluyes?, No llego a entender el programa del todo porque usaba matlab pero cuando haces el contraste DFA no se especifica el número de retardos. Igual ahí esta la clave porque tienes que incluir tantos retardos como sean necesarios para eliminar la autocorrelación. Este enlace que he encontrado esta muy bien, pero igual ya lo has visto: http://webdelprofesor.ula.ve/economia/hmata/Notas/Notas%20sobre%20Analisis%20de%20Series%20de%20Tiempo.pdf

Podrías subir una imagen de la cointegración que te devuelva el R? de manera visual puede quedar más claro si hay algun error.

Un saludo

 

#5

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Hola Ausias Fuster,

Te respondo a tus preguntas:

1) La rentabilidad sí es global. Lo que sí hago es tras cada backtesting mirar cuanta rentabilidad me produjeron los mejores y los peores pares, y miro si tienen alguna característica especial si han tenido mucho mejor o mucho peor porcentaje que la media. Voy a probar a hacer lo que me indicas, no combinar todos los pares, sino seleccionarlos

2) Sobre los retardos en DFA, tengo puesto 0, si es lo que yo pienso. Ya te comento que esa parte básicamente hice como el ejemplo adaptándolo al C#.NET con llamadas a R, no domino demasiado ese tema y por eso precisamente buscaba alguien que controlase bastante, en lugar de intentar hacerlo yo porque no es que ande muy sobrado de tiempo ahora mismo.

#6

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Te sugiero que selecciones los pares o te fijes en la rentabilidad par por par. Tal vez pares como los que te he indicado tengán mayor rentabilidad porque efectivamente esten cointegrados. Por otro lado, estoy seguro que lo que te falla son los retardos del DFA, en algunos índices bursátiles me salían 4 o incluso 5 retardos. El tema me interesa, así que espero encontrar algún momento y revisarme todo el tema de la cointegración.

Un saludo!

#7

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Ok, lo que no sé cómo calcular cuantos retardos utilizar a la hora de hacer el test DFA. ¿No sabrás tú como hacerlo, no? Estuve mirando información, pero lo dicho, no me queda nada claro todo este tema.

#8

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Hola lectum, primero felicitarte por el gran trabajo realizado en la implementación de este EA. Quizás Ausias Fuster tenga razón y debes seleccionar los pares que efectivamente estén cointegrados y haya que retocar tal vez la estrategia (sin conocer con gran detalle lo que hace el sistema).

Yo no te puedo ayudar en la programación porque no soy experto. Lo que sí hago es operar pares cointegrados durante la sesión europea, sin utilizar coberturas y cerrando las operaciones por filtro horario. A veces las coberturas se pueden eternizar en el tiempo y prefiero cerrar la operación tanto si sale mal como si sale bien.

La operativa se basa principalmente en continuar las ineficiencias que han venido produciéndose, algunas de volatilidad en pares muy concretos y alguna direccional a través de un spread. Pero analizando e introduciendo las órdenes de forma manual, el proceso no está automatizado, pero de momento está funcionando bien, que al final se trata de conseguir rentabilidad.

La totalidad de las operaciones de ineficiencias incluyen el EUR y la GBP. Por ejemplo la operación de hoy ha sido corto de EURUSD y largo de EURGBP. También existen otras operaciones con pares distintos a la GBP según la volatilidad de los cruces o de la direccionalidad. La divisa que se incluye siempre, hasta ahora en la operativa es el EUR.

Yo sólo te puedo aportar cómo realizo la operativa pero no te puedo ayudar en el cálculo de la cointegración.

Para aportar algunos datos y para tener una idea rápida de los números de esta operativa manual basada en pares cointegrados, el porcentaje de aciertos se sitúa a día de hoy en 70%. El rendimiento de estos últimos 3 meses, que es cuando hemos creado una estadística oficial de la operativa alcanza el 22%, por encima del 7% mensual, y el tiempo en el mercado está alrededor de 6 horas. El tamaño de las posiciones es de 1 lote por cada 20000€, siendo el máximo drawdown del 5%.

De todas formas felicidades por la programación y animarte a que sigas con este gran trabajo.

#9

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Hola rigar,

Respecto a lo de operar con los pares que estén cointegrados, esa es la idea, y es lo que no sé fijo si está bien calculado. Yo, aunque ponga muchos pares a analizar, el programa me dice "cuales están cointegrados", y sobre eso calcula las entradas según la estrategia que le indiquemos, por lo que sólo debería tratar ya los cointegrados (usando la estrategia de la cointegración, claro). El problema es que aún tratando sólo los pares cointegrados me salen unas estadísticas menores al 60% de ganadas, y como comentas tú, lo mínimo que estaría bien, según creo, sería del 70% para arriba, por eso creo qeu el problema no está tanto en tratar algunos pares concretos sino en saber identificar correctamente que pares están cointegrados, porque creo que ahora no lo debe de estar calculando bien del todo.

#10

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Hola lectum, he estado mirando el script de matlab con el que hice cointegración entre una cartera de 4 acciones españolas (Repsol, Endesa, Santander y Telefonica) y el Ibex35. Para sacar las ponderaciones de la cartera hice Mínimos Cuadrados Ordinarios, tomando como variable dependiente el Ibex35 y como independientes cada una de las cuatro acciones. La ponderación de cada una de ellas era la beta dividida por el sumatorio de betas. Esto te abre muchas más posibilidades porque puedes probar a hacer cointegración entre una divisa y una cartera de ellas.

Con respecto al contraste ADF, efectivamente he comprobado que es ahí donde tienes el error. Para proceder correctamente:

1)  por MCO estima el alfa y la beta de un par con respecto otro

2) al realizar la estimación obtendrás un término de error, por ejemplo,

EURUSD = Alfa + Beta*GBPUSD + Error

Error = EURUSD - Alfa - Beta*GBPUSD

3) Realiza un ADF  para cada uno de los primeros cinco retardos del término de Error. En matlab, al aplicar el ADF te devuelve una serie temporal con los residuos. Como hemos hecho 5 ADF test, uno para cada uno de los primeros cinco retardos, el programa me devuelve 5 series temporales de residuos

4) Saca un correlograma de la autocorrelación parcial para cada uno de los cinco retardos.

5) Observa cada gráfico, la primera serie temporal de residuos que no tenga autocorrelación parcial es la que te tienes que quedar para analizar en el ADF test y concluir si esta cointegrada o no.

Te copio-pego mi programa:

 
%Estimamos por MCO los parametros(ponderaciones) de las acciones para 
%replicar al Ibex35:
[Alfas_Betas_1, ~, ~,~, ~, ~, R2_Ajustado_1,Ajustado_1]=...
    ols(Ibex35(:,1),Acciones(:,:),1);
Residuos_1=Ibex35-Ajustado_1;
 
%Realizamos un ADF test a los residuos de la regresiÛn, de 1 a 5 retardos,
%para comprobar si la cartera esta cointegrada con el Indice:
[ADF_test,~,~,~,reg] = adftest(Residuos_1,'lags',0:5);
 
 
%Graficamos los distintos correlogramas, uno por cada retardo, de las
%salidas de los residuos del ADF test:
figure(1)
subplot(2,3,1)
spacf(reg(1).res,6);
title('sin retardos')
hold on
subplot(2,3,2)
spacf(reg(2).res,6);
title('1 retardo')
hold on
subplot(2,3,3)
spacf(reg(3).res,6);
title('2 retardos')
hold on
subplot(2,3,4)
spacf(reg(4).res,6);
title('3 retardos')
hold on
subplot(2,3,5)
spacf(reg(5).res,6);
title('4 retardos')
hold on
subplot(2,3,6)
spacf(reg(6).res,6);
title('5 retardos')
savefig('ej1.1 CointegraciÛn.fig')
 
 
 
%Con 3 retardos, todos los coeficientes quedan dentro de las bandas, por lo
%que al tener un resultado en el ADF test respectivo donde se afirma que
%los residuos son estacionarios, concluimos que la cartera esta cointegrada.
 
%Ponderaciones de la cartera (a partir de los Betas de la regresiÛn
%anterior)
for i=2:5
    Ponderaciones(1,i-1)=Alfas_Betas_1(i,1)/(sum(Alfas_Betas_1(2:end,1)));
end
 
%Formalizamos la cartera:
Cartera=(Ponderaciones*Acciones')';

 

Espero que te sirva de ayuda, un saludo y feliz año!

 

 

#11

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Hola Ausias Fuster,

Gracias por poner aquí como lo haces tú,

Por lo que veo, creo que me faltan los últimos puntos (3,4,5), la correlación y todo eso.

Yo básicamente obtengo lo que indicas al principio, el error de la regresión lineal entre los 2 pares, y ese error es el que paso el test ADF, pero ni con retardos ni nada más, si la p-value me da 0.05 o menos, lo marco como cointegrado y si da más pues no.

No sé cuanto de complejo puede ser meter eso a mayores en mi programa (utilizando C# y R), la pena es que yo de R poco controlo, a ver si saco algo de tiempo y puedo mirar más a fondo eso.

Si no, yo sigo buscando a alguien que quiera colaborar directamente conmigo con esa parte (sin ser desinteresadamente, ya lo cmenté alguna vez, habría algo a cambio, claro), pero mientras no encuentre, intentaré echarle un ojo a eso a ver como se hace.

Ausias Fuster, no te animas a meterte en R y trabajar conmigo? Igual sacamos algo interesante entre los 2

Saludos

#12

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Buenas lectum, gracias por la propuesta pero por ahora estoy ocupado y mis conocimientos de programación fuera de Matlab son practicamente nulos. En cualquier caso, ahora veo mi programa y dudo un poco de si es totalmente correcto porque en el caso de acciones debería haber hecho la regresión con los logaritmos de las cotizaciones.

Para hacer cointegración las variables (acciones o pares de divisas) tienen que ser integradas. Si son integradas de orden uno I(1) al tomar diferencias el residuo es estacionario:

Precio hoy - Precio ayer = Diferencia

En acciones debe hacerse con logaritmos por la que la resta de los logaritmos es igual al logaritmo de la divisón que se aproxima a las rentabilidades:

log(precio hoy) - log(precio ayer) = log(precio hoy/precio ayer) -> aproximación a rentabilidad

y las rentabilidades son estacionarias. En tipos de cambio, probablemente la primera diferencia (es decir, la resta) sea estacionario pero no se puede asegurar.

Por lo demás creo que el programa esta bien.

Un saludo y suerte en la busqueda ;)

 

 

#13

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Muchas gracias Ausias,

Pues nada, andas como yo entonces, con el tiempo justo :).

Yo seguiré mirando lo que pueda por libre hasta que no encuentre a alquien que controle. Sino igual dentro de unos meses ya estoy yo puesto en el tema y puedo ayudar a alguien más.

Nuevamente gracias por tu ayuda.

Saludos

#14

Re: ¿Cómo optimizar sistema de trading automático basado en la cointegración? - forex

Vale, creo que un paso que me faltaba a la hora de comprobar si un par de activos estaba cointegrado era que por separado no comprobaba que cada activo estuviese integrado en orden 1 I(1), porque yo calculo la regresión lineal y ya le paso el test ADF para ver si están cointegrados.

Estoy buscando información acerca de cómo saber, con R, si una serie numérica tiene orden de integración 1, pero por más que miro no doy encontrado la función exacta.

No sé si estoy equivocado o no, pero en algún sitio vi que para eso, si por ejemplo quiero un serie de orden de integración 1, puedo comprobarlo pasando el test adf, con paso = 1, y, si el valor me da menor que 0.05 entonces es que está integrada de orden 1.

Es decir, es lo mismo que para calcular la cointegración, sólo que en ese caso a la fórmula la pongo que tenga paso 0, para que la relación sea I(0), y a cada activo por separado le pongo que sea de paso 1, para que sean de orden I(1).

Es que me surgen dudas sobre esto porque lo hice así precisamente pero no me sale ningún par cointegrado porque básicamente nunca o casi nunca pasan la validación de que los activos por separados sean I(1), tal como lo tengo puesto, que es como está explicado.

Brokers destacados