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

 
Maxim Dmitrievsky #:

nicht normierte Kreuzkorrelationen )

Kreuzkovarianz.

Nun, Sie brauchen Pearson.

[Gelöscht]  
fxsaber #:

Nun, Sie brauchen Pearson.

Ich weiß nicht, wie ich es machen soll, und ich bin müde.

So ähnlich.

>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = np.array([1, 2, 3])
>>> a = (a - np.mean(a)) / (np.std(a))
>>> b = (b - np.mean(b)) / (np.std(b))
>>> np.correlate(a, b, 'full')
array([-1.8973666 , -1.42302495,  0.9486833 ,  0.9486833 ,  0.9486833 ,
        0.9486833 ,  0.9486833 ,  0.9486833 ,  0.9486833 , -1.42302495,
       -1.8973666 ])
>>> 
 
Maxim Dmitrievsky #:

Ich bin mir nicht sicher, wie ich es machen soll, und ich bin müde.

etwas Ähnliches

Ja, das ist es nicht.

[Gelöscht]  
fxsaber #:

Richtig, falsch.

Es ist fast etwas, schlagen Sie es nach, ich bin weg.

 
fxsaber #:

Schnelles Auffinden ähnlicher kurzer Zeichenfolgen in einer langen Zeichenfolge.

Die Suche nach ähnlichen kurzen Zeichenfolgen (300) in der millionsten Zeichenfolge dauert bei einer solchen Implementierung über Alglib mehr als sechs Sekunden.

Ich habe es beschleunigt.

#include <fxsaber\Math\Math.mqh> // https://www.mql5.com/ru/code/17982

const vector<double> GetCorr( const double &Array[], const double &Pattern[], const int Step = 1 )
{
  double Corr[];  
  MathCorrelationPearson(Array, Pattern, Corr, Step);
  
  ArrayRemove(Corr, 0, ArraySize(Pattern) - 1);  
  
  vector<double> Res;
  Res.Swap(Corr);
  
  return(Res);
}

#property script_show_inputs

input int inRows = 300; // Длина короткой строки
input int inCols = 1000000; // Длина длинной строки

// Поиск похожей строки в длинной строке.
void OnStart()
{  
  if (inRows < inCols)
  {
    PrintCPU(); // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685
    
    double Array[]; // Длинная строка, где будет искать.
    double Pattern[]; // Короткая строка, с которой будем сравнивать.
    CMatrixDouble Matrix;
    
    FillData(Array, Pattern, Matrix, inRows, inCols); // https://www.mql5.com/ru/forum/86386/page3278#comment_49725614
            
    Print(TOSTRING(inRows) + TOSTRING(inCols));

    vector<double> vPattern;  
    vPattern.Assign(Pattern);

    ulong StartTime, StartMemory; // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685

    BENCH(vector<double> Vector1 = GetCorr(Matrix, vPattern)) // https://www.mql5.com/ru/forum/86386/page3278#comment_4972561 4
    BENCH(vector<double> Vector2 = GetCorr(Array, Pattern))
    BENCH(vector<double> Vector3 = GetCorr(Array, Pattern, -1))
    
    Print(TOSTRING(IsEqual(Vector1, Vector2)));
    Print(TOSTRING(IsEqual(Vector3, Vector2)));
  }      
}


Ergebnis.

EX5: 4000 AVX Release.
TerminalInfoString(TERMINAL_CPU_NAME) = Intel Core i7-2700 K  @ 3.50 GHz 
TerminalInfoInteger(TERMINAL_CPU_CORES) = 8 
TerminalInfoString(TERMINAL_CPU_ARCHITECTURE) = AVX 
inRows = 300 inCols = 1000000 
vector<double> Vector1 = GetCorr(Matrix, vPattern) - 7158396 mcs, 8 MB
vector<double> Vector2 = GetCorr(Array, Pattern) - 364131 mcs, 8 MB
vector<double> Vector3 = GetCorr(Array, Pattern, -1) - 323935 mcs, 7 MB
IsEqual(Vector1, Vector2) = true 
IsEqual(Vector3, Vector2) = true 

Jetzt in 300 Millisekunden.

 
fxsaber #:

Jetzt in 300 Millisekunden.

Wenn keine Matrix es kann.

inRows = 30000 inCols = 10000000 
vector<double> Vector2 = GetCorr(Array, Pattern) - 10567928 mcs, 76 MB
vector<double> Vector3 = GetCorr(Array, Pattern, -1) - 3006838 mcs, 77 MB

Es dauert drei Sekunden, um ähnliche 30K-Strings in einem 10M-String zu finden.

 
fxsaber #:

Wenn keine Matrix damit umgehen kann.

Es dauert drei Sekunden, um ähnliche 30K-Strings in einem 10M-String zu finden.

Sehr cool, aber genau so nutzlos.
Ist dies ein Beispiel für fft()?
 
mytarmailS #:
Ist dies ein Beispiel mit fft()?

300/1M ist nicht fft, 30K/10M ist fft.

 
fxsaber #:

Wenn keine Matrix damit umgehen kann.

Es dauert drei Sekunden, um ähnliche Zeichenfolgen der Länge 30K in einer Zeichenfolge von 10M zu finden.

Beeindruckendes Ergebnis!

 

Ich habe eine Stichprobe von 2010 bis 2023 (47k Zeilen) genommen, sie in drei Teile in chronologischer Reihenfolge unterteilt und beschlossen, zu sehen, was passieren würde, wenn wir diese Teile austauschen.

Die Größe der Teilstichproben Zug - 60%, Test - 20% und Prüfung - 20%.

Ich habe diese Kombinationen gebildet (-1) - dies ist die Standardreihenfolge - chronologisch. Jede Teilstichprobe hat ihre eigene Farbe.


Ich habe 101 Modelle mit verschiedenen Seed für jede Gruppe von Proben trainiert und folgendes Ergebnis erhalten


Alle Metriken sind standardisiert, und es ist zu erkennen, dass es schwierig ist, den durchschnittlichen Gewinn der Modelle (AVR Profit) sowie den Prozentsatz der Modelle, deren Gewinn 3000 Punkte übersteigt, für die letzte Probe, die nicht am Training teilgenommen hat, zu bestimmen.

Vielleicht sollte die relative Erfolgsrate der Varianten -1 und 0 in der Trainingsstichprobe reduziert werden? Im Allgemeinen scheint es, dass Recall darauf reagiert.

Sollten Ihrer Meinung nach die Ergebnisse solcher Kombinationen in unserem Fall miteinander vergleichbar sein? Oder sind die Daten unwiederbringlich veraltet?