Discussão do artigo "Análise angular dos movimentos de preço: um modelo híbrido de previsão dos mercados financeiros"

 

Novo artigo Análise angular dos movimentos de preço: um modelo híbrido de previsão dos mercados financeiros foi publicado:

O que é análise angular dos mercados financeiros? Como usar os ângulos de movimento de preço e o aprendizado de máquina para prever com precisão de 67? Como combinar um modelo de regressão e um modelo de classificação com características angulares e obter um algoritmo funcional? O que Gann tem a ver com isso? Por que os ângulos de movimento do preço são bons indicadores para o aprendizado de máquina?

Todos os dias, nos gráficos de pares de moedas, ações e futuros, nascem milhares de candles. Eles se agrupam em padrões, formam tendências, criam resistências e suportes. Por trás dessas imagens familiares existe uma essência matemática que raramente percebemos: os ângulos entre pontos de preço consecutivos.

Observe um gráfico comum do EURUSD. O que você vê? Linhas e barras? Agora imagine que cada segmento entre dois pontos consecutivos forma um determinado ângulo com o eixo horizontal. Esse ângulo tem um valor matemático preciso. Um ângulo positivo indica um movimento ascendente, enquanto um ângulo negativo indica um movimento descendente. Quanto maior o ângulo, mais íngreme é o movimento do preço.

Parece simples? Mas dentro dessa simplicidade há uma profundidade surpreendente. Porque os ângulos não são iguais entre si. Eles formam o seu próprio padrão, a sua própria melodia. E essa melodia, como descobri, contém as chaves para o movimento futuro do mercado.


Autor: Yevgeniy Koshtenko

 

3 publicações seguidas, estou surpreso, "os tolos têm pensamentos semelhantes" :-)

fazemos aproximadamente a mesma coisa, simultaneamente e de forma independente.

brigas semelhantes com os cantos, mas apenas o cavalo antes da carroça (a única coisa prevista é o equilíbrio pessoal, as citações não importam):

Não vou fazer screenshot sobre Gan, mas na minha opinião - nem tudo é ruim lá e lá ângulo = volatilidade típica de ciclos naturais.
intuitivamente, por experiência pessoal e tendo o que está à mão, Gan deduziu o que deduziu. mas mais objetivo do que MACD :-)

 
e 24 barras é apenas um exemplo?
 

Mais uma pergunta, se você puder responder.

Ao fazer o upload dos resultados para o ONNX e implementar o EA, surgiu um problema. Ao transferir dados com dimensão {1,31} para o primeiro modelo de classificação, não há problemas, obtenho os valores

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


Mas ao passar os mesmos dados para o segundo modelo, continuo recebendo o seguinte erro: ONNX: parameter is empty, inspect code '° :àh½5E' (705:10). Nenhum dos parâmetros passados é 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: o parâmetro está vazio, inspecione o código '° :àh½5E' (705:10)

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) Erro de execução: 5805

Talvez você possa me ajudar com o erro (a vastidão da Internet não ajudou)




 

No netrona, o modelo em si é exibido normalmente

Arquivos anexados:
 

Métricas para barra para trás = 60, para frente = 30

Precisão do treinamento: 0,9200 | Precisão do teste: 0,8713 | GAP: 0,0486

Pontuação de F1 do trem: 0,9187 | Pontuação de F1 do teste: 0,8682 | GAP: 0,0505


O CatBoost não se sai bem em distâncias curtas, o modelo está supertreinado

 
Ao executar o código, ele exige que o seaborn esteja instalado:
import seaborn as sns
 

Oi Yevgeniy ,

trabalho muito bom e interessante. Parabéns.

Posso perguntar se o backtesting foi feito em todo o conjunto de dados? Parece-me que ele incluiu o conjunto de treinamento também, ou estou enganado?

 
Paolo Miocchi backtesting foi feito em todo o conjunto de dados? Parece-me que ele incluiu o conjunto de treinamento também, ou estou enganado?

Por favor, preste atenção aos detalhes.


O período de tempo do teste foi de 4 meses, calculado de forma grosseira em 161280 segundos. O total de negociações ultrapassou 17500, portanto, a duração média da negociação é de 9 segundos. Considere o possível movimento médio do EURUSD em 9 segundos. Não há dinheiro a ser ganho. O modelo, em sua maior parte, prevê o último preço, como qualquer modelo de IA que usa séries de preços como entrada. Os modelos de IA convergem muito mal em séries de preços, assim como este.

 
Enrique Dangeroux #:

Preste atenção aos detalhes.


O período de tempo do teste foi de 4 meses, calculado de forma grosseira em 161280 segundos. O total de negociações ultrapassou 17500, portanto, a duração média da negociação é de 9 segundos. Considere o possível movimento médio do EURUSD em 9 segundos. Não há dinheiro a ser ganho. O modelo, em sua maior parte, prevê o último preço, como qualquer modelo de IA que usa séries de preços como entrada. Os modelos de IA convergem muito mal em séries de preços, assim como este.

Ao inspecionar o código, você verá que na rotina de backtesting as negociações são muito mais numerosas do que em condições reais porque o autor não incluiu a condição de verificar se a probabilidade das negociações previstas deve exceder 0,6. Portanto, o número real de negociações é muito menor do que isso.
 
Aliaksandr Kazunka # :

Métricas para barra para trás = 60, para frente = 30

Precisão do treinamento: 0,9200 | Precisão do teste: 0,8713 | GAP: 0,0486

Pontuação F1 do trem: 0,9187 | Pontuação F1 do teste: 0,8682 | GAP: 0,0505


Em distâncias curtas, o CatBoost não funciona bem, o modelo é treinado em excesso

Olá Aliaksandr

o problema com esse código é o uso do argumento

shuffle=True

na chamada train_test_split.

Se você alterar o argumento para

shuffle=False

você perceberá uma enorme queda no desempenho. Isso ocorre porque, mesmo que o conjunto de teste e o conjunto de treinamento estejam, em princípio, divididos e separados um do outro, a divisão é muito fina e, portanto, há muitos "valores" X muito semelhantes entre os dois conjuntos. De fato, entre cada X[i] e X[i+1] há apenas uma diferença de deslocamento de 1 barra, o que torna o conjunto de treinamento e o conjunto de teste, na prática, muito semelhantes. Portanto, os excelentes resultados que observamos (com shuffle=True) se devem essencialmente ao ajuste excessivo. Se você remover o shuffle, o conjunto de teste consistirá em um determinado número de barras contíguas (as mais recentes), e o classificador CatBoost não fará uma boa previsão dentro dele, enquanto, por outro lado, a previsão pode ser muito boa no conjunto de treinamento. Um sinal claro de ajuste excessivo. Isso ocorre mesmo com uma fração muito pequena de barras no conjunto de teste (não embaralhado) e, portanto, a degradação do desempenho não pode ser explicada por uma mudança nas condições do mercado.