Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 3281

 
Maxim Dmitrievsky #:

No estoy seguro de cómo hacerlo, y tengo sueño.

algo parecido

Sí, no es eso.

 
fxsaber #:

Bien, mal.

Es casi algo, búscalo, me voy.

 
fxsaber #:

Intentar encontrar rápidamente cadenas cortas similares en una cadena larga.

Esta implementación mediante Alglib tarda más de seis segundos en buscar cadenas cortas similares (300) en la cadena del millón.

Lo he acelerado.

#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 

Ahora en 300 milisegundos.

 
fxsaber #:

Ahora en 300 milisegundos.

Cuando ninguna matriz puede hacerlo.

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

Se tarda tres segundos para encontrar cadenas similares 30K en una cadena de 10M.

 
fxsaber #:

Cuando ninguna matriz puede soportarlo.

Se tarda tres segundos en encontrar cadenas similares de 30K en una cadena de 10M.

Muy chulo, pero igual de inútil.
¿Es un ejemplo de fft()?
 
mytarmailS #:
¿Es un ejemplo con fft()?

300/1M no es fft, 30K/10M es fft.

 
fxsaber #:

Cuando ninguna matriz puede soportarlo.

Se tarda tres segundos en encontrar cadenas similares de longitud 30K en una cadena de 10M.

Un resultado impresionante.

 

Tomé una muestra de 2010 a 2023 (47.000 líneas), la dividí en 3 partes en orden cronológico y decidí ver qué pasaría si intercambiamos estas partes.

El tamaño de las submuestras tren - 60%, prueba - 20% y examen - 20%.

Hice estas combinaciones (-1) - este es el orden estándar - cronológico. Cada submuestra tiene su propio color.


Entrené 101 modelos con diferentes Seed para cada conjunto de muestras, y obtuve el siguiente resultado


Todas las métricas son estándar, y puede observarse que es difícil determinar el beneficio medio de los modelos (AVR Profit), así como el porcentaje de modelos cuyo beneficio supera los 3000 puntos en la última muestra que no participó en el entrenamiento.

¿Quizás habría que reducir el porcentaje de éxito relativo de las variantes -1 y 0 en el tamaño de la muestra de entrenamiento? En general, parece que Recall reacciona a esto.

En su opinión, ¿los resultados de estas combinaciones deberían ser comparables entre sí en nuestro caso? ¿O los datos están irremediablemente obsoletos?

 
Aleksey Vyazmikin #:

Tomé una muestra de 2010 a 2023 (47.000 líneas), la dividí en 3 partes en orden cronológico y decidí ver qué pasaría si intercambiamos estas partes.

El tamaño de las submuestras tren - 60%, prueba - 20% y examen - 20%.

Hice estas combinaciones (-1) - este es el orden estándar - cronológico. Cada submuestra tiene su propio color.


Entrené 101 modelos con diferentes Seed para cada conjunto de muestras, y obtuve el siguiente resultado


Todas las métricas son estándar, y puede observarse que es difícil determinar el beneficio medio de los modelos (AVR Profit), así como el porcentaje de modelos cuyo beneficio supera los 3000 puntos en la última muestra que no participó en el entrenamiento.

¿Quizás habría que reducir el porcentaje de éxito relativo de las variantes -1 y 0 en el tamaño de la muestra de entrenamiento? En general, parece que Recall reacciona a esto.

En su opinión, ¿los resultados de estas combinaciones deberían ser comparables entre sí en nuestro caso? ¿O los datos están irremediablemente obsoletos?

Otro bricolaje...

Hay validación cruzada, todo se masca y se masca..., muy utilizado....

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

Otro hecho a sí mismo...

Hay validación cruzada, todo se mastica y se mastica..., muy utilizado.....

Esa es la cuestión, la validación cruzada puede no funcionar eficazmente aquí.

¿Y qué sentido tiene este autodiseño? Maxim voltea la muestra por cronología - asumiendo que el resultado será idéntico - mi experimento muestra la falacia. O todo es individual y la validación puede revelar un patrón u ocurrencia aleatoria en toda la muestra.

Razón de la queja: