L'Apprentissage Automatique dans le trading : théorie, modèles, pratique et trading algo - page 3281

 
Maxim Dmitrievsky #:

corrélations croisées non normalisées )

la covariance croisée.

Vous avez besoin de Pearson.

[Supprimé]  
fxsaber #:

Vous avez besoin de Pearson.

Je ne sais pas trop comment faire, et j'ai sommeil.

Quelque chose de similaire.

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

Je ne sais pas trop comment faire et j'ai sommeil.

quelque chose de similaire

Oui, ce n'est pas ça.

[Supprimé]  
fxsaber #:

C'est vrai, c'est faux.

C'est presque quelque chose, cherchez, je m'en vais.

 
fxsaber #:

Essayer de trouver rapidement des chaînes courtes similaires dans une longue chaîne.

Il faut plus de six secondes à cette implémentation via Alglib pour rechercher des chaînes courtes similaires (300) dans la millionième chaîne.

Je l'ai accéléré.

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


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

Maintenant en 300 millisecondes.

 
fxsaber #:

Maintenant dans 300 millisecondes.

Alors qu'aucune matrice ne peut le faire.

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

Il faut trois secondes pour trouver des chaînes similaires de 30 000 dans une chaîne de 10 millions.

 
fxsaber #:

Quand aucune matrice ne peut le gérer.

Il faut trois secondes pour trouver des chaînes de 30K similaires dans une chaîne de 10M.

Très cool, mais tout aussi inutile.
Est-ce un exemple de fft() ?
 
mytarmailS #:
S'agit-il d'un exemple avec fft() ?

300/1M n'est pas fft, 30K/10M est fft.

 
fxsaber #:

Quand aucune matrice ne peut le gérer.

Il faut trois secondes pour trouver des chaînes similaires de longueur 30K dans une chaîne de 10M.

Un résultat impressionnant !

 

J'ai pris un échantillon de 2010 à 2023 (47k lignes), je l'ai divisé en 3 parties dans l'ordre chronologique et j'ai décidé de voir ce qui se passerait si nous échangions ces parties.

La taille des sous-échantillons est de 60 % pour la formation, de 20 % pour le test et de 20 % pour l'examen.

J'ai fait ces combinaisons (-1) - c'est l'ordre standard - chronologique. Chaque sous-échantillon a sa propre couleur.


J'ai entraîné 101 modèles avec des semences différentes pour chaque ensemble d'échantillons, et j'ai obtenu le résultat suivant


Toutes les métriques sont standard, et on peut voir qu'il est difficile de déterminer le profit moyen des modèles (AVR Profit), ainsi que le pourcentage de modèles dont le profit dépasse 3000 points sur le dernier échantillon qui n'a pas participé à l'entraînement.

Peut-être faudrait-il réduire le taux de réussite relatif des variantes -1 et 0 dans la taille de l'échantillon d'entraînement ? En général, il semble que Recall réagisse à cela.

À votre avis, les résultats de ces combinaisons devraient-ils être comparables entre eux dans notre cas ? Ou les données sont-elles irrémédiablement obsolètes ?