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

 
Maxim Dmitrievsky #:

correlações cruzadas não normalizadas )

covariância cruzada.

Bem, você precisa de Pearson.

 
fxsaber #:

Bem, você precisa da Pearson.

Não tenho certeza de como fazer isso e estou com sono.

Algo semelhante.

>>> 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 #:

Não tenho certeza de como fazer isso e estou com sono.

algo semelhante

Sim, não é isso.

 
fxsaber #:

Certo, errado.

É quase algo, procure, estou indo.

 
fxsaber #:

Tentando encontrar rapidamente cadeias curtas semelhantes em uma cadeia longa.

Essa implementação via Alglib leva mais de seis segundos para procurar strings curtas semelhantes (300) na milionésima string.

Eu o acelerei.

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


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 = 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 

Agora em 300 milissegundos.

 
fxsaber #:

Agora em 300 milissegundos.

Quando nenhuma matriz consegue fazer isso.

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

São necessários três segundos para encontrar cadeias de 30K semelhantes em uma cadeia de 10M.

 
fxsaber #:

Quando nenhuma matriz consegue lidar com isso.

São necessários três segundos para encontrar cadeias de 30K semelhantes em uma cadeia de 10M.

Muito legal, mas igualmente inútil.
Esse é um exemplo de fft()?
 
mytarmailS #:
Esse é um exemplo com fft()?

300/1M não é fft, 30K/10M é fft.

 
fxsaber #:

Quando nenhuma matriz consegue lidar com isso.

São necessários três segundos para encontrar cadeias de caracteres semelhantes de comprimento 30K em uma cadeia de 10M.

Resultado impressionante!

 

Peguei uma amostra de 2010 a 2023 (47 mil linhas), dividi-a em três partes em ordem cronológica e decidi ver o que aconteceria se trocássemos essas partes.

O tamanho das subamostras é treinamento - 60%, teste - 20% e exame - 20%.

Fiz essas combinações (-1) - essa é a ordem padrão - cronológica. Cada subamostra tem sua própria cor.


Treinei 101 modelos com Seed diferente para cada conjunto de amostras e obtive o seguinte resultado


Todas as métricas são padrão, e pode-se observar que é difícil determinar o lucro médio dos modelos (AVR Profit), bem como a porcentagem de modelos cujo lucro excede 3.000 pontos na última amostra que não participou do treinamento.

Talvez a taxa de sucesso relativa das variantes -1 e 0 no tamanho da amostra de treinamento deva ser reduzida? Em geral, parece que o Recall reage a isso.

Em sua opinião, os resultados de tais combinações devem ser comparáveis entre si em nosso caso? Ou os dados estão irremediavelmente desatualizados?