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

 
Maxim Dmitrievsky #:

correlazioni incrociate non normalizzate )

cross-covarianza.

È necessario il metodo Pearson.

 
fxsaber #:

Beh, avete bisogno di Pearson.

Non sono sicuro di come fare e ho sonno.

Qualcosa di simile.

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

Non so come fare e ho sonno.

qualcosa di simile

Sì, non è questo.

 
fxsaber #:

Giusto, sbagliato.

E' quasi qualcosa, cercalo, io vado.

 
fxsaber #:

Cercare di trovare rapidamente stringhe brevi simili in una stringa lunga.

Questa implementazione tramite Alglib impiega più di sei secondi per cercare stringhe brevi simili (300) nella milionesima stringa.

L'ho accelerato.

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


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

Ora in 300 millisecondi.

 
fxsaber #:

Ora tra 300 millisecondi.

Quando nessuna matrice può farlo.

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

Ci vogliono tre secondi per trovare stringhe simili a 30K in una stringa di 10M.

 
fxsaber #:

Quando nessuna matrice è in grado di gestirlo.

Ci vogliono tre secondi per trovare stringhe simili a 30K in una stringa di 10M.

Molto bello, ma altrettanto inutile.
È un esempio di fft()?
 
mytarmailS #:
Si tratta di un esempio con fft()?

300/1M non è fft, 30K/10M è fft.

 
fxsaber #:

Quando nessuna matrice è in grado di gestirlo.

Ci vogliono tre secondi per trovare stringhe simili di lunghezza 30K in una stringa di 10M.

Un risultato impressionante!

 

Ho preso un campione dal 2010 al 2023 (47k righe), l'ho diviso in 3 parti in ordine cronologico e ho deciso di vedere cosa sarebbe successo scambiando queste parti.

Le dimensioni dei sottocampioni sono: treno - 60%, test - 20% ed esame - 20%.

Ho fatto queste combinazioni (-1) - questo è l'ordine standard - cronologico. Ogni sottocampione ha il suo colore.


Ho addestrato 101 modelli con diversi semi per ogni serie di campioni e ho ottenuto il seguente risultato


Tutte le metriche sono standard, e si può notare che è difficile determinare il profitto medio dei modelli (AVR Profit), così come la percentuale di modelli il cui profitto supera i 3000 punti sull'ultimo campione che non ha partecipato all'addestramento.

Forse il tasso di successo relativo delle varianti -1 e 0 nella dimensione del campione di addestramento dovrebbe essere ridotto? In generale, sembra che Recall reagisca a questo.

Secondo voi, i risultati di queste combinazioni dovrebbero essere comparabili tra loro nel nostro caso? Oppure i dati sono irrimediabilmente obsoleti?