Discusión sobre el artículo "Arbitraje estadístico mediante reversión a la media en el trading de pares: Cómo superar al mercado con matemáticas"

 

Artículo publicado Arbitraje estadístico mediante reversión a la media en el trading de pares: Cómo superar al mercado con matemáticas:

Este artículo describe los fundamentos del arbitraje estadístico a nivel de cartera. Su objetivo es facilitar la comprensión de los principios del arbitraje estadístico a lectores sin conocimientos matemáticos profundos y proponer un marco conceptual de partida. El artículo incluye un Asesor Experto en funcionamiento, algunas notas sobre su prueba retrospectiva de un año y las respectivas configuraciones de prueba retrospectiva (archivo .ini) para la reproducción del experimento.

Este artículo no es de ninguna manera un intento de reproducir, o peor aún, “revelar el código secreto” de RenTech/Jim Simons. Como se dijo anteriormente, eso sería imposible para cualquiera que no estuviera directamente involucrado en sus operaciones. Es un esfuerzo por compartir con ustedes mi comprensión de los principios generales que impulsan sus modelos. Estos principios pueden informar el sistema comercial incluso del comerciante minorista más humilde. La diferencia estará en la escala de los resultados, que será proporcional a la cantidad de recursos invertidos en el sistema y sus operaciones.

Así pues, lo que leeréis a continuación es el resultado de una investigación en libros, documentales en vídeo y comunidades especializadas de internet, fusionada con mi experiencia personal de algunos años en el segmento financiero (más en el lado empresarial que en el lado desarrollador). Lo que hace RenTech es enorme, pero lo que veremos aquí es una miniatura, digamos, una figura de acción de un superhéroe, una maqueta de un rascacielos. 

El objetivo es contribuir con un método de análisis de bajo costo, liviano y fácil de desarrollar que pueda ser probado y mejorado por el trader minorista promedio usando solo las herramientas ya disponibles en la plataforma MetaTrader 5 que se ejecuta en un portátil de consumo de materias primas, posiblemente un portátil de gama baja. El método debería ser útil tanto para el trader algorítmico como para el trader discrecional. Comenzaremos con la configuración más sencilla, lo justo para describir el proceso.

Después de comprender los conceptos generales detrás del modelo, construiremos una cartera mínima para la forma más simple de arbitraje estadístico, lo negociaremos en modo automático con un Asesor Experto, tomaremos algunas notas sobre los resultados y, finalmente, pensaremos en los próximos pasos necesarios. Espero que esta experiencia pueda ayudarte a iniciarte en esta potente técnica de trading y poder ampliar posteriormente estos conocimientos, incorporando otros símbolos al portfolio y probando otros algoritmos más allá del aquí descrito, para ir construyendo progresivamente tu propia estrategia StatArb completa y adecuada a tus recursos y objetivos.

Autor: Jocimar Lopes


Autor: Jocimar Lopes

 

No entiendo tu planteamiento y código. Ya que usas temporizador de 5 segundos y actualizaciones del array de cotizaciones, ¿por qué usas CopyClose para _Period inicialmente? No puedes comparar y manejar en el mismo array - intervalos de 5 segundos y cualquier timeframe estándar (incluso M1).

Después de CopyClose inicial usted tiene una matriz de cotizaciones con el orden de los elementos más anticuados (0-th) a los más recientes (n-1-th).

Luego se actualiza (por temporizador) el array eliminando el último (más reciente) elemento e insertando un único nuevo valor de cierre en el índice 0-ésimo (donde se almacena el elemento más obsoleto).

Usted nunca desplazó el array de cotizaciones en los eventos de nuevas formaciones de barras, es decir sus arrays son por intervalos de 5 segundos, sin embargo uno de los modos compara estos valores con MAs sobre _Periodo. Eso es de nuevo una gran inconsistencia.

También si vas a usar barras finalmente (tus intenciones no son claras hasta ahora), asegúrate de sincronizar barras de diferentes símbolos por timestamps.

 
Stanislav Korotky usas CopyClose para _Period inicialmente? No puedes comparar y manejar en el mismo array - intervalos de 5 segundos y cualquier timeframe estándar (incluso M1).

Después del CopyClose inicial usted tiene un array de cotizaciones con el orden desde los elementos más antiguos (0-ésimo) a los más recientes (n-1-ésimo).

Luego se actualiza (por temporizador) el array eliminando el último (más reciente) elemento e insertando un único nuevo valor de cierre en el índice 0-th (donde se almacena el elemento más obsoleto).

Usted nunca desplazó el array de cotizaciones en los eventos de nuevas formaciones de barras, es decir sus arrays son por intervalos de 5 segundos, sin embargo uno de los modos compara estos valores con MAs sobre _Periodo. Eso es de nuevo una gran inconsistencia.

También si vas a usar barras finalmente (tus intenciones no son claras hasta ahora), asegúrate de sincronizar barras de diferentes símbolos por timestamps.

Gracias por tomarte el tiempo de revisar el código.

Los intervalos de 5 seg son arbitrarios en este punto. Podría ser 1 seg o 10 seg. La idea es tener una ventana inicial para calcular la dispersión media y, eventualmente, otras estadísticas para el período cubierto por el CountQuotes. Luego seguir actualizando una ventana móvil a intervalos de X segundos sin importar el marco temporal.

Tienes razón sobre las barras: No me interesan ni mantenerlas sincronizadas porque me parece que son irrelevantes en este caso concreto. Casi todas las operaciones duran un par de segundos, abriendo y cerrando intrabarra.

Dicho esto, ¿qué te parece este planteamiento? ¿Está más claro ahora? ¿Ves algún fallo crítico que pueda llevar a cálculos erróneos, afectar al rendimiento, o algo así?

Te agradezco mucho tu comentario y espero más. Este código evolucionará aquí, en público, y ya me has dado que pensar :)

Buen fin de semana.

 

Estimados amigos, cometí un error al subir el archivo de configuración del Tester (*.ini settings). Obviamente, el backtest debe ejecutarse con TP/SL CERO, es decir, las posiciones deben cerrarse cuando el spread "vuelva a la media", no por stop-loss o take-profit.

Para reproducir correctamente el backtest reportado en el artículo, por favor utilice el archivo de configuración adjunto aquí.

Disculpe las molestias que este error le haya podido ocasionar.

 

Muchas gracias por compartir, estuve ocupado todo el día trabajando en tu material, muy interesante. Algunos ajustes aquí y allá ... oh y añadió un par de filtros.

Algunos gráficos de los últimos 3 meses

EURUSD


XAUUSD

Usted está haciendo un gran trabajo, ¡salud!

 
Eric Ruvalcaba #:

Muchas gracias por compartir, estuve ocupado todo el día trabajando en tu material, muy interesante. Algunos ajustes aquí y allá... oh y añadió un par de filtros.

Algunos gráficos de los últimos 3 meses

EURUSD


XAUUSD

Estáis haciendo un gran trabajo, ¡salud!

Me alegro de que lo estés comprobando, Eric.

Sólo una cosa a tener en cuenta: tenga cuidado si / cuando se ejecuta en cuenta real. El deslizamiento y los grandes jugadores frontrunning sus órdenes pueden conducir a pérdidas.

Buena suerte, ¡feliz trading!

 
Jocimar Lopes #:

Me alegro de que lo compruebes, Eric.

Sólo una cosa a tener en cuenta: tenga cuidado si / cuando se ejecuta en cuenta real. El deslizamiento y los grandes jugadores frontrunning sus órdenes pueden conducir a pérdidas.

Buena suerte, ¡feliz trading!

Gracias por la advertencia, tienes razón, voy a probarlo primero y hacer los ajustes necesarios.

Gran fan de su trabajo.

 

Hola. Artículo muy interesante. He intentado replicar los resultados pero no pasa nada. ¿Qué me falta? He subido los archivos pairs-trading .mq5 y PairsTradingFunctions.mqh.

Gracias

 

XXXUSD = XXXEUR * EURUSD.

XXX = XAU, AUD, ....

 
Jocimar Lopes #:

Los intervalos de 5 segundos son arbitrarios en este punto. Podrían ser de 1 segundo o de 10 segundos. La idea es tener una ventana inicial para calcular la dispersión media y, eventualmente, otras estadísticas para el período cubierto por el CountQuotes. A continuación, seguir actualizando una ventana móvil a intervalos de X segundos sin importar el marco de tiempo.

Tienes razón sobre las barras: No me interesan ni mantenerlas sincronizadas porque me parece que son irrelevantes en este caso concreto. Casi todas las operaciones duran un par de segundos, abriendo y cerrando intrabarra.

Dicho esto, ¿qué te parece este planteamiento? ¿Está más claro ahora? ¿Ves algún fallo crítico que pueda llevar a cálculos erróneos, afectar al rendimiento, o algo así?

Entonces todo el modo con iMA es incorrecto, porque está ligado a barras. Necesitas calcular el MA por muestras de 5 segundos manualmente.

 
Stanislav Korotky #:

Entonces todo el modo con iMA es incorrecto, porque está ligado a barras. Necesitas calcular el MA por muestras de 5 segundos manualmente.

Cómo