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

 

Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading

Apprendimento automatico nel trading: teoria, modelli, pratica e trading di algoritmi

Maxim Dmitrievsky, 2023.10.01 10:55 AM

residui_a = a_mat - a_mat. column_means residui_b = b_mat - b_mat. column_means a_residual_sums = residuals_a. column_sums b_residual_sums = residuals_b. column_sums residui_prodotti = dot_product( residuals_a. transpose, residuals_b)

sum_products = sqrt( dot_product( a_residual_sums, b_residual_sums))

correlazioni = residui_prodotti / somma_prodotti

Questo sembra essere un calcolo frontale della matrice di correlazione.

 
fxsaber #:
Giusto, grazie! Non capisco perché l'opzione sbagliata funziona con inCols < 100.

Apparentemente

Sens = 1 e-10
troppo. Casuale - la correlazione media è circa 0, probabilmente.
 
Forester #:

Probabilmente troppo. Casuale - c'è una correlazione media di circa 0, probabilmente.

Non si misura l'errore medio, ma la differenza massima tra gli elementi corrispondenti.

Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading

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

fxsaber, 2023.10.01 09:38 pm

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


Ecco perché non è chiaro come il codice sbagliato

  for (int i = 0; i < (int)Matrix.Rows(); i++)

riceva una corrispondenza.

inRows = 5 inCols = 50 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 242 mcs, 0 MB
matrix<double> Matrix4 = CorrMatrix2(Matrix) - 117 mcs, 0 MB
IsEqual(Matrix1, Matrix4) = true 
 
Forester #:
E PearsonCorrM2 può essere accelerato di 2 volte se si conta per triangolo, cioè partendo dalla fine. Contare 100 righe con tutti, poi 99 con tutti 0-99, 99 e 100° già contati - si può semplicemente copiare. ...50° riga con tutti fino al 50°, ecc. Beh, non contare con se stesso perché =1.
Temo che non serva a nulla.
inRows = 100 inCols = 15000 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 14196778 mcs, 1717 MB
matrix<double> Matrix4 = CorrMatrix2(Matrix) - 538256223 mcs, 1717 MB
IsEqual(Matrix1, Matrix4) = true 
Il terribile freno rallenterà comunque. Qui, inequivocabilmente, non si può fare a meno di strumenti autocostruiti.
 
fxsaber #:

Ecco perché non è chiaro come, con il codice sbagliato.

ottiene una corrispondenza.

L'ho capito: se si scambiano i calcoli delle matrici, si ottiene una mancata corrispondenza.

inRows = 5 inCols = 50 
matrix<double> Matrix4 = CorrMatrix2(Matrix) - 113 mcs, 0 MB
matrix<double> Matrix1 = CorrMatrix(Matrix) - 214 mcs, 0 MB
IsEqual(Matrix1, Matrix4) = false 

Vale a dire che i rifiuti della memoria durante il calcolo della prima matrice sono finiti nella nuova matrice e per qualche miracolo hanno coinciso con il risultato desiderato.

 
fxsaber #:

Penso che si tratti di un calcolo frontale della matrice di correlazione.

Sì, se facciamo μl senza cicli su nuove matrici, non sarà più veloce?
 
fxsaber #:
196

500 secondi contro i 14 - ecco perché ricordo che è stato

PearsonCorrM

il più veloce, a causa dell'algoritmo.

Maxim Dmitrievsky #:
Beh, sì, se lo fai su nuove matrici µl, non sarà più veloce?

Penso che tutte le 9 funzioni utilizzate in PearsonCorrM e PearsonCorrM2 possano essere riscritte in matrici e confrontate. In linea di principio, ci vorrebbe un'ora di lavoro per riscrivere le dichiarazioni e i riferimenti alle matrici. Allo stesso tempo scopriremo se le matrici sono migliori degli array din.

Titoli
IsFiniteMatrix(
IsFiniteVector(
AblasInternalSplitLength(
AblasSplitLength(
RMatrixGemmK(
RMatrixGemm(
RMatrixSyrk2(
RMatrixSyrk(
RankX(

 
Forester #:

Penso che tutte le 9 funzioni utilizzate in PearsonCorrM e PearsonCorrM2 possano essere riscritte in matrici e confrontate. In linea di principio, ci vorrà un'ora di lavoro per riscrivere gli annunci e i riferimenti alle matrici. Allo stesso tempo scopriremo se le matrici sono migliori delle matrici din.

È già tutto pronto: MQ li ha riscritti per le sue matrici.

Forester #:

500 sec vs 14 - ecco perché me lo sono ricordato.

il più veloce, a causa dell'algoritmo.

Non mi ero accorto dell'algoritmo. NumPy non è molto indietro solo per il fatto che non esegue calcoli ripetuti.

NumPy sembra avere un algoritmo diverso da ALglib, dato che le prestazioni sono molto diverse. Ma è chiaro che in tutta l'enorme comunità Python c'è stato qualche algoritmista molto forte che ha dedicato una discreta quantità di tempo a studiare questo problema.
 
fxsaber #:

È già stato fatto: gli MQ li hanno riscritti per adattarli alle loro matrici.

Ed è diventato più lento?)

 
Forester #:

Ed è diventato più lento ))))

Rispetto alla vecchia versione di Alglib. Non mi risulta che sia diventato più lento.