Ocasionalmente, algunos lectores me envían resultados estadísticos de sus sistemas para que los valore y les ayude a determinar su posible robustez en operativa real. Y una de las cuestiones que casi todos ellos quieren saber es si su estrategia está o no sobreoptimizada. En el presente artículo reflexionaré sobre esta cuestión desde un enfoque matemático y ofreceré una hoja de cálculo con la que podrán analizar fácilmente sus propias estrategias.
La primera cuestión que quiero dejar meridianamente clara es que la práctica totalidad de los sistemas que conozco incorporan reglas susceptibles de optimización. Poco importa, desde una perspectiva estadística, si tales reglas se concretan en parámetros optimizables (por ejemplo en backtest o walk-forward) o si se trata de variables con un valor predeterminado elegido por nosotros. El hecho es que el código de los sistemas está plagado de decisiones condicionales que limitan los grados de libertad de cada estrategia al ser aplicada en un histórico finito. Por tanto, todo sistema -independientemente de los parámetros que tenga- será susceptible de estar sobreoptimizado si no contamos, de entrada, con un número de operaciones muy superior al de restricciones (reglas, parámetros, variables) contemplados en su diseño.
Supongamos una estrategia intradiaria de cruce de medias como la que describí en mi anterior artículo. Aparentemente sólo tiene dos parámetros modificables en backtest (número de barras y valor del stop) pero, en realidad, incorpora numerosas decisiones ad hoc y variables que reducen los grados de libertad de la estrategia. Por ejemplo:
1- ¿Porqué ese tipo de medias y no otro entre todas las posibles alternativas?
2- ¿Porqué tales medias están construidas sobre una determinada serie de precios; máximo, mínimo, cierre, punto medio...?
3- Y qué pasa con las órdenes: ¿Por qué a mercado y no limitadas o en stop?
4- ¿Utilizo o no utilizo MM Stop? ¿Utilizo o no target profits?
5- ¿Qué horario de negociación empleo: RTH, todo el disponible, acotado entre dos intervalos horarios?
6- ¿Dará igual cualquier mercado, o el tipo de mercado elegido constituye también una variable crítica?
7- ¿Por qué el valor elegido para una media es de 250 barras?
Podríamos seguir y seguir... Y como pueden imaginar, la lista se hará interminable a medida que el sistema se hace más y más complejo.
A efectos prácticos, definiremos los gados de libertad (GL) como la diferencia entre el número de operaciones (N) en que se basan las estadísticas de nuestro sistema y las restricciones condicionales (RCD) que incorpora su código.
GL = N - RCD
Quizá uno de los principales problemas de este enfoque sea contar adecuadamente el número de restricciones del modelo, ya que aquí intervienen algunas apreciaciones subjetivas de difícil cuantificación. La mejor manera que se me ocurre es destripar el código a la caza de posibles elementos (filtros, indicadores, reglas de entrada, triggers de posicionamiento, variables temporales, mecanismos de cierre, etc.) que al ser modificados alterarían de manera significativa los resultados obtenidos.
Supongamos un sistema simple de tipo continuo, por ejemplo, El T-AT descrito por Tushar S. Chande en su libro Beyond Technical Análisis (Wiley, 2001, pp. 160-166).
Estas son sus reglas:
>> SI:
[1] Máximo actual > Valor Máximo (25, 1)
[2] ADX (18) < media ((18) del ADX (18))
>> ENTONCES:
VENDER en la apertura de mañana.
>> SI:
[3] Mínimo actual < Valor Mínimo (25, 1)
[4] ADX (18) > media ((18) del ADX (18))
>> ENTONCES:
COMPRAR en la apertura de mañana.
¡Qué bonito, verdad! Simétrico, sencillo y con muy pocas variables. ¡Ojala fuese la ansiada piedra filosofal que todos buscamos! Aunque, para que les voy a engañar, lo dudo...
Bien, procedamos a contar las restricciones condicionales implícitas y explicitas de esta bella estrategia:
a) ¿Por qué se elige el máximo actual?
b) ¿Por qué se compara este valor con el máximo de 25 sesiones?
c) ¿Por qué se exige (en el condicional) que uno sea mayor que otro?
a) Queda claro que el valor del ADX es un parámetro; en lugar de 18 barras, podrían haber sido 29, 57 o vaya usted a saber...
b) Por qué se ha elegido precisamente el indicador ADX y no otro.
c) La media de 18 sesiones, ¿Será una SMA o, quizá mejor una EMA?
d) Nuevamente aparece esta media aplicada al ADX. ¿Pero, que ocurriría si la quitamos?
e) La condición "<", en sí misma, es otra restricción.
Y qué ocurre con la orden de venta: ¿Por qué tiene que ser en la "apertura de mañana"? ¿No variará nuestra estadística si la aplicamos en el cierre o en el punto medio de la barra? Está claro, otra restricción.
Como estamos ante un sistema simétrico las mismas restricciones valen para la operación de compra.
Entonces, ¿cuantas RCD tenemos para esta estrategia?: Aproximadamente unas 20 restricciones implícitas y explícitas afectarán, en este caso, a los grados de libertad del sistema. Lo que implica, que debemos disponer de un trackrecord de bastantes más operaciones para evitar su sobreoptimización, considerando un nivel de confianza de, al menos, el 95%.
Recuerdan la ecuación del SQN (System Quality Number) desarrollada por Van Tharp:
SQN = (Promedio R / Desviación R) * Raíz núm. Ops.
SQN = Sharpe Simplificado * Raíz núm Ops.
Pues bien, ahora podemos rescribirla de manera más precisa como:
SQN = Sharpe Simplificado * Raíz de GL (grados de libertad)
Para entender esta cuestión de manera más intuitiva voy a emplear la estupenda analogía descrita por Mike Bryant (el diseñador del software MSA) en su artículo: "The Analogy of System Optimization to Least Squares Regression" (Breakout Bulletin, Mayo, 2003):
Supongamos que nuestro problema es construir la línea de regresión que mejor se adapte a los puntos de un gráfico (cada punto podría ser una operación) que definen una determinada curva (podrá ser el Equity curve de un sistema). Considerando la pendiente (m) y el punto de intercepción (b), podemos emplear una ecuación lineal del tipo: y = m*x + b, donde "m" y "b" son los parámetros que nos permitirán ‘optimizar' esta recta.
Pues bien, cuestión para alumnos de la ESO: ¿Si queremos obtener un ajuste máximo -sobreoptimización, en este caso- (o sea, R2 = 1), ¿Cuántos puntos deberá tener la recta?
- Salta a la vista que sólo dos.
Si la curva tiene más puntos (x1, y1) (x2, y2) ... (x6, y6), por mucho que optimicemos "m" y "b" jamás llegaremos al odiado ‘over-fitting'.
En este sencillo ejemplo, la ecuación empleada sería el equivalente a un sistema de trading con dos parámetros optimizables ("m" y "b") que, -al no tener otras ‘reglas'- sólo contiene dos restricciones condicionales. ¿Les va pereciendo ya este planteamiento similar a nuestro problema?
Bien, pues vean ahora estos gráficos:
Supongamos que representan un pequeño histórico con los siguientes valores (200, 100, 240, 150, 130 y 430), y nuestro propósito es construir un modelo óptimo que capture la tendencia de la curva. Como ahora somos estudiantes de estadística y no de expertos en análisis técnico, recurrimos a ecuaciones simples en lugar de indicadores, bandas de volatilidad o niveles de Fibonacci.
Probamos primero con una regresión lineal (Gráfico 1), y obtenemos la mejor solución para la ecuación con los valores:
y = 42,857x + 7,1429
Y, efectivamente, la línea dibuja, groso modo, la tendencia alcista del histórico.
No hay acople y, por tanto, tampoco sobreoptimización. Pero, como el coeficiente de determinación (R2 = 0,47) resulta demasiado bajo, tampoco puede decirse que este modelo tenga un alto valor predictivo.
No importa, recurrimos ahora a curvas más complejas y elegimos una regresión polinómica del tipo:
y = c + c1x + c2x2 + c3X3 + ...+ cpxp
Al ir añadiendo potencias de x aumentará la flexibilidad del modelo (o su grado de acople a la curva de datos). Pero claro, esto es lo mismo que añadir más parámetros o restricciones condicionales al modelo. De este modo tenemos:
P =1 → Recata de regresión (dos restricciones)
P = 2 → Regresión cuadrática (tres restricciones)
P = 3 → Regresión cúbica (cuatro restricciones) ...
En el segundo gráfico (p = 3) la curva polinomial muestra un grado de ajuste mucho más exacto y encuentra una solución óptima en:
y = 12,5x3 - 144,76x2 + 513,45x - 380
Como nuestro gráfico consta de siete valores (pues el punto de origen 0,0 también cuenta), con una polinomial cúbica todavía no se consigue una optimización completa, si bien el coeficiente R2 se dispara hasta 0,8 indicando un notable incremento del ‘potencial explicativo' del modelo.
En el tercer gráfico (p = 5) ya estaríamos en el umbral la sobreoptimización.
Esta es la ecuación de la curva:
y = 4x5 - 77,462x4 + 565,23x3 - 1925,4x2 + 3037,9x - 1601,4
El grado de acople es elevadísimo (R2 = 0,93) Y, por supuesto, en este caso con P >= 6, el ajuste es máximo: R2 = 1. ¡Los grados de libertad se han esfumado!
Con lo que, en este punto, cabe la pregunta: ¿Qué explica ahora el modelo: El ruido de fondo o la tendencia principal? Y esta es, en mi opinión, la clave para entender la sobreoptimización en los sistemas de trading.
Cuando el número de restricciones condicionales disminuye al máximo los grados de libertad inherentes al binomio sistema / mercado, la estrategia (al optimizar en backtest) se adaptará tan bien al histórico de cotizaciones que acabará perdiendo buena parte de su potencial predictivo y, por ello, los resultados que -para nuestra frustratción- obtendremos en operativa real serán mucho peores. En otras palabras, el modelo de trading se ajustará como un guante al histórico empleado, pero estará prácticamente ciego a ulteriores variaciones en la secuencia de las formaciones de precios.
Bryant, a partir de los trabajos de Babcock y otros autores ha diseñado un sencillo procedimiento para detectar sistemas sobreoptimizados. El punto de partida es la ecuación:
IC = (t * SD / Raiz (N))
Donde IC define un intervalo de confianza para un determinado BMO (Beneficio medio por operación), t es el valor del estadístico t de Student en la secuencia de operaciones, SD su desviación estándar y N el número de operaciones. El valor de t depende de los grados de libertad (N - RCD) y del nivel de confianza asignado.
Una vez determinado el intervalo de confianza, podemos calcular los límites superior e inferior del BMO como:
BMO + IC (Mejor expectativa de beneficio medio)
BMO - IC (peor expectativa)
Este último es el que nos interesa, pues si BMO < IC entonces podremos inferir con una "razonable" (vean que le he puesto comillas) certeza estadística que el sistema está sobreoptimizado.
Alternativamente, en lugar del BMO podríamos emplear como criterio diana otros ratios del sistema y evaluar sus márgenes de fluctuación a partir de un intervalo de confianza. Sin embargo, a mi el beneficio medio me resulta especialmente útil ya que empleo sistemas intradiarios muy intensivos en operaciones, con baja dispersión de resultados y una ganancia media por negocio bastante ajustada. Y que, por añadidura, es muy sensible a deslizamientos.
Bien, pues basándome en el procedimiento descrito he construido una hoja de cálculo que, en algunos aspectos, considero mejora la información facilitada por el programa MSA.
Para evaluar la posible optimización de un sistema sólo tendremos que introducir en las celdas de la columna C los siguientes datos:
BMO: Beneficio medio por operación cerrada.
Nº Ops.: Número de operaciones de la serie de datos a evaluar.
RCD.: Restricciones condicionales del sistema, calculadas del modo que hemos indicado.
Std. DEV: Desviación estándar de la secuencia de operaciones.
N. Conf.: Nivel de confianza que asignamos al estadístico (valores entre 0 y 1) En la mayoría de los casos con un nivel del 95% será suficiente.
Los resultados del test se muestran en la columna E. Si resultan óptimos según las reglas especificadas, las celdas aparecerán coloreadas en verde. En caso contrario aparecerán en rojo.
IC+: Valor del intervalo de confianza. Cuanto más grande peor (mayor nivel de indeterminación) y cuanto más próximo al BMO peor (mayor riesgo de sobreoptimización).
P-BMO: Peor escenario del beneficio medio por operación. Cuando este valor es de tan solo un 20% del BMO se encienden las alarmas (celda en rojo). Cuando es negativo, grave riesgo de sobreoptimización.
RES: Respuesta global del test: OK; el sistema pasa la prueba (celda en verde) NP; el sistema no pasa la prueba (celda en rojo).
OEO: Número mínimo estimado de operaciones necesarias para evitar la sobreoptimización. Observarán que este dato fluctúa ligeramente debido a que incorpora como input el valor de t (viéndose afectado sobre todo del nivel de confianza) Por tanto, su valor exacto sólo puede calcularse de manera recursiva. Sin embargo, suele dar una estimación bastante aproximada considerando los datos de entrada.
T.Test: Es el valor del estadístico de Student para este modelo. En sistemas robustos y con un buen número de operaciones debería situarse en torno a 2 (para un nivel de confianza del 95%). En cualquier caso, cuanto más bajo, mejor.
Por último, he incluido una matriz de observaciones que especifican mejor la valoración que puede hacerse de cada sistema objeto de estudio a partir de los datos obtenidos.
Como de costumbre, la hoja Excel (Test EP) está a disposición de los usuarios registrados de esta web en la sección de descargas.
En fin, espero que les guste y me agradaría mucho conocer sus ideas sobre este tema y algunas sugerencias para mejorar este pequeño "test de evaluación paramétrica".
Andrés A. García.
© tradingsys.org, 2009.