Con esta metodología veremos cómo mejorar nuestro sistema de trading sin caer en los típicos errores de la sobreoptimización.
A la hora de mejorar un sistema de trading, suele ser habitual el hacerlo introduciendo nuevas reglas y/o filtros de trading que pulan el comportamiento de nuestro sistema. Sin embargo, la introducción de tales reglas y/o filtros suele conllevar consigo, a su vez, un aumento en los parámetros del sistema, con el consiguiente riesgo de overfitting que ello puede acabar suponiendo.
Ni qué decir tiene, en este punto, que el overfitting, sobreajuste o sobreoptimización constituye el mayor enemigo de cualquier optimización y backtesting, dado que conduce a la pérdida de las “propiedades predictivas futuras” de cualquier estrategia de trading. Es por ello que, el asunto de cómo mejorar un sistema de trading sin incurrir en un defecto de overfitting, no puede ni debe considerarse, en modo alguno, un tema baladí.
Aunque parezca que la adición de parámetros a un sistema suponga siempre un aumento del riesgo potencial de overfitting, existe sin embargo una excepción a ello, a saber, la del perfeccionamiento de un sistema de trading desarrollando a partir de él lo que podríamos denominar un “metasistema de trading”. Pero, ¿qué es un metasistema de trading?…
La palabra “metasistema” deriva del griego “meta”, que significa “más allá de” o “después de”, y del término “sistema”. De acuerdo con esto, por “metasistema de trading” debemos entender un tipo muy específico de sistema de trading que conceptualmente va más allá del concepto convencional de sistema, y ello debido a su particular naturaleza y filosofía de construcción, las cuales son diferentes de la de los sistemas de trading convencionales.
Como ya sabemos, un sistema de trading no es más que una estrategia de trading basada en un conjunto de reglas matemáticas objetivas susceptibles de ser programadas en alguna plataforma de trading. En cambio, un metasistema de trading es también una estrategia de trading, sólo que, en lugar de estar basada en un único conjunto de reglas matemáticas objetivas, lo está en varios conjuntos independientes de reglas matemáticas objetivas.
Como vamos a ver a continuación, se puede considerar un metasistema como una especie de macroestrategia global equivalente a una cartera de sistemas independientes. Si bien, mientras en una cartera de sistemas existe algún criterio de optimización de cartera que pesa de modo diferente a cada sistema, en un metasistema no existe tal cosa (salvo que no nos importe aumentar el riesgo de overfitting introduciendo también en el funcionamiento del sistema una dependencia con algún criterio de optimización de cartera).
A modo de ejemplo, supongamos una estrategia de trading basada en el siguiente conjunto de 4 reglas matemáticas objetivas:
REGLA 1
Entramos largos a mercado si el precio de cierre de una barra está por encima del valor de una media móvil de período P.
REGLA 2
Entramos cortos a mercado si el precio de cierre de una barra está por debajo del valor de una media móvil de período P.
REGLA 3
Salimos de la posición larga con X puntos de beneficio.
REGLA 4
Salimos de la posición corta con Y puntos de beneficio.
Precisamente porque esta estrategia está basada en un único conjunto de reglas, es lo que denominamos un sistema de trading. Pero si, en lugar de ello, hubiéramos dividido este único conjunto de 4 reglas en dos subconjuntos independientes de 2 reglas de trading por subconjunto, de tal manera que el primer subconjunto fuera el formado por las reglas 1 y 3 mencionadas líneas más arriba, y el segundo por las reglas 2 y 4, entonces pasaríamos a tener un metasistema al unir en un sólo código de programación ambos subconjuntos de reglas.
En este punto, es posible que más de un lector se sienta desorientado, pues aparentemente el procedimiento mencionado para crear el metasistema de nuestro ejemplo va a tener el mismo código de programación que el sistema de 4 reglas del que deriva. Sin embargo, existe una sutil diferencia que da lugar a que no sea exactamente así, y dicha sutil diferencia tiene que ver con que hagamos o no verdaderamente independientes a los 2 subconjuntos de reglas. Sólo si lo son, nuestro código no será el mismo que el sistema de 4 reglas, habiendo desarrollado así, entonces, un metasistema de trading.
A fin de profundizar en la idea de independencia de reglas, que es la clave para poder crear un metasistema, volvamos a nuestro ejemplo. En el caso del sistema de 4 reglas tenemos una estrategia que podemos considerar dependiente de 3 parámetros: el período P de la media móvil, el stop profit X de las posiciones largas, y el stop profit de las posiciones cortas. Debido a ello, de la correcta combinación de estos 3 elementos o parámetros dependerá el buen funcionamiento del sistema, por lo que a la hora de testear esta estrategia con su backtesting pertinente buscaremos la mejor combinación de valores de estos 3 parámetros.
Pero fijémonos en lo que ocurre con el metasistema que hemos derivado de este sistema de 3 parámetros. Nuestro metasistema está formado por 2 subconjuntos de reglas (a los que de ahora en adelante nos referiremos también como “subsistemas”). El primero de ellos, el basado en las reglas 1 y 3, podemos considerar que tiene tan sólo 2 parámetros: el período P1 y el stop profit X1 de las posiciones largas; en tanto que el segundo de ambos, el basado en las reglas 2 y 4, poseerá otros 2 parámetros, aunque diferentes: el período P2 y el stop profit X2 de las posiciones cortas, por lo que el metasistema poseerá 2 + 2 parámetros: 4.
Ahora bien, puesto que en un metasistema cada subsistema debe ser independiente del resto de subsistemas, el buen funcionamiento del metasistema no dependerá jamás de la combinación de estos 4 parámetros, sino de la correcta combinación de los 2 parámetros del primer subsistema y, por separado, de la también correcta combinación de los 2 parámetros del segundo subsistema. Por lo que, a la hora de testear el metasistema, jamás testearemos un código de programación de 4 parámetros. En su lugar, testearemos por un lado el código del primer subsistema de 2 parámetros, y por otro, el del segundo subsistema.
Esto es exactamente lo mismo que hacemos cuando tenemos una cartera de 2 sistemas independientes de 2 parámetros cada uno, en donde cada sistema es testeado de modo independiente con total rigurosidad científica. De hecho, y del mismo modo que también ocurre al unir en un sólo código los subsistemas de un metasistema, si cada uno de los sistemas de una cartera funciona bien de modo independiente, también lo hará en combinación con los demás en la cartera, aunque no se les haya asignado a cada sistema pesos diferentes con arreglo a algún criterio de optimización de cartera.
Es más, incluso como también ocurre con un metasistema, dado que cada sistema de una cartera de sistemas es independiente de los demás, la macroestrategia global que representa una cartera no puede decirse que sea equivalente a una macroestrategia dependiente de tantos parámetros como en total sumen los de todos los sistemas. Después de todo, a nivel de funcionamiento, tal macroestrategia no presenta ninguna dependencia con todos los parámetros combinados a la vez.
Así pues, puede concluirse que un metasistema es como una cartera de subsistemas independientes unidos en un sólo código de programación después de haber sido testeados con total rigurosidad por separado y habiéndose comprobado que, también por separado, presentan un comportamiento interesante (aunque no sea todo lo perfecto que desearíamos).
¿Y cómo podemos aprovechar la filosofía de los metasistemas para perfeccionar un sistema? Volviendo a nuestro ejemplo, del sistema original de 4 reglas y 3 parámetros hemos derivado un metasistema formado por 2 subsistemas independientes de 2 parámetros cada uno.Si cada uno de dichos 2 subsistemas lo mejoramos añadiéndole por separado algún filtro dependiente, por ejemplo, de un único nuevo parámetro, el resultado será que cada subsistema tendrá ahora el mismo número de parámetros que el sistema de 4 reglas. Por lo que en términos del riesgo potencial de overfitting, cada subsistema tendrá el mismo riesgo (medido en número de parámetros) que el sistema de 3 parámetros.
Y lo mejor de esto es que, dado que hemos añadido un filtro, al unir ambos subsistemas independientes en un sólo código para formar un metasistema, el resultado probable de ello será que el metasistema así creado se comporte mejor que el sistema original de 3 parámetros del que lo hemos derivado. Por consiguiente, sin haber aumentado el riesgo de overfitting habremos mejorado el sistema original de 4 reglas. Y ello a pesar de que, paradójicamente, habremos acabado desarrollando un código de programación de 3 + 3 = 6 parámetros.
Si bien, resulta evidente, a la luz de lo expuesto hasta aquí, que tal paradoja es aparente, pues lo que habremos creado por este procedimiento será algo equivalente a haber creado una cartera de 2 sistemas independientes que individualmente funcionan y que en su funcionamiento poseen tan sólo una dependencia de 3 elementos o parámetros.
¿Y por qué es tan importante que el funcionamiento de algo dependa de cuantos menos elementos posibles mejor? Es decir, ¿por qué es tan importante no aumentar el riesgo de overfitting mediante el aumento de parámetros? Para responder a esta pregunta, permítasenos comparar un cohete espacial de la NASA con el famoso iPhone de Apple. El buen funcionamiento de un cohete espacial depende de bastantes más elementos de los que posee un iPhone, por lo que a un ingeniero le resultará más fácil evitar que funcione mal un iPhone que un cohete espacial. De hecho, la dependencia entre sí de todos los elementos de un cohete espacial puede llegar a ser en algunos casos tan extrema que, un simple tornillito mal enroscado, puede mandar al traste toda una misión espacial completa con dicho cohete.
Por supuesto, el hecho de que un cohete espacial dependa de muchos más elementos que un iPhone no implica necesariamente que el iPhone esté mejor construido y sea mejor desde el punto de vista tecnológico que un cohete de la NASA, sólo que en el caso de un cohete es más fácil que no lo construyamos bien y que falle.
Volviendo otra vez a los metasistemas, una propiedad muy interesante de éstos es que, como si fueran sistemas biológicos que se adaptan a su entorno, poseen la virtud de adaptarse hasta cierto punto al mercado en caso de desaparecer algunas de las ineficiencias de las que se alimentan para obtener rentabilidad. Para entender esta propiedad, partamos de un caso real: el sistema Omicron 3 Euro de GesTrading.
Este sistema es en realidad un metasistema formado por 3 subsistemas independientes. Fue creado a partir del sistema Omicron 2 Euro con objeto de, de una parte, mejorar su comportamiento, y de otra, eliminar su sensibilidad al slippage y comisiones, pues el sistema funciona bien sólo en el mundo institucional, en el cual las comisiones de brokerage pueden llegar a ser incluso ridículas.
Como el lector puede imaginarse, la transformación del Omicron 2 en el metasistema Omicron 3 permitió cumplir con los objetivos que motivaron el desarrollo de este metasistema. Sin embargo, el precio a pagar por ello ha sido el de no poder seguir usando el peor drawdown como referencia para determinar cuándo es posible que el metasistema deje de funcionar.
Profundicemos en esta idea. En un sistema convencional, si el sistema rebasa x veces su peor drawdown podemos considerarque lo más probable es que haya dejado de funcionar, por lo que detendremos la operativa con él (no entramos ahora en los criterios estadísticos que conducen al valor exacto de x). En cambio, en un metasistema su peor drawdown no es ya una buena referencia para determinar con suficiente precisión cuándo detener la operativa, siendo los peores drawdowns individuales de cada subsistema la referencia correcta.
En efecto, pues recordemos que un metasistema es equivalente a una cartera de subsistemas. Por ello, del mismo modo que en una cartera de activos no se debe detener necesariamente la operativa por haberse rebasado x veces un determinado drawdown, tampoco con un metasistema se deberá detener la operativa por haberse rebasado x veces un determinado drawdown. Y de modo semejante a como en períodos de mal funcionamiento de una cartera lo que se hace es eliminar aquellos activos que ya no funcionan, también en un metasistema se deben eliminar de su código aquellos subsistemas que ya no funcionen.
Sólo si todos ellos dejan de funcionar, pararemos completamente la operativa con el metasistema. Pero en caso de que no todos ellos fallen, seguiremos operando solamente con aquellos subsistemas que sigan generando rentabilidad de modo sostenido en el tiempo. Y puesto que el parar o no un subsistema se puede decidir en términos de su peor drawdown (si es rebasado x veces), deben ser los peores drawdowns de cada subsistema y no el peor drawdown del metasistema los que debamos tomar como referencia para estudiar qué hacer en cada momento con un metasistema.
Como ocurre también en muchas carteras de sistemas, debido precisamente a que cada subsistema de un metasistema es independiente del resto, es simplemente una cuestión de probabilidades el que, aunque no haya sucedido en el pasado, todos los subsistemas de un metasistema se pongan de acuerdo para entrar en drawdown con tan mala suerte que, aunque ninguno de ellos rebase su peor drawdown, entre todos ellos generen un nuevo peor drawdown.
Esto es precisamente lo que ha sucedido con el Omicron 3 Euro recientemente, pues aunque ninguno de los subsistemas que lo conforman haya rebasado su respectivo peor drawdown (-3.714 $, -3.425 $ y -7.951 $) y no exista por ello razón alguna para desconfiar del metasistema y detenerlo, individualmente tales subsistemas están en drawdown (-291 $, -1.888 $ y -4.600 $, respectivamente), lo cual ha dado lugar a un nuevo peor drawdown para el metasistema de -5.400 $ (recuérdese en este punto que la suma de los drawdows individuales no es igual al drawdown de una cartera, pues entre todos ellos diversifican).
Ergo, en el caso del Omicron 3 Euro, no existe motivo alguno para detener el metasistema, pues su comportamiento entra dentro de lo normal de acuerdo con lo que suele ser habitual que tenga como drawdown cada subsistema por separado. Es más, cada uno de los 3 subsistemas del Omicron 3 Euro está aún lo suficientemente lejos de su peor drawdown, por lo que no hay razón para alarmarse por haberse generado un nuevo peor drawdown en el Omicro 3 Euro. Incluso podría seguir creciendo el peor drawdown del metasistema y seguir funcionando bien el metasistema por no haber dejado de funcionar ninguno de sus subsistemas.
Pero, ¿qué ocurriría si un buen día desaparecieran las ineficiencias de las que se alimenta uno de los 3 subsistemas del Omicron 3 Euro y dejase de funcionar por ello para siempre dicho subsistema (algo que sabríamos en base al drawdown del subsistema)? Sencillamente que el metasistema Omicron 3 Euro lo transformaríamos manualmente en un nuevo metasistema formado por los dos restantes subsistemas (los que continuasen funcionando). Por lo que, aunque el nuevo metasistema así creado obtendría en principio menor rentabilidad en promedio, continuaría conservando su capacidad de generar rentabilidad. Y ello a pesar de haberse producido un profundo cambio en el mercado consistente en la desaparición de ineficiencias.
Luego, en caso de desaparición en un mercado de parte de sus ineficiencias, un metasistema poseerá la propiedad de adaptarse, hasta cierto punto, a dichos cambios de comportamiento en el mercado. Y aunque ésta adaptación no es todo lo perfecta que uno desearía, no deja de ser reseñable como virtud, lo cual supone una razón más para trabajar con metasistemas. Después de todo, si las ineficiencias en las que se basa el buen funcionamiento de un sistema convencional desaparecieran para siempre, dicho sistema dejaría de funcionar para siempre. Sin embargo, si lo mismo sucediera con un metasistema, no necesariamente nos habríamos quedado sin metasistema para hacer trading y seguir haciendo dinero con los movimientos de los mercados, que es en definitiva lo que todos buscamos con una estrategia de trading, sea del tipo que sea…