Diskussion zum Artikel "Winkelanalyse von Preisbewegungen: Ein hybrides Modell zur Prognose von Finanzmärkten"

 

Neuer Artikel Winkelanalyse von Preisbewegungen: Ein hybrides Modell zur Prognose von Finanzmärkten :

Was ist die Winkelanalyse der Finanzmärkte? Wie kann man mithilfe der Winkel von Preisbewegung und maschinellem Lernen genaue Prognosen mit einer Genauigkeit von 67 % erstellen? Wie kann man ein Regressions- und Klassifikationsmodell mit Winkelmerkmalen kombinieren und einen funktionierenden Algorithmus erhalten? Was hat Gann damit zu tun? Warum sind Winkel der Preisbewegung ein guter Indikator für maschinelles Lernen?

Tausende von Kerzen werden jeden Tag auf den Charts von Währungspaaren, Aktien und Futures geboren. Sie bilden Muster, bilden Trends und schaffen Widerstände und Unterstützungen. Doch hinter diesen vertrauten Bildern verbirgt sich ein mathematisches Gebilde, das wir nur selten wahrnehmen, nämlich die Winkel zwischen aufeinanderfolgenden Preispunkten.

Werfen Sie einen Blick auf das übliche EURUSD-Chart. Was können Sie sehen? Linien und Bars? Stellen Sie sich nun vor, dass jedes Segment zwischen zwei aufeinanderfolgenden Punkten einen bestimmten Winkel mit der horizontalen Achse bildet. Dieser Winkel hat einen exakten mathematischen Wert. Ein positiver Winkel bedeutet eine Aufwärtsbewegung, ein negativer Winkel eine Abwärtsbewegung. Je größer der Winkel ist, desto steiler ist die Preisbewegung.

Klingt einfach? Doch hinter dieser Einfachheit verbirgt sich eine erstaunliche Tiefe. Denn die Winkel sind nicht gleich. Sie bilden ihr eigenes Muster, ihre eigene Melodie. Und diese Melodie enthält, wie sich herausstellt, den Schlüssel zur künftigen Marktbewegung.


Autor: Yevgeniy Koshtenko

 

3 Veröffentlichungen in Folge, ich bin erstaunt, "Narren haben ähnliche Gedanken" :-)

wir machen ungefähr das Gleiche, gleichzeitig und unabhängig voneinander.

ähnliche Zankereien mit Ecken, aber nur das Pferd vor dem Wagen (das einzige, was vorhergesagt wird, ist persönliche Balance, Zitate nicht egal):

Ich werde nicht Screenshot über Gan, aber meiner Meinung nach - alles ist nicht schlecht, da und dort Winkel=typische Volatilität der natürlichen Zyklen.
intuitiv, durch persönliche Erfahrung und mit dem, was zur Hand ist, Gan abgeleitet, was er abgeleitet. aber objektiver als MACD :-)

 
und 24 Takte sind nur ein Beispiel?
 

Eine weitere Frage, wenn Sie sie beantworten können.

Beim Hochladen der Ergebnisse in ONNX und der Implementierung des EA ist ein Problem aufgetreten. Beim Übertragen der Daten mit der Dimension {1,31} in das erste Klassifikationsmodell gibt es keine Probleme, ich erhalte die Werte

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


Wenn ich jedoch die gleichen Daten an das zweite Modell übergebe, erhalte ich immer wieder folgende Fehlermeldung: ONNX: parameter is empty, inspect code '° :àh½5E' (705:10). Keiner der übergebenen Parameter ist 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: Parameter ist leer, Prüfcode '° :àh½5E' (705:10)

2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) Ausführungsfehler: 5805

Vielleicht können Sie mir bei dem Fehler helfen (die Weiten des Internets haben nicht geholfen)




 

in netrona wird das Modell selbst normal angezeigt

Dateien:
 

Metriken für Balken zurück = 60, vorwärts = 30

Zug-Genauigkeit: 0.9200 | Test-Genauigkeit: 0.8713 | GAP: 0.0486

Zug F1-Ergebnis: 0.9187 | Test F1-Ergebnis: 0.8682 | GAP: 0.0505


Bei kurzen Distanzen taugt CatBoost nichts, das Modell ist übertrainiert

 
Wenn der Code ausgeführt wird, muss seaborn installiert sein:
import seaborn as sns
 

Hallo Yevgeniy ,

sehr gute und interessante Arbeit. Herzlichen Glückwunsch!

Darf ich Sie fragen, ob das Backtesting mit dem gesamten Datensatz durchgeführt wurde? Ich habe den Eindruck, dass auch der Trainingsdatensatz einbezogen wurde, oder täusche ich mich?

 
Paolo Miocchi Backtesting mit dem gesamten Datensatz durchgeführt wurde? Ich habe den Eindruck, dass auch der Trainingsdatensatz einbezogen wurde, oder täusche ich mich?

Achten Sie bitte auf die Details.


Der Zeitrahmen des Tests war 4 Monate, grob gerechnet 161280 Sekunden. Die Gesamtzahl der Trades betrug mehr als 17500, d.h. die durchschnittliche Handelsdauer beträgt 9 Sekunden. Betrachten Sie die mögliche durchschnittliche Bewegung des EURUSD in 9 Sekunden. Es ist kein Geld zu verdienen. Das Modell sagt größtenteils den letzten Preis voraus, genau wie jedes KI-Modell, das Preisreihen als Input verwendet. KI-Modelle konvergieren sehr schlecht bei Preisreihen, so auch dieses Modell.

 
Enrique Dangeroux #:

Achten Sie bitte auf die Details.


Der Zeitrahmen des Tests betrug 4 Monate, grob berechnet 161280 Sekunden. Insgesamt wurden mehr als 17500 Trades getätigt, so dass die durchschnittliche Handelsdauer 9 Sekunden beträgt. Betrachten Sie die mögliche durchschnittliche Bewegung des EURUSD in 9 Sekunden. Es ist kein Geld zu verdienen. Das Modell sagt größtenteils den letzten Preis voraus, genau wie jedes KI-Modell, das Preisreihen als Input verwendet. KI-Modelle konvergieren sehr schlecht bei Preisreihen, so auch dieses Modell.

Wenn Sie sich den Code ansehen, werden Sie feststellen, dass in der Backtesting-Routine die Abschlüsse viel zahlreicher sind als unter Live-Bedingungen, weil der Autor die Bedingung, dass die Wahrscheinlichkeit der vorhergesagten Abschlüsse über 0,6 liegen muss, nicht berücksichtigt hat. Die tatsächliche Zahl der Abschlüsse liegt also weit darunter.
 
Aliaksandr Kazunka # :

Metrik für Reck zurück = 60, vorwärts = 30

Zug-Genauigkeit: 0,9200 | Test-Genauigkeit: 0,8713 | GAP: 0,0486

Zug F1-Ergebnis: 0.9187 | Test F1-Ergebnis: 0.8682 | GAP: 0.0505


Bei kurzen Distanzen taugt CatBoost nichts, das Modell ist übertrainiert

Hallo Aliaksandr

das Problem mit diesem Code ist die Verwendung des

shuffle=True

Argument im train_test_split-Aufruf.

Wenn du es in

shuffle=False

ändern, werden Sie einen enormen Leistungsabfall feststellen. Das liegt daran, dass, auch wenn die Testmenge und die Trainingsmenge im Prinzip aufgeteilt und voneinander getrennt sind, die Aufteilung sehr fein ist und es daher viele sehr ähnliche X-"Werte" zwischen den beiden Mengen gibt. Tatsächlich besteht zwischen jedem X[i] und X[i+1] nur ein Unterschied von 1 Balken, was die Trainingsmenge und die Testmenge in der Praxis sehr ähnlich macht. Daher sind die hervorragenden Ergebnisse, die wir (mit shuffle=True) sehen, im Wesentlichen auf eine Überanpassung zurückzuführen. Entfernt man den Shuffle, besteht die Testmenge aus einer bestimmten Anzahl zusammenhängender Balken (den jüngsten), und der CatBoost-Klassifikator wird darin keine guten Vorhersagen treffen, während umgekehrt die Vorhersage in der Trainingsmenge sehr gut sein kann. Ein klares Zeichen für Overfitting. Dies tritt selbst bei einem sehr kleinen Anteil von Balken in der (nicht gemischten) Testmenge auf, so dass die Leistungsverschlechterung nicht durch eine Änderung der Marktbedingungen erklärt werden kann.