Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 2065

 
Evgeniy Chumakov:

Unter der Annahme, dass es keine Lücken in der Historie gibt und alle Tage 1440 Minuten lang sind (am Freitag weniger), sollte der Code wie folgt aussehen

Selbst im Eurusd gibt es Lücken. Arbeit mit der Barzeit
 
elibrarius:
Lücken treten auch beim Eurusd auf. Arbeit mit Barzeit


Das ist verständlich, denn wenn ich das täte, würde ich es auch tun. Dies dient nur der besseren Verständlichkeit.

 

Irgendwie scheint es zu funktionieren) Zum Speichern wird eine neue Zeile in rates[i].high erfasst

#property script_show_inputs
//+------------------------------------------------------------------+
input datetime tstart = D'2020.5.1 00:00';  // начало промежутка исследуемого времени
input datetime tstop = D'2020.10.1 00:00';   // конец промежутка исследуемого времени
string zztn = "dvol\\" + _Symbol + ".txt"; // text file name
//+------------------------------------------------------------------+
#define  NM 1440
ulong NSM = 60;
ulong NSD = 60 * 1440;
//+------------------------------------------------------------------+
void OnStart()
{
  MqlRates rates[];
  double vol[NM] = {0.0}, d;
  int n[NM] = {0}, t;
  int nprice = CopyRates(Symbol(), PERIOD_M1, tstart, tstop, rates);
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    d = rates[i].close - rates[i].open;
    ++n[t];
    vol[t] += d * d;
  }
  for(int i = 0; i < NM; ++i)
  {
    if(n[i] > 1) vol[i] /= n[i];
    vol[i] = sqrt(vol[i]);
  }
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    if(vol[t] > 0) rates[i].high = (rates[i].close - rates[i].open) / vol[t];
    if(i > 0) rates[i].high += rates[i - 1].high;
  }
  int ft = FileOpen(zztn, FILE_WRITE | FILE_COMMON | FILE_ANSI | FILE_TXT);
  FileWriteString(ft, "t p");
  for(int i = 0; i < nprice; ++i)
    FileWriteString(ft, "\n" + (string)((ulong)rates[i].time) + " "  + (string)rates[i].high);
  FileClose(ft);
}
 
Aleksey Nikolayev:

Irgendwie scheint es zu funktionieren) Zum Speichern wird die neue Zeile in rates[i].high gesammelt

Sie normalisieren Takte aus der Vergangenheit, z. B. vom 5.1.2020 00:00 Uhr, auf Takte aus der Zukunft, z. B. vom 10.1.2020 00:00 Uhr, und solche dazwischen.
Das ist auf dem realen Markt nicht möglich.
Sie müssen die gleiche Berechnung für jeden Balken durchführen, aber nur für die vergangenen Balken.

 
Aleksey Nikolayev:

Irgendwie scheint es zu funktionieren) Um zu speichern, wird die neue Zeile in rates[i].high gesammelt

Selbst wenn Sie es richtig machen, können Sie diese normalisierten Kerzenhöhen mit net/forest sehr genau rekonstruieren.
Als Abrufe füttern wir 60 Candlestick-Höhen mit Tages-Offset, und lehren normalisierte Höhen in Ihrem Code erhalten.
Das Training sollte nahezu 100% genau sein.

D.h. normalisierte Candlestick-Höhen enthalten keine neuen Informationen.
Der einzige Vorteil ist, dass keine 60 zusätzlichen Merkmale an die Modellschulung weitergegeben werden müssen.
Es ist unwahrscheinlich, dass jemand als fiches Bars 2 Monate alt, dh neue Informationen für diejenigen, die sie nicht eingereicht haben, gibt es immer noch einreichen).

Natürlich sollten wir prüfen, ob diese normalisierten Leuchterhöhen die Leistung des Modells verbessern, und natürlich sollten wir sie verwenden (oder einen Ihrer Chips, was vorzuziehen ist, oder den 60sten, aus dem er besteht).

 
Wir sollten schon etwas überprüfen, sonst sind drei Seiten geschrieben, Energie verschwendet und die Fehlerzunahme beträgt Gott bewahre ein halbes Prozent.
 
elibrarius:

Das ist seltsam. Ich frage mich, wie man das erklären kann?
Ich habe eine andere Version auskommentiert, die mir aber aus logischen Gründen nicht gefallen hat:

Welche RandomInteger() verwenden Sie? Ich verwende XOR.

Ich weiß nicht, wie ich das erklären soll :)

Ich habe diese Funktion

int RandomInteger(int max_vl)
{
   return (int)MathFloor((MathRand()+MathRand()*32767.0)/1073741824.0*max_vl);  //случайное Int от 0 до  1073741824
}
 

Maxim, ich habe den Verdacht, dass das Modell für C++ nicht korrekt von CatBoost entladen wird - können Sie mit dem Modell für Python vergleichen?

Ich habe eine Diskrepanz zwischen den Werten der Modellinterpretation in MQL5, wo die Werte aus dem CPP-Modell übernommen werden, und den Werten aus dem binären Modell. Das Delta beträgt etwa 0,15 - das ist viel.

 
elibrarius:

Sie normalisieren vergangene Takte, z. B. von 2020.5.1 00:00 Uhr auf zukünftige Takte, von 2020.10.1 00:00 Uhr und die dazwischen liegenden.
In der realen Welt tun Sie das nicht.
Sie müssen ungefähr die gleiche Berechnung von jedem Balken durchführen, aber nur von den vergangenen Balken dafür.

Ja, es gibt den Blick in die Zukunft und auch andere Probleme, die nicht sofort offensichtlich sind. Für den direkten Handel ist sie nicht ganz geeignet, aber für eine erste Analyse ist sie unersetzlich. Zum Beispiel macht die Korrelation zwischen irrelevanten Inkrementen keinen Sinn.

 
Aleksey Nikolayev:

Ja, es gibt einen Blick in die Zukunft und auch andere Probleme, die nicht sofort offensichtlich sind. Für den direkten Handel ist sie nicht ganz geeignet, aber für die Voranalyse ist sie unverzichtbar. So macht es beispielsweise keinen Sinn, die Korrelation zwischen nicht relativen Inkrementen zu berechnen.

Ich werde es berücksichtigen und vielleicht werde ich es eines Tages für frühere Stäbe wiederholen und prüfen, ob es die Trainierbarkeit verbessert.
Wenn jemand dies bereits überprüft hat, bitte ich um Mitteilung.

Wie lautet die vorläufige Analyse? Sie füttern das Modell mit dem Input und vergleichen es mit oder ohne diese Funktion.

Ich denke, es ist besser, die letzten 30 Minuten zu normalisieren.
Alternativ: die letzten 30 Minuten des heutigen Tages und 5 vorangegangene Tage à 30 Minuten.

So wie sich die Volatilität im März verändert hat, wird Ihre Variante sehr lange brauchen, um sich anzupassen. In einem oder anderthalb Monaten werden die aktuellen Werte viel höher sein als vor ein oder zwei Monaten. Infolgedessen wird das Modell in einem unbekannten Bereich arbeiten. Sie verfügt einfach nicht über Beispiele für solche Arbeiten, auf deren Grundlage sie Prognosen erstellen könnte.

Mit der Normalisierung in der letzten Woche wird sie die neuen Spielregeln schneller lernen.
Grund der Beschwerde: