L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 3268

 
Forester #:

Je pense que PearsonCorrM2 fonctionnera rapidement. Nous introduisons une matrice complète, la deuxième matrice d'une ligne devant être vérifiée. Et si vous partez de la fin, vous pouvez spécifier la taille de la première matrice comme étant le numéro de la ligne suivante, afin de ne pas recalculer la corrélation à plusieurs reprises pour les lignes inférieures à la ligne testée.

J'ai d'abord essayé de faire la variante frontale, c'est-à-dire de compter toutes les lignes à chaque fois. J'ai eu l'impression qu'il y avait une erreur dans Alglib, car je ne l'ai pas trouvée moi-même.

#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)));  
}


Le résultat coïncide souvent.

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


Mais dans certaines situations, ce n'est pas le cas.

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


Si c'était toujours comme ça, ce serait certainement une erreur de ma part. Mais il y a quelque chose d'impur ici.

 
Maxim Kuznetsov #:

R est remarquable pour son méli-mélo. À tout moment, il y a de tout, n'importe quel paquet pour n'importe quelle occasion.

Mais après un an ou deux, il est inimitable - il sera impossible d'exécuter les exemples du livre.

Un systèmebien structuré avec un excellent appareil de référence créé par une équipe professionnellene peut pas être un méli-mélo. Le Système R est orienté vers le trading, sans distraction vers tout et n'importe quoi au nom de l'universalité et du populisme.

C'est exactement ce que démontre le livre.

Et une autre chose que fait le livre basé sur R est de briser l'illusion que l'on peut obtenir un modèle basé sur MO à la hâte, sans posséder un grand ensemble d'outils, et surtout, sans comprendre pourquoi on a besoin de tel ou tel outil (paquet, fonction), pourquoi on a besoin de telle ou telle étape de la construction du modèle, sans comprendre qu'on ne peut pas jeter quelque chose - tout s'écroulerait.

 

Les dizaines de pages de corrélations entre quelque chose et quelque chose sont un parfait exemple de l'incompréhension totale de ce qui est fait.

Avant de calculer une corrélation, il convient de répondre à la question suivante : existe-t-il une corrélation pour la série utilisée ? Pour les séries financières, c'est la première question et la plus importante, car pour les séries financières, la corrélation n'existe pas, parce qu'il n'y a pas d'espérance mathématique et qu'il est nécessaire de prouver que la moyenne utilisée PEUT être utilisée comme espérance mathématique.

D'ailleurs, en R, il s'agit de vérifier une fois par éternuement, la routine.

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

C'est un livre magnifique !

Il doit couvrir tous les problèmes du ministère de la défense.

pour les débutants, ce que vous êtes pour l'instant.

pour les garçons en général. Le Tideverse.

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

Les dizaines de pages de corrélations entre quelque chose et quelque chose sont un parfait exemple de l'incompréhension totale de ce qui est fait.

Puisque vous ne comprenez pas, je vais vous expliquer.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

L'apprentissage automatique en trading : théorie, modèles, pratique et trading algorithmique

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 est un nombre aléatoire. C'est à dire que la corrélation est calculée sur des matrices aléatoires. L'objectif est de s'assurer que les différentes variantes d'implémentation de l'algorithme donnent le même résultat. La vitesse d'exécution de l'algorithme et la consommation de mémoire sont comparées. Si vous êtes incompétent, ne vous en mêlez pas.

 
fxsaber #:

Je n'en ai pas trouvé de standard pour le calcul ligne par ligne. Alglib semble lent. J'essaie ma propre 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)));
}


Résultat.

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 

La conception personnelle s'est avérée plus rapide que la variante standard, mais plus lente qu'Alglib (je n'ai pas pu comprendre l'algorithme). En même temps, la version maison peut compter des matrices de n'importe quelle taille, contrairement à d'autres variantes.

 
fxsaber #:


Résultat.

L'auto-conception était plus rapide que la variante standard, mais plus lente qu'Alglib (je n'ai pas pu comprendre l'algorithme). En même temps, il peut lire des matrices de n'importe quelle taille, contrairement aux autres variantes.

Pourquoi aimez-vous tant mql pour les calculs ? Vous pouvez écrire des dll en C et elles seront aussi rapides que possible.

Pour moi, mql reste un langage pour l'ouverture de transactions, principalement. Et c'est ce qui est juste, en fait.

 
fxsaber #:
Si vous ne comprenez pas, laissez-moi vous expliquer.

MathRand est un nombre aléatoire. En d'autres termes, la corrélation est calculée sur des matrices aléatoires. L'objectif est de s'assurer que différentes implémentations d'algorithmes donnent le même résultat. La vitesse d'exécution de l'algorithme et la consommation de mémoire sont comparées. Si vous êtes incompétent, ne vous en mêlez pas.

Quel est donc le but ultime de cette épopée de la corrélation ?

Vous avez découvert quelle implémentation est la plus rapide, laquelle donne des résultats identiques, laquelle n'en donne pas.... Qu'allez-vous faire de ces connaissances ?
 
Maxim Dmitrievsky #:

Et pourquoi aimez-vous tant mql pour les calculs ? Vous pouvez écrire des dll en c et ce sera aussi rapide que possible.

Je suis limité par mon incompétence.

 
Maxim Dmitrievsky #:

Pour moi, le mql reste le langage pour l'ouverture des transactions, principalement. Et à juste titre, en fait.

Il y a aussi les tests et la visualisation, et l'action rapide, je suppose.