L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 3268

 
Forester #:

Penso che PearsonCorrM2 funzionerà rapidamente. Alimentiamo 1 matrice piena, la seconda matrice da una riga da controllare. E se si parte dalla fine, è possibile specificare la dimensione della prima matrice come numero della riga successiva, in modo da non ricalcolare ripetutamente la correlazione per le righe inferiori a quella da verificare.

All'inizio ho provato a fare la variante frontale, cioè a contare tutte le righe ogni volta. Ho avuto l'impressione che ci sia un errore in Alglib, perché non sono riuscito a trovarlo.

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


Il risultato spesso coincide.

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


Ma in alcune situazioni non è così.

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


Se fosse sempre così, sarebbe sicuramente un mio errore. Ma qui c'è qualcosa di poco chiaro.

 
Maxim Kuznetsov #:

R è notevole per il suo miscuglio. In ogni momento ha tutto, qualsiasi pacchetto per ogni occasione.

Ma dopo un anno o due è inimitabile: sarà impossibile eseguire gli esempi del libro.

Un sistemaben strutturato con un eccellente apparato di riferimento creato da un team di professionistinon può essere un'accozzaglia. Il sistema R è orientato al trading, senza distrazioni verso tutto e niente per amore dell'universalità e del populismo.

Questo è esattamente ciò che il libro dimostra.

E un'altra cosa che il libro basato su R fa è rompere l'illusione che si possa ottenere un modello basato su MO in fretta, senza possedere un ampio set di strumenti e, soprattutto, senza capire perché si ha bisogno di questo o quello strumento (pacchetto, funzione), perché si ha bisogno di questa o quella fase di costruzione del modello, senza capire che non si può buttare via qualcosa - tutto cadrà a pezzi.

 

Un esempio perfetto della totale mancanza di comprensione di COSA si sta facendo sono le decine di pagine di correlazioni di qualcosa con qualcosa.

Prima di calcolare la correlazione, si dovrebbe rispondere alla domanda: esiste una correlazione per le serie utilizzate? Per le serie finanziarie - questa è la prima e più importante domanda, perché per le serie finanziarie la correlazione non esiste, perché per esse non esiste un'aspettativa matematica ed è necessario dimostrare che la media utilizzata PUÒ essere utilizzata come aspettativa matematica.

A proposito, in R è possibile controllare una volta uno starnuto, una routine.

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

È un libro meraviglioso!

Deve coprire tutti i problemi del Ministero della Difesa.

per i principianti, che per ora siete voi.

per i ragazzi in generale. Il Tideverse.

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

Un esempio perfetto della totale mancanza di comprensione di COSA si sta facendo sono le decine di pagine di correlazioni tra qualcosa e qualcosa.

Visto che non capite, ve lo spiegherò.

Forum sul trading, sui sistemi di trading automatizzati e sul test delle strategie di trading

Apprendimento automatico nel trading: teoria, modelli, pratica e trading di algoritmi

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 è un numero casuale. Cioè la correlazione è calcolata su matrici casuali. Lo scopo è quello di assicurarsi che diverse varianti di implementazione dell'algoritmo diano lo stesso risultato. Vengono confrontati la velocità di esecuzione dell'algoritmo e il consumo di memoria. Se siete incompetenti, restatene fuori.

 
fxsaber #:

Non ne ho trovato uno standard per il calcolo riga per riga. Alglib sembra lento. Sto provando la mia 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)));
}


Risultato.

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 versione autoprodotta si è rivelata più veloce della variante standard, ma più lenta di Alglib (non sono riuscito a capire l'algoritmo). Allo stesso tempo, la versione fatta in casa può contare matrici di qualsiasi dimensione, a differenza di altre varianti.

 
fxsaber #:


Risultato.

L'autoprogettazione è stata più veloce della variante standard, ma più lenta di Alglib (non sono riuscito a capire l'algoritmo). Allo stesso tempo, può leggere matrici di qualsiasi dimensione, a differenza di altre varianti.

Perché vi piace tanto mql per i calcoli? Potete scrivere dll in C e saranno il più veloci possibile.

Per me, mql è ancora un linguaggio per aprire operazioni, soprattutto. Ed è giusto così, in effetti.

 
fxsaber #:
Se non capite, lasciatemi spiegare.

MathRand è un numero casuale. Cioè la correlazione viene calcolata su matrici casuali. L'obiettivo è assicurarsi che le diverse implementazioni dell'algoritmo diano lo stesso risultato. Vengono confrontati la velocità di esecuzione dell'algoritmo e il consumo di memoria. Se siete incompetenti, restatene fuori.

Qual è l'obiettivo finale di tutta questa epopea della correlazione?

Beh, avete scoperto quale implementazione è più veloce, quale dà risultati identici, quale no.... Cosa farete con questa conoscenza?
 
Maxim Dmitrievsky #:

E perché vi piace tanto mql per i calcoli? Potete scrivere le dll in c e saranno il più veloci possibile.

Sono limitato dalla mia incompetenza.

 
Maxim Dmitrievsky #:

Per me, il mql è ancora il linguaggio per l'apertura delle operazioni, per lo più. E a ragione, in effetti.

Anche per i test e la visualizzazione, e per le azioni rapide, credo.