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

 
Forester #:

Ich denke, PearsonCorrM2 wird schnell funktionieren. Wir füttern 1 Matrix voll, 2. Matrix von einer zu prüfenden Zeile. Und wenn man vom Ende ausgeht, kann man die Größe der ersten Matrix als die Nummer der nächsten Zeile angeben, damit man die Korrelation nicht wiederholt für Zeilen unterhalb der zu prüfenden Zeile neu berechnet.

Ich habe zuerst versucht, die frontale Variante zu machen - jedes Mal alle Zeilen zu zählen. Ich hatte den Eindruck, dass es einen Fehler in Alglib gibt, denn ich konnte ihn selbst nicht finden.

#include <Math\Alglib\statistics.mqh> // https://www.mql5.com/ru/code/11077

const matrix<double> CorrMatrix( const matrix<double> &Matrix )
{
  matrix<double> Res = {};
  
  const CMatrixDouble MatrixIn(Matrix);
  CMatrixDouble MatrixOut;  

  if (CBaseStat::PearsonCorrM(MatrixIn, MatrixIn.Rows(), MatrixIn.Cols(), MatrixOut)) // https://www.mql5.com/ru/code/11077
    Res = MatrixOut.ToMatrix();
  
  return(Res);
}

const matrix<double> CorrMatrix2( const matrix<double> &Matrix )
{
  matrix<double> Res = {};
  Res.Init(Matrix.Cols(), Matrix.Cols());
  
  const CMatrixDouble MatrixIn(Matrix);
  CMatrixDouble Vector(Matrix);
  CMatrixDouble Corr;

  for (int i = 0; i < (int)Matrix.Cols(); i++)
  {
    if (i)
      Vector.SwapCols(0, i);
    
    CBaseStat::PearsonCorrM2(Vector, MatrixIn, MatrixIn.Rows(), 1, MatrixIn.Cols(), Corr);
      
    Res.Col(Corr.Row(0), i);
  }
  
  return(Res);
}

#property script_show_inputs

input int inRows = 5; // Длина строки
input int inCols = 100; // Количество строк

void FillArray( double &Array[], const int Amount )
{
  for (uint i = ArrayResize(Array, Amount); (bool)i--;)
    Array[i] = MathRand();
}

bool IsEqual( matrix<double> &Matrix1, const matrix<double> &Matrix2, const double Sens = 1 e-10 )
{
  Matrix1 -= Matrix2;  
  
  const bool Res = (MathMax(MathAbs(Matrix1.Max()), MathAbs(Matrix1.Min())) < Sens);
  
  Matrix1 += Matrix2;
  
  return(Res);
}

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

void OnStart()
{  
  double Array[];
  FillArray(Array, inRows * inCols);

  matrix<double> Matrix;  
  Matrix.Assign(Array);
  Matrix.Init(inCols, inRows);
  Matrix = Matrix.Transpose();
  
  Print(TOSTRING(inRows) + TOSTRING(inCols));
  
  matrix<double> Matrix1 = CorrMatrix(Matrix);
  matrix<double> Matrix2 = CorrMatrix2(Matrix);
  matrix<double> Matrix3 = Matrix.CorrCoef(false);
  
  Print(TOSTRING(IsEqual(Matrix1, Matrix2)));  
  Print(TOSTRING(IsEqual(Matrix1, Matrix3)));  
}


Das Ergebnis stimmt oft überein.

inRows = 5 inCols = 90 
IsEqual(Matrix1, Matrix2) = true 
IsEqual(Matrix1, Matrix3) = true 


Aber in manchen Situationen stimmt es nicht.

inRows = 5 inCols = 100 
IsEqual(Matrix1, Matrix2) = false 
IsEqual(Matrix1, Matrix3) = true 


Wenn es immer so wäre, dann wäre es sicher mein Fehler. Aber irgendetwas ist hier nicht in Ordnung.

 
Maxim Kuznetsov #:

R ist bemerkenswert für sein Sammelsurium. Zu jedem Zeitpunkt hat es alles, jedes Paket für jede Gelegenheit.

Aber nach ein oder zwei Jahren ist es unnachahmlich - es wird unmöglich sein, die Beispiele in diesem Buch auszuführen.

Eingut strukturiertes System mit einem hervorragenden, von einem professionellen Team erstellten Referenzapparatkann kein Mischmasch sein. System R ist auf den Handel ausgerichtet, ohne Ablenkungen auf alles und jedes, um der Universalität und des Populismus willen.

Genau das zeigt das Buch.

Und eine andere Sache, die das Buch auf der Grundlage von R tut, ist, die Illusion zu brechen, dass man ein Modell auf der Grundlage von MO in Eile bekommen kann, ohne einen großen Satz von Werkzeugen zu besitzen, und vor allem, ohne zu verstehen, warum man dieses oder jenes Werkzeug (Paket, Funktion) braucht, warum man diese oder jene Stufe der Modellbildung braucht, ohne zu verstehen, dass man nicht etwas wegwerfen kann - alles wird auseinander fallen.

 

Ein perfektes Beispiel für das völlige Fehlen eines Verständnisses dessen, WAS getan wird, sind Dutzende von Seiten mit Korrelationen von etwas mit etwas.

Bevor man die Korrelation berechnet, sollte man die Frage beantworten: Gibt es eine Korrelation für die verwendeten Reihen? Für Finanzreihen ist dies die erste und wichtigste Frage, denn für Finanzreihen gibt es keine Korrelation, weil es für sie keine mathematische Erwartung gibt, und es ist notwendig zu beweisen, dass der verwendete Durchschnitt als mathematische Erwartung verwendet werden KANN.

Übrigens, in R ist es, einmal ein Niesen, Routine zu überprüfen.

 
СанСаныч Фоменко #:

Es ist ein wunderbares Buch!

Es muss alle Probleme des Verteidigungsministeriums abdecken.

für Anfänger, die du jetzt bist.

für Jungen im Allgemeinen. Das Tideverse.

 
СанСаныч Фоменко #:

Ein perfektes Beispiel für das völlige Fehlen eines Verständnisses dessen, WAS getan wird, sind die Dutzende von Seiten, auf denen etwas mit etwas in Beziehung gesetzt wird.

Da Sie es nicht verstehen, werde ich es Ihnen erklären.

Forum über Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien

Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algorithmenhandel

fxsaber, 2023.10.01 09:38

void FillArray( double &Array[], const int Amount )
{
  for (uint i = ArrayResize(Array, Amount); (bool)i--;)
    Array[i] = MathRand();
}

MathRand ist eine Zufallszahl. D.h. die Korrelation wird auf Zufallsmatrizen berechnet. Damit soll sichergestellt werden, dass verschiedene Varianten der Algorithmusimplementierung das gleiche Ergebnis liefern. Die Geschwindigkeit der Algorithmusausführung und der Speicherverbrauch werden verglichen. Wenn Sie inkompetent sind, lassen Sie die Finger davon.

 
fxsaber #:

Ich habe keine Standardlösung für die zeilenweise Berechnung gefunden. Alglib schien langsam zu sein. Ich versuche meine eigene Variante.

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

matrix<double> CorrMatrix( const double &Array[], const int PatternLen, const bool CreateMatrix = true )
{
  matrix<double> Res = {};
  const int Size = ArraySize(Array) / PatternLen - 1;
  
  if (CreateMatrix)
  {
    Res.Init(Size + 1, Size + 1);
    Res[Size][Size] = 1;
  }
  
  double Corr[];

  DEJAVU Dejavu;
  Dejavu.SetSignal(Array);
  
  if (CreateMatrix)
    for (int i = 0, j; i < Size; i++)
    {
      Res[i][i] = 1;
      j = i + 1;

      Dejavu.SetPattern(PatternLen, i * PatternLen);
      Dejavu.GetCorrelation(Corr, PatternLen, j * PatternLen);
      
      for (; j <= Size; j++)
      {
        const double Tmp = Corr[(j + 1) * PatternLen - 1];
        
        Res[i][j] = Tmp;
        Res[j][i] = Tmp;
      }    
    }
  else
    for (int i = 0; i < Size; i++)
    {
      Dejavu.SetPattern(PatternLen, i * PatternLen);
      Dejavu.GetCorrelation(Corr, PatternLen, (i + 1) * PatternLen);
    }
        
  return(Res);
}

#property script_show_inputs

input int inRows = 100; // Длина строки
input int inCols = 15000; // Количество строк

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

// NumPy: https://www.mql5.com/ru/forum/86386/page3257#comment_49545300
void OnStart()
{  
  PrintCPU(); // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685

  double Array[];
  FillArray(Array, inRows * inCols); // https://www.mql5.com/ru/forum/86386/page3267#comment_49671602

  matrix<double> Matrix;  
  Matrix.Assign(Array);
  Matrix.Init(inCols, inRows);
  Matrix = Matrix.Transpose();
  
  ulong StartTime, StartMemory;
  
  Print(TOSTRING(inRows) + TOSTRING(inCols));
  
  BENCH(matrix<double> Matrix1 = CorrMatrix(Matrix)) // https://www.mql5.com/ru/forum/86386/page3267#comment_49671602
  BENCH(matrix<double> Matrix2 = Matrix.CorrCoef(false)); // https://www.mql5.com/ru/docs/basis/types/matrix_vector
  BENCH(matrix<double> Matrix3 = CorrMatrix(Array, inRows)); // https://www.mql5.com/ru/code/17982

  BENCH(CorrMatrix(Array, inRows, false)); // https://www.mql5.com/ru/code/17982

  Print(TOSTRING(IsEqual(Matrix1, Matrix2)));
  Print(TOSTRING(IsEqual(Matrix1, Matrix3)));
}


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 = 100 inCols = 15000 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 13795998 mcs, 1717 MB
matrix<double> Matrix2 = Matrix.CorrCoef(false) - 38346008 mcs, 1717 MB
matrix<double> Matrix3 = CorrMatrix(Array, inRows) - 26632760 mcs, 1716 MB
CorrMatrix(Array, inRows, false) - 19412824 mcs, 0 MB
IsEqual(Matrix1, Matrix2) = true 
IsEqual(Matrix1, Matrix3) = true 

Der Eigenentwurf erwies sich als schneller als die Standardvariante, aber langsamer als Alglib (ich konnte den Algorithmus nicht verstehen). Gleichzeitig kann die selbstgemachte Version im Gegensatz zu anderen Varianten Matrizen beliebiger Größe zählen.

 
fxsaber #:


Ergebnis.

Der Selbstentwurf war schneller als die Standardvariante, aber langsamer als Alglib (ich konnte den Algorithmus nicht verstehen). Gleichzeitig kann es im Gegensatz zu anderen Varianten Matrizen beliebiger Größe lesen.

Warum mögen Sie mql so sehr für Berechnungen? Sie können dlls in C schreiben und es wird so schnell wie möglich sein.

Für mich ist mql immer noch eine Sprache für die Eröffnung von Geschäften, hauptsächlich. Und das ist in der Tat richtig so.

 
fxsaber #:
Wenn Sie das nicht verstehen, lassen Sie es mich erklären.

MathRand ist eine Zufallszahl. D.h. die Korrelation wird mit Zufallsmatrizen berechnet. Ziel ist es, sicherzustellen, dass verschiedene Algorithmusimplementierungen das gleiche Ergebnis liefern. Die Geschwindigkeit der Algorithmusausführung und der Speicherverbrauch werden verglichen. Wenn Sie inkompetent sind, halten Sie sich raus.

Was ist also das Endziel dieses ganzen Epos mit der Korrelation?

Nun, Sie haben herausgefunden, welche Implementierung schneller ist, welche identische Ergebnisse liefert und welche nicht.... Was werden Sie mit diesem Wissen tun?
 
Maxim Dmitrievsky #:

Und warum mögen Sie mql so sehr für Berechnungen? Sie können dlls in c schreiben und es wird so schnell wie möglich sein.

Ich bin durch meine Inkompetenz eingeschränkt.

 
Maxim Dmitrievsky #:

Für mich ist mql immer noch die Sprache für die Eröffnung von Geschäften, meistens. Und das zu Recht, in der Tat.

Auch für das Testen und die Visualisierung, und schnelle Aktionen, denke ich.
Grund der Beschwerde: