Discusión sobre el artículo "Análisis angular de los movimientos de precios: un modelo híbrido para predecir los mercados financieros"
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 :-)
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ó)
Artículo publicado Angular analysis of price movements: a hybrid model for forecasting financial markets:
Autor: Yevgeniy Koshtenko
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.
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?
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.
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.
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.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso

Artículo publicado Análisis angular de los movimientos de precios: un modelo híbrido para predecir los mercados financieros:
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