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

 

tira tus piedras )



 
Maxim Dmitrievsky #:

Medición del tiempo teniendo en cuenta la creación de matrices

Array size: 1716.61376953125 MB
Time taken: 4.784467697143555 seconds

Esto es en un viejo FX-8350.

 
fxsaber #:

A partir de ahí, calculé la matriz de correlaciones.

Medí el rendimiento.

Para las estadísticas, este es el resultado que obtuve

2023.09.26 06:28:23.304 Test_Corr (USDJPY,H1)   EX5: 3981 AVX Release.
2023.09.26 06:28:23.304 Test_Corr (USDJPY,H1)   TerminalInfoString(TERMINAL_CPU_NAME) = AMD FX-8350 Eight-Core 
2023.09.26 06:28:23.304 Test_Corr (USDJPY,H1)   TerminalInfoInteger(TERMINAL_CPU_CORES) = 8 
2023.09.26 06:28:23.304 Test_Corr (USDJPY,H1)   TerminalInfoString(TERMINAL_CPU_ARCHITECTURE) = AVX 
2023.09.26 06:28:23.332 Test_Corr (USDJPY,H1)   inRows = 100 inCols = 15000 
2023.09.26 06:28:45.032 Test_Corr (USDJPY,H1)   matrix<double> Matrix1 = CorrMatrix(Matrix) - 21700095 mcs, 1717 MB
2023.09.26 06:29:48.495 Test_Corr (USDJPY,H1)   matrix<double> Matrix2 = Matrix.CorrCoef(false) - 63460976 mcs, 1717 MB
2023.09.26 06:29:50.225 Test_Corr (USDJPY,H1)   IsEqual(Matrix1, Matrix2) = true 

2023.09.26 06:34:21.572	Test_Corr (USDJPY,H1)	EX5: 3981 X64 Regular Release.
2023.09.26 06:34:21.572	Test_Corr (USDJPY,H1)	TerminalInfoString(TERMINAL_CPU_NAME) = AMD FX-8350 Eight-Core 
2023.09.26 06:34:21.572	Test_Corr (USDJPY,H1)	TerminalInfoInteger(TERMINAL_CPU_CORES) = 8 
2023.09.26 06:34:21.572	Test_Corr (USDJPY,H1)	TerminalInfoString(TERMINAL_CPU_ARCHITECTURE) = AVX 
2023.09.26 06:34:21.600	Test_Corr (USDJPY,H1)	inRows = 100 inCols = 15000 
2023.09.26 06:34:42.908	Test_Corr (USDJPY,H1)	matrix<double> Matrix1 = CorrMatrix(Matrix) - 21308403 mcs, 1717 MB
2023.09.26 06:35:46.736	Test_Corr (USDJPY,H1)	matrix<double> Matrix2 = Matrix.CorrCoef(false) - 63826475 mcs, 1717 MB
2023.09.26 06:35:48.481	Test_Corr (USDJPY,H1)	IsEqual(Matrix1, Matrix2) = true 
Claramente Python es mucho más rápido. Esto significa que C también será más rápido, así que resulta que MQ no nos está diciendo algo, prometiendo un rendimiento comparable....

Debo señalar que Python tiene una pequeña paralelización al ejecutar código - durante medio segundo para unos dos núcleos, el resto se cuenta en un núcleo.

 
La biblioteca NumPy está escrita en C
 
Maxim Dmitrievsky #:
la biblioteca NumPy está escrita en C.

Bueno, sí, tiene sentido. Por eso mencioné que el wrapper de python es más rápido que un compilador de C como MQL5.

 

Aquí en R ChatGPT ofrece

set.seed(123)  #  Задаем зерно для воспроизводимости результатов

calc_corr_matrix <- function() {
  #arr <- matrix(runif(15000 * 100), nrow = 15000, ncol = 100)
  arr <- matrix(runif(100 * 15000), nrow = 100, ncol = 15000)
  corr_matrix <- cor(arr)
  size_in_mb <- object.size(corr_matrix) / 1024^2
  cat("Array size:", size_in_mb, "MB\n")
  return(corr_matrix)
}

start_time <- Sys.time()
corr_matrix <- calc_corr_matrix()
end_time <- Sys.time()

cat("Time taken:", as.numeric(end_time - start_time), "seconds\n")

Resultado

> set.seed(123)  #  Задаем зерно для воспроизводимости результатов

> calc_corr_matrix <- function() {
+   #arr <- matrix(runif(15000 * 100), nrow = 15000, ncol = 100)
+   arr <- matrix(runif(100 * 15000), nrow = 100,  .... [TRUNCATED] 

> start_time <- Sys.time()

> corr_matrix <- calc_corr_matrix()
Array size: 1716.614 MB

> end_time <- Sys.time()

> cat("Time taken:", as.numeric(end_time - start_time), "seconds\n")
Time taken: 27.92359 seconds
> 
 

Según tengo entendido, python puede trabajar con una matriz de enteros y aquí las velocidades son de otro orden

import numpy as np
import time

def calc_corr_matrix():
    arr = np.random.randint(1, 101, size=(15000, 100), dtype=np.int32)
    corr_matrix = np.corrcoef(arr, rowvar=False)
    size_in_mb = corr_matrix.nbytes / 1024**2
    print("Array size:", size_in_mb, "MB")
    return corr_matrix

np.random.seed(123)  #  Задаем зерно для воспроизводимости результатов

start_time = time.time()
corr_matrix = calc_corr_matrix()
end_time = time.time()

print("Time taken:", end_time - start_time, "seconds")

Si el código es correcto, el resultado es el siguiente

Array size: 0.0762939453125 MB
Time taken: 0.5172276496887207 seconds

La cuestión de la exactitud / comparabilidad de los resultados de los cálculos en sí debe ser comprobado.

 
fxsaber #:

Esto es simplemente una transición de CMatrixDouble a matrix<double>.

Se necesita un 20% más de tiempo de ejecución para convertir los formatos de ambas maneras. Pero sigue siendo mucho (> 3 veces) más lento que NumPy.

 
Maxim Dmitrievsky #:

Medición del tiempo teniendo en cuenta la creación de matrices

Guarde ambas matrices en archivos para conciliar los resultados.

 
Aleksey Vyazmikin #:

Aquí en R ChatGPT ofrece

Esta variante de R es casi 6 veces inferior a NumPy.

Razón de la queja: