Estás leyendo la publicación: El método de validación cruzada de purga combinatoria: hacia la IA
Publicado originalmente en Hacia la IA, la empresa líder mundial en noticias y medios de IA y tecnología. Si está creando un producto o servicio relacionado con la IA, lo invitamos a considerar convertirse en patrocinador de la IA. En Hacia la IA, ayudamos a escalar las empresas emergentes de IA y tecnología. Permítanos ayudarlo a dar rienda suelta a su tecnología a las masas.
Este artículo está escrito por Berend Gort & bruce yang, miembros del equipo central del proyecto de código abierto AI4Finance. Este proyecto es un fuente abierta comunidad compartiendo herramientas de IA para finanzas y una parte de la Universidad de Columbia en Nueva York. Enlace GitHub:
Cuaderno colaborativo
Introducción
Este artículo analiza un método sólido de backtesting para datos de series temporales denominado método de validación cruzada (CV) PurgedKFold. En Internet, hay información limitada sobre el método PurgedKFoldCV. Hay códigos existentes, excepto que no se explican sus usos. La idea de PurgedKFoldCV está bien descrita en Lopez de Prado, M. (2018) en Advances in financial machine learning. Por lo tanto, en este artículo, le mostraremos cómo obtener su PurgedKFoldCV de manera correcta.
Por qué falla la validación cruzada tradicional
Muchos artículos en el campo muestran resultados prometedores en los métodos de validación cruzada (CV) k-fold. Su abundancia es tan grande en Internet que ya casi no se pueden encontrar métodos más específicos.
Tal vez usted está aquí ahora y ha leído un montón de literatura que el currículum k-fold tradicional funciona bien. Sin embargo, es casi seguro que esos resultados tienen la culpa. Razones:
- Debido a que no se puede esperar que las observaciones se extraigan a través de un proceso IID, k-fold CV falla en finanzas.
- Otra causa de la falla de CV es que el conjunto de prueba se emplea varias veces durante el desarrollo de un modelo, lo que da como resultado un sesgo de selección y prueba múltiple.
Centrémonos en el argumento de la primera parte. Cuando el conjunto de entrenamiento contiene información que aparece en el conjunto de prueba, se produce una fuga. Los datos de series temporales a menudo se correlacionan en serie, como los datos criptográficos Open-High-Low-Close-Volume (OHLCV). Considere el siguiente ejemplo de una característica X correlacionada en serie que está vinculada a las etiquetas Y en función de la superposición de datos:
- Observaciones correlacionadas en serie. Eso significa que las siguientes observaciones dependen del valor de la observación actual.
- Las etiquetas de destino se derivan de puntos de datos superpuestos. Por ejemplo, tenemos una etiqueta objetivo en 10 muestras en el futuro, determinando si el precio baja, permanece igual o sube. Nuestro objetivo es etiquetar esto [0, 1, 2]. Este etiquetado se realiza sobre valores futuros.
Por lo tanto, cuando colocamos estos puntos de datos en diferentes conjuntos, filtramos información de un conjunto a otro. Prevengamos esto.
- Purga: antes de un conjunto de prueba, después de un conjunto de tren, retire 10 muestras del conjunto de tren de manera que no se produzcan fugas del conjunto de tren al conjunto de prueba.
- Embargo: para casos en los que la purga no logra evitar todas las fugas. Después de un conjunto de prueba, retire una cantidad entera de muestras del conjunto de trenes antes de un conjunto de trenes.
Método de prueba retrospectiva de caminar hacia adelante
La metodología walk-forward (WF) es el método de backtest más utilizado en la literatura. WF es una simulación histórica del desempeño de la estrategia en el pasado. Cada decisión estratégica se basa en la información recopilada antes de tomar la decisión.
WF disfruta de dos ventajas clave:
- WF tiene una interpretación histórica clara y con un rendimiento comparable al comercio de papel.
- La historia es una filtración; por lo tanto, el uso de los datos del punto final garantiza que el conjunto de prueba esté completamente fuera de la muestra (OOS).
Y tres desventajas principales:
- Solo se prueba un único escenario, que se sobreajusta fácilmente.
- WF no es representativo del rendimiento futuro, ya que los resultados pueden estar sesgados por la secuencia particular de puntos de datos (por ejemplo, solo probar en una tendencia alcista significativa).
- La tercera desventaja de WF es que las decisiones iniciales se toman en una porción más pequeña de la muestra total.
El método de validación cruzada
Los inversores a menudo preguntan cómo se comportaría una estrategia si estuviera sujeta, por ejemplo, a la crisis de 2008. Una forma de responder es dividir la observación en conjuntos de entrenamiento y prueba, donde el conjunto de entrenamiento está fuera de la crisis de 2008 y el conjunto de prueba experimenta exactamente la crisis.
Por ejemplo, un clasificador podría entrenarse desde el 1 de enero de 2009 hasta el 1 de enero de 2017 y luego evaluarse desde el 1 de enero de 2008 hasta el 31 de diciembre de 2008. Debido a que el clasificador fue entrenado con datos a los que solo se podía acceder después de 2008, el rendimiento que adquiriríamos para 2008 no es históricamente correcto. Sin embargo, el propósito de la prueba no era la precisión histórica. El objetivo de la prueba era poner un enfoque inconsciente de 2008 a través de una situación estresante similar a la de 2008.
El objetivo del backtesting a través de la validación cruzada (CV) no es obtener un rendimiento históricamente preciso, sino inferir el rendimiento futuro de varios escenarios fuera de la muestra (OOS). Para cada período del backtest, simulamos el desempeño de un clasificador que sabía todo menos ese período.
Es por eso que Amazon se ha obsesionado con el precio, la selección y la disponibilidad desde el primer día y todavía lo hace hoy. Ventajas del método CV:
- La prueba no se basa en un escenario (histórico) específico. CV evalúa k escenarios diferentes, de los cuales solo uno coincide con la secuencia histórica.
- Cada juicio se basa en grupos de igual tamaño. Como resultado, los resultados pueden compararse entre períodos con respecto a la cantidad de datos necesarios para tomar decisiones.
- Cada observación es parte de uno y solo un conjunto de prueba. No hay un subconjunto de calentamiento, lo que permite la simulación fuera de muestra más amplia posible.
Desventajas del método CV:
- Se simula una única ruta de backtest, similar a WF. Por observación se genera un único pronóstico.
- CV carece de un contexto histórico sólido. El resultado no representa cómo se desempeñó la estrategia en el pasado, sino cómo podría funcionar en el futuro bajo diversas condiciones de estrés (un resultado útil por derecho propio).
- La fuga es posible porque el conjunto de entrenamiento no sigue al conjunto de prueba.
- Evite filtrar el conocimiento de las pruebas en el conjunto de entrenamiento, se debe tener mucho cuidado
El algoritmo de backtesting de validación cruzada de purga combinatoria
CPCV proporciona el número exacto de combinaciones de conjuntos de entrenamiento/prueba necesarios para construir un conjunto de rutas de backtesting mientras purga las observaciones de entrenamiento que contienen información filtrada, dado un conjunto de rutas de backtesting objetivo del investigador.
Primero, tenemos nuestros datos, digamos 1000 puntos de datos. Imagine que queremos dividir esos 1000 puntos de datos en 6 grupos. De estos 6 grupos, queremos 2 grupos de prueba (figura a continuación).
¿Cuántas divisiones de datos son posibles? Eso es nCr(6, (6–2) ) = 15. Consulte la figura 1.
Cada división implica k = 2 grupos probados, lo que significa que la cantidad total de grupos de prueba es k * N_splits, que es 30. Además, dado que hemos calculado todas las combinaciones posibles, estos grupos probados se distribuyen uniformemente en todos los N. Por lo tanto, hay es un número total de caminos 30 / 6= 5 caminos.
La Figura 1 indica los grupos que componen el conjunto de prueba con una x y deja los grupos que componen el conjunto de entrenamiento sin marcar para cada división. Esta técnica de división de entrenamiento/prueba nos permite calcular 5 rutas de backtest porque cada grupo es miembro de ?[6, 2] = 5 juegos de prueba.
Probablemente esté un poco confundido en este punto y tenga preguntas como:
- ¿Qué modelos estás entrenando para qué división y por qué?
Primero, pongámonos de acuerdo en alguna notación, algunos ejemplos:
Para cada división vertical (S1, S2… S15), entrene un clasificador para determinar sus etiquetas objetivo y(1,1), y(1,2), etcétera. Este modelo base de clasificador es consistente para cada división, pero las predicciones que hace son diferentes. ¡Por lo tanto, sigue siendo un clasificador diferente!
Así que algunos ejemplos básicos (Ver Figura 1):
- Dividir 1 || tren : (G3, S1), (G4, S1), (G5, S1), (G6, S1) || prueba: (G1, S1), (G2, S1) || → clasificador 1 → predicciones y(1,1), y(1,2) en (G1, S1), (G2, S1)
- Dividir 2|| tren : (G2, S2), (G4, S2), (G5, S2), (G6, S2) || prueba: (G1, S2), (G3, S1) || → clasificador 2 → predicciones y(1,2), y(3,2) en (G1, S2), (G3, S2)
- …….
- Dividir 15|| tren : (G1, S15), (G2, S15), (G3, S15), (G4, S15) || prueba: (G5, S15), (G6, S15) || → clasificador 15 → predicciones y(5,15), y(6,15) en (G5, S15), (G6, S15)
2. ¿Por qué estas rutas de backtesting son únicas?
Imagine que hemos entrenado a nuestros clasificadores y calculado todas las predicciones para todas las ubicaciones (x) en la Figura 1. Por lo tanto, ahora podemos aplicar nuestra estrategia en función de estas predicciones.
Eche un vistazo a la Figura 2. Un algoritmo de generación de rutas distribuyó todas las predicciones en los grupos de prueba a una de las 5 rutas únicas. La recombinación de las secciones de la ruta se puede hacer de cualquier manera, y las diferentes combinaciones deben converger en la misma distribución.
El punto principal es: que todas estas rutas de avance son puramente fuera de muestra (OOS). ¡Las predicciones hechas por sus clasificadores no han sido entrenadas en estos caminos! (Figura 2).
Ejemplo, ruta 1:
- El clasificador 1 no entrenó en (G1, S1), (G2, S1) y, por lo tanto, podemos usar esas predicciones para llegar a nuestra estrategia (sea cual sea).
- El clasificador 2 no se entrenó en (G3, S2) y, por lo tanto, podemos usar esas predicciones para el siguiente bit de datos.
- …..
- El clasificador 5 no entrenó en (G6, S5) y por lo tanto…
- Las cuentas duplicadas para el resto de las rutas
Conclusión: ahora tenemos 5 recorridos de backtesting en lugar de 1. Por lo tanto, 5 índices de Sharpe o cualquier métrica que esté utilizando para determinar el rendimiento de su modelo. Estas métricas múltiples permiten realizar “pruebas retrospectivas estadísticas” y hacen que la probabilidad de descubrimientos falsos sea insignificante (suponiendo un número suficientemente grande de rutas).
Código PurgadoKFoldCV
Sam31415 del MIT hizo un paquete para esto y, después de luchar, descubrimos cómo usarlo. Sin embargo, la clase CombPurgedKFoldCV requirió algunas reparaciones. Por lo tanto, recomendamos usar mi versión (proporcionada en Colab).
Si desea detalles, puede buscar en GitHub los detalles a continuación:
Tu información
El marco de datos en el que va a aplicar esto tiene dos requisitos:
- Tiene que ser una serie de tiempo.
- Necesita etiquetas de destino que se producen en valores futuros
Eso es todo; puedes hacer esto en cualquier ¡marco de datos!
Este es un ejemplo de un marco de datos considerando las características de Bitcoin. Tiene una marca de tiempo, algunas funciones y una etiqueta_barrier basada en el futuro. Si quieres saber más sobre cómo llegamos a esto ejemplo particular cuadro de datos haga clic en la historia a continuación:
Importancia de la característica criptográfica para el aprendizaje de refuerzo profundo
El código
Recuerde, tenemos observaciones y evaluaciones. Si está interesado en Combinatorial PurgedKFoldCV, ¡sus evaluaciones se realizan en el futuro y están vinculadas al momento de sus observaciones! Por ejemplo, en mi caso, mis valoraciones son +puntos de datos en el futuro.
Necesitamos los tiempos de las observaciones y las evaluaciones, que se pueden hacer de la siguiente manera. En el recorte a continuación:
- Seleccione los datos de bitcoin.
- Obtenga el índice de los datos de Bitcoin, que son las marcas de tiempo (consulte el marco de datos hacia arriba).
- Suelte la variable de destino del marco de datos de características X () y suelte las últimas características. Estos son inútiles ya que sus valores de predicción son NaN.
- Seleccione la variable de destino, asígnele el índice del marco de datos anterior.
- Deseche las últimas predicciones (son NaN ya que no hay datos para predecir más allá).
- Establezca los tiempos en los que se realizó la observación (tiempos de predicción).
- Establezca los tiempos en los que se realizó la predicción de la variable objetivo (tiempos de evaluación).
Trazado de su Combinatorial PurgedKFoldCV
Ahora podemos crear una instancia de la clase CombPurgedKFoldCV. Sigamos el ejemplo de López por simplicidad, donde los grupos N=6 (Python de 0, por lo tanto 5!), y los grupos probados son k=2.
El embargo depende de tu problema, pero por simplicidad, le damos el mismo valor al embargo que a la purga.
La función se proporciona y describe al final de este artículo.
# Constantes
num_paths = 5
k = 2
N = num_paths + 1
embargo_td = pd.Timedelta(days=1)* t_final # instancia de clase
cv = CombPurgedKFoldCV(n_splits=N, n_test_splits=k, embargo_td=embargo_td) # Calcular rutas de backtest
_, rutas, _= back_test_paths_generator(X.shape[0]N, k) # Trazado
grupos = lista(rango(X.forma[0]))
higo, hacha = plt.subplots()
plot_cv_indices(cv, X, y, grupos, hacha, num_paths, k)
plt.gca().invert_yaxis()
Construí la siguiente función de trazado basada en Sklearns visualización de la página de validación cruzadaadaptó las funciones existentes y agregó algunos elementos necesarios.
Tenga en cuenta que en la línea 13, el ciclo for es exactamente como sería durante su proceso de entrenamiento. ¡Esa es la línea que desea copiar para entrenar a cada clasificador eventualmente!
Los resultados
La figura 3 muestra los resultados del código de trazado proporcionado.
En la Figura 3:
- Azul: periodos de tren
- Períodos de embargo/purgados: rojo intenso
- Períodos de prueba: rojo claro
Ahora, mire los periodos de embargo/purga de color rojo oscuro:
- Hay un período de purga antes de un período de prueba Y después de un entrenamiento período.
- Después de un período de prueba, tenemos un período de purga y período de embargo
- El período de embargo es mayor que el período de purga.
Por lo tanto, habrá una brecha más grande al final de un conjunto de prueba que antes del comienzo de un conjunto de prueba.
Ahora tómese un tiempo y compare la Figura 3 y la Figura 4, y observe la igualdad.
Explicación del generador de ruta de prueba combinatoria PurgedKFoldCV Backtest
Usar esta función es bastante fácil y solo requiere tres argumentos (cantidad de observaciones, N y k). El objetivo es describir las rutas 1 a 5 que se muestran a continuación. Léalo rápidamente y, debajo del código, le explicaremos el resultado de esta función.
En el conjunto de datos de Colab, tenemos 813 observaciones. El tamaño de entrada no importa para explicar esta función; imagine que solo tenemos 30 observaciones, y aún así N=6 grupos y aún k=2 grupos_probados.
¡Hemos agregado 1 para simplificar el pensamiento sobre la salida de las rutas en este cuaderno!
# Calcular rutas de backtest
N_observations = 30 ## colab dataset 813 _, paths, _= back_test_paths_generator(N_observations, N, k, condition_times, Evaluation_times) # Agregue más uno para evitar el conteo de Python 0 (más lógico para ustedes)
caminos + 1
¿Ves lo que hace esta función? Cada columna en la Figura 6 es una ruta de backtest. En este caso, nuestros datos abarcan 30 puntos de datos. Por lo tanto, el tamaño de cada grupo es de 5 puntos de datos (con 6 grupos). Hemos indicado las divisiones de grupo con líneas horizontales de color rosa. Los números indican qué predicciones debe realizar (en la Figura 3).
Por ejemplo, para la ruta 4:
- Tome predicciones para los puntos de datos 1–5 del clasificador 4
- Tome predicciones para los puntos de datos 6–10 del clasificador 8
- Tome predicciones para los puntos de datos 11–15 del clasificador 11
- Tome predicciones para los puntos de datos 16–20 del clasificador 13
- Tome predicciones para los puntos de datos 21–25 del clasificador 13
- Tome predicciones para los puntos de datos 25–25 del clasificador 14
¡Eso es!
Conclusión
El backtesting tradicional de series de tiempo es muestra ineficiente y se producen fugas. La purga y el embargo son necesarios para evitar la fuga extrema de información. Los métodos tradicionales de backtesting de avance solo prueban un único escenario, fácilmente sobreajustado. Además, WF no es representativo del rendimiento futuro, ya que la secuencia particular de puntos de datos puede sesgar los resultados. Finalmente, las decisiones iniciales de WF se basan en una pequeña porción del espacio muestral total. PurgedK-FoldCV resuelve estos problemas realizando backtests en grupos del mismo tamaño. Además, cada observación es parte de uno y solo un conjunto de prueba. Finalmente, Combinatorial PurgedK-FoldCV permite muchas rutas únicas de backtest, lo que reduce la probabilidad de descubrimientos falsos.
Este artículo proporcionó código y una explicación completa de cómo indexar el PurgeKFoldCV combinatorio. Se resumen las (des)ventajas del método más utilizado en la literatura y se comparan con las (des)ventajas del método Combinatorial PurgedKFoldCV. Después de eso, se analiza en profundidad el método y se elaboran varios puntos difíciles de entender. Finalmente, se incluye una pequeña discusión y explicación del Código Colab.
Espero que tenga muchos usuarios felices en el futuro.
Referencia
Prado, ML de. (2018). .
El método Combinatorial Purged Cross-Validation se publicó originalmente en Towards AI en Medium, donde las personas continúan la conversación destacando y respondiendo a esta historia.
Publicado a través de Hacia la IA