Prueba la robustez del sistema añadiendo ruido aleatorio

Cuando creamos un sistema de trading lo habitual es optimizarlo sobre una serie de precios históricos. Es decir, ajustamos el modelo para que sea capaz de interpretar correctamente las señales. ¿Qué ocurre si ponemos un poco de ruido extra en el mercado? ¿Será capaz nuestro sistema de seguir identificando las señales o se volverá inútil?
La idea de hoy es probar la robustez del sistema cuando añadimos «ruido» modificando artificialmente las cotizaciones.

Qué es un sistema robusto

Un sistema robusto es aquel que «puede mantener sus condiciones esenciales de desempeño pese a recibir perturbaciones o ruidos».

Si lo pensamos en referencia a un sistema de trading, la robustez del sistema es la capacidad de mantener el rendimiento bajo diferentes condiciones de mercado o con parámetros distintos de los iniciales.

Entonces, la principal característica de este tipo de sistemas es que pueden estar sometidos a situaciones de estrés y aún así seguir funcionando.

A qué se considera «ruido» en un sistema de trading

soundwaves-153352_640Partimos de la idea que todas las series de datos, en este caso las cotizaciones históricas, están compuestas por dos elementos: señales y ruido. Cuando diseñamos nuestro sistema buscamos identificar determinados patrones o señales. Cualquier dato que no nos aporta una señal o que dificulte la visión del patrón lo catalogamos como ruido.

Ahora bien, según la estrategia que utilices vas a considerar «ruido» a una cosa distinta.
Por ejemplo si aplicas un sistema tendencial, la señal sería la tendencia, mientras que el ruido es todo el movimiento que se produce, por debajo y “por encima” de la tendencia. En cambio, este mismo movimiento se podría convertir en una señal si buscas operaciones de tipo mean reverting.
Lo mismo se aplica a distintos marcos temporales: los movimientos intradía sólo son ruido para un sistema que opera según cierre semanal.

Examinar la robustez del sistema

Una manera de examinar la robustez del sistema es medir su sensibilidad a un nivel de precios específicos. Para esto, la prueba de hoy consiste en añadir un poco de ruido aleatorio a la serie de precios históricos y volver a ejecutar el backtest para ver qué pasa.

Si la rentabilidad del sistema cae en picado, eso quiere decir que el modelo se había ajustado a una serie de patrones que no son persistentes. Es decir que habíamos sobreajustado el sistema y  como consecuencia es muy probable que este sistema no funcione en la realidad como en el backtest original.

Test de sensibilidad

La idea de alterar los precios de cierre la he encontrado en este blog ( donde también nos muestran un snippet en AFL para aleatorizar los precios de cierre). Pero luego revisando el tema en casa he descubierto que en Quantitative Trading Systems ya se trataba este asunto, y con una mejora que me resulta muy interesante.
Esta mejora consiste en añadir ruido de forma paulatina. Vamos subiendo el nivel de ruido, alterando las cotizaciones, para ver a partir de qué nivel el sistema ya no funciona.

Sistema ejemplo:

  • El sistema que utilizo en este ejemplo es un cruce de medias exponenciales pero al estilo mean reverting: Compra cuando la media lenta cruza por encima de la rápida.
  • Opera al cierre en diario sobre el SPY (ETF del SP500).
  • Sale de la operación después de X días.
  • Comisiones a 20 usd por trade.

Los resultados de la optimización indican que los mejores parámetros son:

Media exponencial 1= 10 días.
Media exponencial 2= 5 días.
Días en trade= 10.

Estos son los resultados del backtest para SPY desde 1993 hasta noviembre 2015.

Nota: Como puedes ver se trata de un sistema muy básico. La intención es mostrar cómo aplicar una prueba de robustez del sistema y no un sistema en sí.
Sin embargo, me gustaría remarcar que al SP500 parece comportarse muy bien con una lógica mean reverting. Esto ya lo habíamos comentado en otras entradas del blog, por ejemplo con sistema Naive.


Ahora viene la parte interesante…

Añadir ruido aleatorio a las cotizaciones

Modificamos aleatoriamente los precios de cierre en un pequeño porcentaje. En consecuencia esto va a modificar tanto los precios de entrada y salida como los indicadores que utilizamos para dar señales.

Al modificar aleatoriamente, vamos a tener un conjunto de operaciones distinto en cada backtest. Después de ejecutar varios backtests puedes analizar las estadísticas y desviaciones para un nivel de ruido determinado.

Para incorporar ruido a las cotizaciones en Amibroker puedes utilizar esto:

noise = 1 + 0.01 * ( -0.5 + mtRandomA() ); // generate -0.5...+0.5% noise
O *= noise;
C *= noise;
H*= noise ;
L*= noise
//***************************************************************************
fuente:Tomasz Janeczko 
https://www.mail-archive.com/[email protected]/msg53089.html

 

Test con distintos niveles de ruido

Ahora vamos a realizar múltiples pruebas aumentando el nivel de ruido aleatorio en los precios.

  • Si obtenemos los mejores resultados con un nivel de ruido = 0, y a medida que aumenta el nivel los resultados empeoran drásticamente, entonces puedes pensar que el sistema no es robusto ya que está excesivamente ajustado a un nivel de precios específico.
  • Podremos determinar que el sistema es más robusto cuando los resultados del nivel de ruido =0 figuren entre otros niveles similares. O cuando los resultados no varíen significativamente a pesar de modificar los datos.

Si utilizas Amibroker puedes establecer un «rango de ruido aleatorio» medido según la desviación estándar del precio. Luego puedes lanzar una optimización para  examinar qué nivel de ruido da los mejores resultados.

nivel=Optimize("nivel",0.0,0.0,8,0.05);
SD= StDev(C,20);
NoisyClose= C + (SD* nivel* mtRandomA());

Estos son los resultados para el sistema de ejemplo

test robustez del sistema
Resultado test : Añadir ruido a los datos

Los resultados sin modificar los precios ( nivel =0) están más o menos en línea con los resultados que obtenemos al incorporar niveles bajos de ruido. Por lo tanto, según esta prueba el sistema de trading es robusto.


¿Qué te parece esta forma de examinar la robustez de un sistema de trading?

Yo creo que es una idea interesante, como someter al sistema de trading a un estrés test.

En este caso la prueba es en Amibroker, pero también es posible realizarla en Excel ( aunque da un trabajo extra considerable).

¿Has probado este método?. Por favor cuéntame tu experiencia.

Si te interesan los sistemas de trading para operar en bolsa o forex, te invito a suscribirte a Estrategias de Trading y recibirás los artículos del blog directamente en tu correo.

6 comentarios en «Prueba la robustez del sistema añadiendo ruido aleatorio»

  1. Pufffff, en los sistemas de Trading está claro que eres un «Crack», yo me limito a lo sencillito, je, je. Nunca he sido capaz de programar un backtest, y lo he intentado.
    No sabía que se podía crear ruido artificial para medir un sistema, pero claro, mis conocimientos de programación son nulos.
    Un artículo muy interesante, gracias por la mención.
    Un abrazo fuerte.

    Responder
    • Gracias a ti Miguel. Al investigar el tema del ruido tu artículo me ha venido genial.

      En general yo soy mucho más de operar con sistemas que de forma tradicional. Aunque no niego que a veces algunas operaciones discrecionales voy haciendo, pero más en estilo inversión que trading puro.

      un abrazo para ti también,

      Responder
  2. Hola duk2dos,

    No conocia este metodo para probar la robutez de un backtesting.

    ¿que margen de tolerancia seria aceptable entre los resultados del bakctesting sin añadir ruido y con el backtesting añadiendo ruido?

    saludos

    Responder
    • Hola jmrcarlin,

      En mi opinion no hay una cifra exacta. Lo importante es analizar los resultados de las pruebas y ponerlas en contexto con el tipo de sistema que estás simulando, la cantidad de operaciones que da tu backtest, y las modificaciones en los ratios de rendimiento . Así por ejemplo puedes ver que determinados sistemas sostienen sus resultados con un nivel de ruido bajo, digamos menos de 5%, pero no soportan niveles mayores de ruido. Estos cambios pueden originarse en una cantidad menor de operaciones derivada de tomar menos señales, o puede ser que la rentabilidad por operación cambie.

      Responder
  3. Entrada impresionante Duk2, en serio, tu nivel de conocimientos me parece tremendo y es un lujo poder seguirte regularmente.

    Yo nunca he hecho lo que propones simplemente por desconocimiento, me he limitado a hacer backtest curiosos en ProRealTime y en Metatrader, y para ser sinceros, me ha parecido todo un poco engañoso. No es que no confie en los backtest para determinar si un sistema puede funcionar o no, es que a la hora de la verdad el mercado es azar en estado puro y sabemos que en real las emociones se meten por medio, con lo que nos va a ser dificil ser totalmente automáticos en nuestro trading.

    Saludos y enhorabuena de nuevo por la magnifica entrada.

    Responder

Deja un comentario

ESTRATEGIAS DE TRADING