En numerosas ocasiones hemos hablado de la importancia de realizar backtests de calidad simulando escenarios múltiples, en lugar de evaluar las estrategias en series históricas que solo nos muestran una de las muchas configuraciones posibles de los mercados en un intervalo temporal dado. La principal ventaja de estos métodos es que aportan proyecciones más realistas del retorno y el riesgo a la vez que suponen un eficaz stress test de la propia estrategia.
Para
la realización de este tipo de análisis, al que denominamos enfoque multi-hilo, hemos investigado dos metodologías:
El Método de las Permutaciones Paramétricas (MPP), al que hemos dedicado los
artículos “Selección de parámetros y enfoques multiescenario (I) y (II)” (TradingSys,
2019), y el Método de las Series Sintéticas (MSS) del que hablaremos a
continuación. Cabe señalar que ambos métodos son complementarios y pueden emplearse
conjuntamente para evaluar en profundidad el potencial de cualquier estrategia
de trading.
Las
simulaciones del tipo MSS requieren cómputo intensivo y generan una enorme
cantidad de puntos de datos, por lo que el principal problema al que nos
enfrentamos es la automatización del procedimiento, y aquí las principales
plataformas de trading no nos lo ponen nada fácil. Todas ellas están diseñadas
con enfoque mono-hilo: Pueden hacer backtests, optimizaciónes paramétricas o
walk-forwards sobre los datos
históricos de un activo o portfolio, pero no ofrecen la posibilidad de
modificar fácilmente y de forma dinámica las series originales en base a
fórmulas específicas para construir n-series alternativas durante el proceso de
evaluación. En el presente artículo veremos cómo generar series sintéticas con
NT7, detallando el procedimiento empleado para ello y su implementación
práctica en la evaluación de
estrategias.
Como ya hemos visto en anteriores artículos el objetivo de las simulaciones multiescenario es someter la estrategia de trading a un conjunto de configuraciones de los mercados alternativas a las series históricas pero igualmente probables. Esto puede hacerse generando pequeños cambios aleatorios en las reglas de negociación o en las series históricas de precios. Veamos las ventajas e inconvenientes de ambos procedimientos:
a) Cambios en las reglas de
negociación.- Este enfoque se fundamenta en la idea de adaptabilidad de la lógica
a los mercados. Dado un conjunto n de
reglas y configuraciones paramétricas siempre existirá una combinación ni
que maximice el rendimiento de la estrategia en cada marcoépoca o
régimen específico de los mercados. Por tanto, al evaluar la variabilidad de
las reglas en un histórico dado, obtenemos una imagen precisa y realista de lo
que nos cabe esperar cuando el mercado evolucione en el tiempo entre fases
alcistas, bajistas, laterales, de alta y de baja volatilidad.
VENTAJAS:
DESVENTAJAS:
b) Cambios aleatorios en los
precios.- Con este segundo enfoque lo
que buscamos es crear series alternativas de precios que respeten las
propiedades estadísticas y dependencias seriales del histórico original. Como ya vimos en el artículo “Simulaciones
de Montecarlo alternativas” (Hispatrading,
nº 39) existen diversos métodos para generar series sintéticas de precios,
siendo el más empleado el remuestreo o bootstrapping,
que consiste en aleatorizar la secuencia de pecios en un proceso de Montecarlo
para obtener n series sintéticas con
las mismas propiedades estadísticas que la distribución original. Sin embargo,
se rompen las dependencias sérielas que dan pie a efectos de tipo estacional y
anomalías horarias. Las cuales en muchos casos son el fundamento de la lógica
de los sistemas. Para evitar este problema hemos optado por el método de
expansión y contracción de barras (ECB), consistente en añadir a los máximos,
mínimos y cierres de cada barra una pequeña cantidad de ruido aleatorio. De
este modo conseguimos generar pequeños cambios en las barras sin alterar las
relaciones de dependencia y obtener una distribución similar (aunque no
idéntica) a la del histórico original.
VENTAJAS:
DESVENTAJAS:
Como ya vimos en “Expediente
backtest. Parte V” (TradingSys. 2019) el método ECB genera alteraciones en los
valores O-H-L-C de cada barra introduciendo pequeños cambios aleatorios basados
en la volatilidad próxima (3-5 períodos anteriores). En lugar de utilizar el
ATR en bloque, la volatilidad se descompone en Up-Volatility (UV), medida desde el cierre de la barra anterior al
máximo de la siguiente, y Down-Volatílity
(DV), hasta el mínimo de la siguiente. Posteriormente
se genera un número aleatorio basado en dicha volatilidad de contexto que es lo
que se suma o resta a cada barra de la serie original.
El modelo con anclaje es
el más simple; los pequeños cambios se aplican de manera independiente para
cada barra. Este modelo tiene la ventaja de ser más fiel al histórico, pero a
cambio de generar menos diversidad. En el modelo
sin anclaje los cambios son
acumulativos. Esto produce un distanciamiento aleatorio y progresivo de la
serie original que debe ser corregido reiniciando el anclaje cada x períodos.
La traslocación de barras es un método complementario a los dos anteriores que consiste en aleatorizar las n barras contiguas y el proceso aleatorio se aplica secuencialmente sobre cada grupo. El tamaño de los grupos debe elegirse cuidadosamente en función del time frame y otras características del gráfico. En todo caso debe ser pequeño para no eliminar las dependencias seriales derivadas de efectos de calendario y pautas horarias.
A) Coeficiente aleatorio único: En cada barra se calcula una fracción única del ATR que se suma o resta a cada punto de datos de tal modo que:
AleatFR =
Rand.Between (ATR(x)*-1, ATR(x))* coef (0,1)
NewClose[0]
= Close[0] ± AleatFR
NewHigh[0] = High[0] ± AleatFR
NewLow[0]
= High[0] ± AleatFR
Este modelo tiene dos parámetros: El número (x) de barras para el cálculo del ATR y el valor del coeficiente (coef) que determina el nivel de ruido exigido en la simulación.
B) Coeficiente aleatorio múltiple: Discriminamos entre volatilidad ascendente y descendente para máximos y mínimos. Para el cierre tomamos como referencia la volatilidad entre los cierres de barras contiguas:
UpTicks = (High – Open) / TickSize → UpVolat = SMA(UpTicks, x)
DownTicks = (Open – Low) / TickSize → DownVolat = SMA(DownTicks, x)
CloseTicks = Abs(Close[1]-Close[0])/TickSize → CloseVolat (CloseTicks,x)
Para el cálculo de cada punto de datos utilizamos los siguientes coeficientes aleatorios:
HighA =
Rand.Between (UpVolat*-1, UpVolat)
LowA = Rand.Between
(DownVolat*-1, DownVolat)
CloseA = Rand.Between (CloseVolat*-1, CloseVolat)
Este proceso puede generar inconsistencias que
deben ser filtradas, como máximos menores
al cierre y mínimos mayores al cierre. Para solventarlo aplicamos el siguiente código:
if (High[0]+ HighA <
Close[0])
NewHigh[0] = Close[0]
else
NewHigh[0] = High[0]+
HighA
if (Low0] - LowA >
Close[0])
NewLow[0] = Close[0]
else
NewLow[0] = Low[0]-
LowA
NewClose[0] = CloseA + Close[0]
En el modelo con anclaje
de barra se asume ausencia de huecos en las aperturas y nuevos cierres:
NewOpen[0] =
NewClose[1]
@ TradingSys.org, 2019