Discusión sobre el artículo "Análisis angular de los movimientos de precios: un modelo híbrido para predecir los mercados financieros"

 

Artículo publicado Análisis angular de los movimientos de precios: un modelo híbrido para predecir los mercados financieros:

¿Qué es el análisis angular de los mercados financieros? ¿Cómo usar los ángulos de precios y el aprendizaje automático para predecir con una exactitud de 67? ¿Cómo combinar un modelo de regresión y clasificación con características angulares y obtener un algoritmo que funcione? ¿Qué tiene que ver Gann con esto? ¿Por qué los ángulos de movimiento de los precios son una buena señal para el aprendizaje automático?

Cada día nacen miles de velas en los gráficos de pares de divisas, acciones y futuros. Estas se pliegan en patrones, forman tendencias, crean apoyos y resistencias. Pero bajo estas imágenes familiares se esconde una esencia matemática que rara vez notamos: los ángulos entre los sucesivos puntos de precio.

Eche un vistazo al gráfico normal del EURUSD. ¿Qué ve? ¿Líneas y barras? Imagine ahora que cada segmento entre dos puntos consecutivos forma un determinado ángulo con el eje horizontal. Este ángulo tiene un significado matemático preciso. Un ángulo positivo indica un movimiento ascendente, mientras que un ángulo negativo indica un movimiento descendente. Cuanto mayor sea el ángulo, más pronunciado será el movimiento del precio.

¿Suena fácil? Pues en esa sencillez reside una sorprendente profundidad, porque los ángulos no son iguales entre sí: forman su propio patrón, su propia melodía, y resulta que esa melodía encierra las claves del futuro movimiento del mercado.


Autor: Yevgeniy Koshtenko

 

3 publicaciones seguidas, me asombra, "los tontos tienen pensamientos parecidos" :-)

hacemos aproximadamente lo mismo, simultánea e independientemente.

peleas similares con las esquinas, pero sólo el caballo antes que el carro (lo único previsto es el equilibrio personal, las comillas no les importa):

No voy a pantallazo sobre Gan, pero en mi opinión - no todo es malo allí y allí ángulo = volatilidad típica de los ciclos naturales.
intuitivamente, por experiencia personal y tener lo que está a la mano, Gan dedujo lo que dedujo. pero más objetivo que el MACD :-)

 
¿y 24 compases es sólo un ejemplo?
 

Una pregunta más, por si me la pueden responder.

Al subir los resultados a ONNX e implementar el EA ha surgido un problema. Al transferir los datos con dimensión {1,31} al primer modelo de clasificación no hay problemas, obtengo los valores

2025.04.22 19:47:28.268 test_gann (ORDIUSDT,M5) directionUpDn = 1 directionStrength=0.44935011863708496


Pero al pasar los mismos datos al segundo modelo, sigo obteniendo el siguiente error: ONNX: parameter is empty, inspect code '° :àh½5E' (705:10). Ninguno de los parámetros pasados es 0.

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 0, input_matrix[0][i] = -12.92599868774414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 1, input_matrix[0][i] = -12.92599868774414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 2, input_matrix[0][i] = -42.55295181274414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 3, input_matrix[0][i] = 72.71257781982422

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 4, input_matrix[0][i] = 74.29901123046875

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 5, input_matrix[0][i] = -61.42539596557617

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 6, input_matrix[0][i] = 56.164878845214844

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 7, input_matrix[0][i] = -80.11347198486328

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 8, input_matrix[0][i] = 79.91580200195312

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 9, input_matrix[0][i] = -48.93017578125

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 10, input_matrix[0][i] = 80.48663330078125

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 11, input_matrix[0][i] = -79.71015930175781

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 12, input_matrix[0][i] = -45.92404556274414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 13, input_matrix[0][i] = -82.36412048339844

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 14, input_matrix[0][i] = -56.164878845214844

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 15, input_matrix[0][i] = -10.630552291870117

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 16, input_matrix[0][i] = 62.323272705078125

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 17, input_matrix[0][i] = 13.0

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 18, input_matrix[0][i] = 10.0

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 19, input_matrix[0][i] = -12.92599868774414

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 20, input_matrix[0][i] = -61.48434829711914

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 21, input_matrix[0][i] = -36.735313415527344

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 22, input_matrix[0][i] = -23.80649185180664

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 23, input_matrix[0][i] = 0.3333333432674408

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 24, input_matrix[0][i] = 6.955999851226807

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 25, input_matrix[0][i] = 0.029581977054476738

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 26, input_matrix[0][i] = -0.5281187295913696

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 27, input_matrix[0][i] = 0.4025301933288574

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 28, input_matrix[0][i] = 420.0

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 29, input_matrix[0][i] = 641.6666870117188

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 30, input_matrix[0][i] = 0.6545454263687134

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) ONNX: el parámetro está vacío, inspeccionar código '° :àh½5E' (705:10)

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) Error de ejecución: 5805

Tal vez puedas ayudarme con el error (la inmensidad de Internet no ayudó)




 

en netrona el propio modelo se muestra normalmente

Archivos adjuntos:
 

Métrica de la barra atrás = 60, adelante = 30

Precisión de entrenamiento: 0,9200 | Precisión de prueba: 0,8713 | GAP: 0,0486

Puntuación F1 tren: 0,9187 | Puntuación F1 prueba: 0,8682 | GAP: 0,0505


En distancias cortas, CatBoost no funciona, el modelo está sobreentrenado.

 
Al ejecutar el código, se requiere que seaborn esté instalado:
import seaborn as sns
 

Hola Yevgeniy

muy buen e interesante trabajo. Te felicito.

¿Puedo preguntarte si el backtesting se hizo sobre el conjunto de datos completo? Me parece que incluía también el conjunto de entrenamiento, ¿o me equivoco?

 
Paolo Miocchi backtesting se hizo sobre el conjunto de datos completo? Me parece que incluía también el conjunto de entrenamiento, ¿o me equivoco?

Por favor, presta atención a los detalles.


El marco temporal de la prueba fue de 4 meses, crudamente calculado 161280 segundos. El total de operaciones superó 17500, por lo que la duración media de las operaciones es de 9 segundos. Considere el posible movimiento medio del EURUSD en 9 segundos. No se puede ganar dinero. El modelo en su mayor parte predice el último precio al igual que cualquier modelo de IA que utiliza series de precios como entrada. Los modelos de IA convergen muy mal en las series de precios y también lo hace este.

 
Enrique Dangeroux #:

Preste atención a los detalles.


El plazo de la prueba fue de 4 meses, crudamente calculado 161280 segundos. El total de operaciones superó 17500, por lo que la duración media de las operaciones es de 9 segundos. Considere el posible movimiento medio del EURUSD en 9 segundos. No se puede ganar dinero. El modelo en su mayor parte predice el último precio al igual que cualquier modelo de IA que utiliza series de precios como entrada. Los modelos de IA convergen muy mal en las series de precios y también lo hace este.

Inspeccionando el código verá que en la rutina de backtesting las operaciones son mucho más numerosas que en condiciones reales porque el autor no incluyó la condición de comprobar que la probabilidad de las operaciones predichas debe ser superior a 0,6. Así que el número real de operaciones es mucho mayor que en condiciones reales. Así que el número real de operaciones es mucho menor.
 
Aliaksandr Kazunka # :

Métricas para barra atrás = 60, adelante = 30

Precisión de entrenamiento: 0,9200 | Precisión de prueba: 0,8713 | GAP: 0,0486

Puntuación F1 de entrenamiento: 0,9187 | Puntuación F1 de prueba: 0,8682 | GAP: 0,0505


En distancias cortas, CatBoost no funciona, el modelo está sobreentrenado.

Hola Aliaksandr

el problema con este código es el uso del argumento

shuffle=True

en la llamada train_test_split.

Si lo cambias por

shuffle=False

notarás una enorme caída del rendimiento. Esto se debe a que, aunque el conjunto de prueba y el conjunto de entrenamiento están, en principio, divididos y disjuntos entre sí, la división es muy fina y, por tanto, hay muchos "valores" X muy similares entre los dos conjuntos. De hecho, entre cada X[i] y X[i+1] sólo hay una diferencia de desplazamiento de 1 barra, lo que hace que el conjunto de entrenamiento y el conjunto de prueba sean, en la práctica, muy similares. Por lo tanto, los excelentes resultados que vemos (con shuffle=True) se deben esencialmente al sobreajuste. Si se elimina el shuffle, el conjunto de prueba estará formado por un cierto número de barras contiguas (las más recientes), y el clasificador CatBoost no predecirá bien en él, mientras que, por el contrario, la predicción puede ser muy buena en el conjunto de entrenamiento. Un claro signo de sobreajuste. Esto ocurre incluso con una fracción muy pequeña de barras en el conjunto de prueba (no barajado), por lo que la degradación del rendimiento no puede explicarse por un cambio en las condiciones del mercado.