En esta cuarta entrega de nuestra serie dedicada al backtesting nos centraremos en una cuestión clave del proceso de construcción que, en muchos casos, se minimiza o no se entiende adecuadamente: Las variables, los parámetros y los hiperparámetros que afectan a los procesos de evaluación y optimización de estrategias.
Todo sistema basado en reglas
incluye muchos más parámetros y variables que los meramente optimizables.
Normalmente prestamos atención solo a estos últimos y nos despreocupamos de
aquellos que están incluidos en las reglas como cantidades fijas u opciones
específicas de algunos indicadores. Tampoco solemos prestar atención a los
parámetros que no están vinculados al sistema pero que determinan la forma en
que este se optimiza y evalúa. En realidad todos ellos son relevantes ya que
contribuyen a incrementar el número de resultados alternativos o “historias
posibles” que puede adoptar el sistema al hacer un backtest.
En su excelente libro, Advances
in Financial Machine Learning, López de Prado afirma que la única forma de
saber si los resultados procedentes de un backtest
son fiables es conociendo el número de “trials” o ensayos previos que hemos
realizado con todas las configuraciones posibles de la estrategia hasta llegar
al resultado que se muestra. ¡Pero precisamente este es el dato que no revela
ningún desarrollador! Busquen en Internet, encontrarán cientos de páginas que
muestran sistemas con curvas delirantes, de una belleza obscena, y tablas de
resultados que, de ser ciertos, harían palidecer por incompetentes a todos los
profesionales de la industria. De hecho, lo que resulta difícil es encontrar
sitios con sistemas malos o del montón, sencillamente porque no se muestran.
Así que cuando vean una de estas maravillas, en lugar de quedarse embobados
frente a la pantalla, pregúntense: ¿Cuántos ensayos han sido necesarios para
llegar a ella? ¿Cuántas variantes con menos glamour
se han descartado? ¿Cuánto data mining
hay detrás de esa preciosidad?
Dicho esto, no resultará difícil
entender que cuantas más variables, parámetros e hiperparámetros estén involucrados en la realización de un
backtest mayor será la probabilidad de obtener unos resultados poco realistas. Entre
otras cosas porque el desarrollador tendrá a su disposición “más historias
posibles” entre las que elegir la que mejor encaje en su argumentario. Si es listo, quizá no se decante por el mejor
resultado, pero no les quepa duda de que mostrará, sobre todo si se trata de
vender un producto, alguno muy por encima de la mediana, posiblemente situado
en los percentiles más altos.
VARIABLES
Entendemos por variables de un
sistema todos aquellos símbolos incluidos en el código que pueden ser
reemplazados por valores numéricos, alfanuméricos, lógicos o de otros tipos susceptibles
de alterar el comportamiento de la estrategia.
Pongamos un ejemplo sencillo:
Entrar largo si:
EMA(High, 20) >= EMA(Close,
150) [Y] RSI(14,2) > 60 [Y] hora = 12:30.
Aquí tenemos diferentes tipos de variables:
Así que en una lógica de entrada
tan simple como esta tenemos al menos 12 variables distintas. Sin embargo,
desde el punto de vista de la optimización posiblemente se declaren solo 3
parámetros: Valores de las medias y nivel del filtro RSI.
Entonces, ¿Cómo se establecen las
demás variables ocultas en el código? Muy sencillo: En el 99% de los casos por
ensayo y error. El desarrollador va probando diferentes horarios de entrada,
medias, indicadores y operadores lógicos hasta que encuentra una combinación
que genera la mejor performance en un histórico dado.
A esto alguien podrá argumentar:
Mientras la estrategia se construya en una región del histórico y se evalúe en
otra diferente o en otros mercados, no hay problema. Pero en realidad sí que lo
hay: Nadie construye una estrategia en bloque y realiza una única evaluación.
La mayoría de los desarrolladores
realizan innumerables ensayos en la región In-sample
(IS) y pruebas de concepto en el Out-Sample
(OS). Cierto que no es lo mismo utilizar los datos del OS para construir la
estrategia que utilizarlos para verificar la lógica o evaluar nuevas versiones.
Pero si nos ponemos a realizar un número ilimitado de modificaciones y pruebas
de concepto, al final estaremos incurriendo en un proceso darwiniano no muy
diferente al de las plataformas de machinne
learning (ML). Se mire como se mire, cualquier versión final de un sistema
es el resultado de innumerables ensayos (trials)
tanto en el IS como en el OS.
Resumiendo, los valores de las
variables ni se deducen analíticamente ni salen de manera espontánea de la
cabeza del desarrollador. Son los que son debido a un proceso de selección que,
en muchos casos, implica también sobreoptimización.
PARAMETROS
Los parámetros son aquellas
variables susceptibles de modificación al realizar un backtest u optimizar una estrategia. Generalmente se asignan como
parámetros aquellas variables que afectan en mayor medida al rendimiento o que
generan mayor diversidad de cara a
implementar la estrategia en distintos time frames y mercados.
Revisando diversas publicaciones sobre el tema, en muy pocos sitios encontramos unas orientaciones básicas sobre implementación de parámetros y mucho menos una tipología de los mismos. Por lo que buena parte de lo que diremos a continuación se basa en nuestra propia experiencia. En la mayoría de los sistemas de trading podemos distinguir 3 tipos de parámetros:
Todos los parámetros de un
sistema afectan en mayor o menor medida al proceso de optimización y a la
diversidad de resultados que pueden obtenerse al aplicar la estrategia en
diferentes mercados y time frames.
Los parámetros continuos permiten establecer una horquilla operativa de valores máximo, mínimo y salto. Esta horquilla suele obtenerse por optimización, primero en la fase de diseño y luego de manera más detallada durante la evaluación In-Sample, dando lugar a los rangos paramétricos de la zona robusta. En el sistema ya mencionado, la zona robusta estaría formada, por ejemplo, por los valores 10-30 en saltos de 1 para la EMA corta y 50-300, en saltos de 10 para la larga. Al trader sistemático con cierta experiencia no se le escapa que esta práctica es problemática por los siguientes motivos:
Lo ideal sería deducir las
combinaciones paramétricas de manera analítica en lugar de emplear procesos de
optimización, por ejemplo mediante técnicas de control optimo estocástico;
resolviendo la función Hamilton-Jacobi-Bellman. (Véase Cartea A. et al.: Algorithmic
and High-Frequency Trading,
2015). Pero eso es demasiado complejo y no siempre es posible. Otra
posibilidad para minimizar el riesgo de sobreoptimización es emplear datos
sintéticos basados en las series históricas tanto para el diseño de las reglas
como para el cálculo de los valores paramétricos. Pero la construcción de estas
series tampoco está exentas de problemas y resulta bastante complejo justificar
que las nuevas series contienen todas las propiedades de la serie original,
como quizá veamos con más detalle en otros artículos.
La selección de parámetros
tampoco es una cuestión menor. Muchos autores se inclinar por incorporar el
menor número posible aduciendo que, de este modo, la estrategia se mantiene
simple al tiempo que se reduce el riesgo de sobeoptimizar. Pero esto no es del
todo cierto; escondiendo los parámetros debajo de la alfombra, al incorporarlos
como valores fijos en las reglas, no
estamos reduciendo en absoluto la complejidad estructural del sistema, sino ocultando
el hecho de que dichos valores proceden de optimizaciones previas. Lo que a su
vez aumentará la incertidumbre sobre el modo en que han sido obtenidos. A
menudo nos hemos encontrado sistemas con muchas variables ocultas que, al ser
convertidas en parámetros y optimizadas para el time frame y mercado que recomienda el desarrollador, convergen
milagrosamente a los valores de referencia. En definitiva, estamos ante una
mala praxis que, además, es contraproducente ya que un sistema con demasiadas
variables ocultas es mucho más rígido al ser implementado en una cesta amplia
de activos.
Algunos criterios a la hora de decantarse por parámetro o valores fijos son:
Las combinaciones paramétricas
generan diversidad y adaptabilidad, pero no permiten extraer alpha de una lógica defectuosa o carente
de fundamento en procesos o ineficiencias de los mercados. Por ello, al evaluar
una estrategia conviene diferenciar muy bien el retorno debido a la calidad de
la lógica de aquel que se obtiene por mera optimización intensiva de los
parámetros para un ratio diana o función objetivo.
Para evaluar esto recientemente
estoy utilizando una metodología que denomino Robust Parameter Permuitation (RPP). Básicamente consiste en generar
miles de curvas del equity combinando
aleatoriamente los valores paramétricos de la zona robusta. Los valores de
performance situados en la mediana de la distribución son los empleados como
referencia para estimar la calidad de la lógica o “rendimiento medio esperado”
(RME). Los valores situados varios percentiles por debajo representan las “combinaciones
paramétricas de mínimo rendimiento” (PMR) y los valores de los percentiles
superiores las de máximo rendimiento. Estas últimas nos darían el “rendimiento
máximo potencial” (RMP) del sistema al que solo es posible llegar optimizando y
que, obviamente, dará lugar a soluciones sobreoptimizadas y carentes de
realismo.
Con el cociente RME/RMP obtenemos el
porcentaje de retorno debido a la calidad de la lógica. Y está, en mi opinión,
constituye una forma bastante objetiva de comparar la calidad de sistemas con
independencia del número de parámetros que tengan.
HIPERPARÁMETROS
Este término, procede del machine learning (ML) y hace referencia a
los parámetros empleados en la configuración del modelo de backtest o del proceso de optimización. Aunque no se utilizan para
modelar los datos directamente ni sus valores se obtienen del histórico sí
afectan a los resultados obtenidos. Por ejemplo, en el caso de un sistema
basado en ML mediante redes neuronales,
los hiperparámetros serían el número de capas y neuronas de la red, el tipo de
propagación empleado, la función de ajuste, el porcentaje de datos dedicado al
entrenamiento y validación del modelo, etc.
En el caso de los sistemas
basados en reglas discretas los hiperparámetros son el conjunto de opciones que
se configuran en la plataforma al realizar la simulación histórica: Tipo de
backtest, plantilla horaria, modelo de llenado de órdenes, nivel de resolución,
número de entradas por lado, comisiones y deslizamientos, etc.
Los hiperparámetros nos
permitirán controlar el nivel de realismo de un backtest pero en ningún modo
sirven para mejorar la calidad de una estrategia dada o capturar alpha en los mercados. Sin embargo, una proliferación excesiva de
hiperparámetros también contribuye a aumentar el número de configuraciones
posibles, trials o ensayos a disposición desarrollador.
El diseño y evaluación de
sistemas es más un arte que una ciencia. Lo cual no quiere decir que los
desarrolladores carezcan de lógica y rigor. Resulta patético comprobar cómo
aquellos que nos venden con el mayor descaro formulas maravillosas para
enriquecernos de la noche a la mañana fundamentan sus hallazgos en presuntas investigaciones
y métodos de evaluación “científicos” extremadamente objetivos y precisos. Una
de las frases que más me gustaron del citado libro de López de Prado fue esta:
“A common misunderstanding is to think of backtesting as a research
tool. Researching and backtesting is like drinking and driving. Do not research
under the influence of a backtest”.
(Op. Cit.
p. 151).
Se puede decir más alto, pero no
más claro.
Andrés A. García.
© Tradingsys.org, 2018.