Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 3268

 
Forester #:

Acho que o PearsonCorrM2 funcionará rapidamente. Alimentamos uma matriz completa, a segunda matriz de uma linha a ser verificada. E se você começar do final, poderá especificar o tamanho da primeira matriz como o número da próxima linha, para que não recalcule a correlação repetidamente para as linhas abaixo da linha que está sendo testada.

Tentei fazer a variante frontal no início - contar todas as linhas a cada vez. Tive a impressão de que há algum erro no Alglib, pois não consegui encontrá-lo.

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


O resultado geralmente coincide.

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


Mas em algumas situações não coincide.

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


Se fosse sempre assim, o erro seria meu, com certeza. Mas há algo sujo aqui.

 
Maxim Kuznetsov #:

O R é notável por sua miscelânea. Em um dado momento, ele tem tudo, qualquer pacote para qualquer ocasião.

Mas depois de um ou dois anos, ele se torna inimitável - será impossível executar os exemplos do livro.

Um sistemabem estruturado com um excelente aparato de referência criado por uma equipe profissionalnão pode ser uma bagunça. O System R é orientado para a negociação, sem distrações para tudo e qualquer coisa em nome da universalidade e do populismo.

É exatamente isso que o livro demonstra.

E outra coisa que o livro baseado em R faz é quebrar a ilusão de que você pode obter um modelo baseado em MO rapidamente, sem possuir um grande conjunto de ferramentas e, o mais importante, sem entender por que você precisa desta ou daquela ferramenta (pacote, função), por que você precisa deste ou daquele estágio de construção do modelo, sem entender que você não pode jogar algo fora - tudo vai desmoronar.

 

Um exemplo perfeito da total falta de compreensão do QUE está sendo feito são as dezenas de páginas de correlações de algo com algo.

Antes de calcular a correlação, deve-se responder à pergunta: existe correlação para a série utilizada? Para séries financeiras, essa é a primeira e mais importante pergunta, pois para séries financeiras a correlação não existe, porque para elas não há expectativa matemática e é necessário provar que a média usada PODE ser usada como expectativa matemática.

A propósito, no R é necessário verificar uma vez por espirro, rotina.

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

É um livro maravilhoso!

Ele deve cobrir todos os problemas do MoD.

Para iniciantes, que é o que você é agora.

para meninos em geral. O Tideverse.

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

Um exemplo perfeito da completa falta de compreensão do QUE está sendo feito são as dezenas de páginas de correlações de algo com algo.

Como você não entendeu, vou explicar.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Aprendizado de máquina na negociação: teoria, modelos, prática e negociação de algoritmos

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 é um número aleatório. Ou seja, a correlação é calculada em matrizes aleatórias. O objetivo é garantir que diferentes variantes de implementações de algoritmos apresentem o mesmo resultado. A velocidade de execução do algoritmo e o consumo de memória são comparados. Se você for incompetente, não se meta nisso.

 
fxsaber #:

Não encontrei um padrão para o cálculo linha a linha. O Alglib parecia lento. Estou tentando minha própria 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)));
}


Resultado.

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 

O projeto próprio acabou sendo mais rápido do que a variante padrão, mas mais lento do que o Alglib (não consegui entender o algoritmo). Ao mesmo tempo, a versão caseira pode contar matrizes de qualquer tamanho, ao contrário de outras variantes.

 
fxsaber #:


Resultado.

O autodesign foi mais rápido que a variante padrão, mas mais lento que o Alglib (não consegui entender o algoritmo). Ao mesmo tempo, ele pode ler matrizes de qualquer tamanho, ao contrário de outras variantes.

Por que você gosta tanto do mql para cálculos? Você pode escrever dlls em C e elas serão tão rápidas quanto possível.

Para mim, a mql ainda é uma linguagem para abrir negociações, principalmente. E o que é certo, de fato.

 
fxsaber #:
Se você não entendeu, deixe-me explicar.

MathRand é um número aleatório. Ou seja, a correlação é calculada em matrizes aleatórias. O objetivo é garantir que diferentes implementações de algoritmos apresentem o mesmo resultado. A velocidade de execução do algoritmo e o consumo de memória são comparados. Se você for incompetente, não se meta nisso.

Então, qual é o objetivo final de toda essa epopeia com a correlação?

Bem, você descobriu qual implementação é mais rápida, qual dá resultados idênticos, qual não dá.... O que você vai fazer com esse conhecimento?
 
Maxim Dmitrievsky #:

E por que você gosta tanto de mql para cálculos? Você pode escrever dlls em c e elas serão tão rápidas quanto possível.

Estou limitado por minha incompetência.

 
Maxim Dmitrievsky #:

Para mim, o mql ainda é a linguagem para abrir negociações, principalmente. E, de fato, com razão.

Também para testes e visualização, e para ações rápidas, eu acho