Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 3258

 
fxsaber #:
Der Verbrauch wird durch diese Linie fast verdoppelt.

Es ist nur ein Übergang von CMatrixDouble zu matrix<double>. Ich musste sogar diesen Matrixvergleich wegen des Speichers durchführen.

Und die Zeit wird durch diese Umwandlung um 40% erhöht. Kommentiert // Res = MatrixOut.ToMatrix();

matrix<double> Matrix1 = CorrMatrix(Matrix) - 10482307 mcs, 0 MB
matrix<double> Matrix2 = Matrix.CorrCoef(false) - 28882536 mcs, 1717 MB

D.h. wenn man nur mit Alglibov fnctional arbeitet (ohne dessen Matrizen in Terminalmatrizen umzuwandeln), geht es schneller.

 
fxsaber #:

Wie lange braucht Python, um die gleiche Größe der ursprünglichen Matrix wie im obigen Beispiel zu berechnen?

import numpy as np
import time

def calc_corr_matrix():
    arr = np.random.rand(15000, 100).astype(np.float32)
    corr_matrix = np.corrcoef(arr)
    size_in_mb = corr_matrix.nbytes / 1024**2
    print("Array size:", size_in_mb, "MB")
    return corr_matrix

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

print("Time taken:", end_time - start_time, "seconds")
Array size: 1716.61376953125 MB
Time taken: 2.08686900138855 seconds

Zeitmessung unter Berücksichtigung der Matrixerstellung

 

werfen Sie Ihre Steine weg )



 
Maxim Dmitrievsky #:

Zeitmessung unter Berücksichtigung der Matrixerstellung

Array size: 1716.61376953125 MB
Time taken: 4.784467697143555 seconds

Dies geschieht mit einem alten FX-8350.

 
fxsaber #:

Auf ihrer Grundlage habe ich eine Berechnung der Korrelationsmatrix vorgenommen.

Ich habe die Leistung gemessen.

Für die Statistik habe ich folgendes Ergebnis erhalten

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 
Offensichtlich ist Python viel schneller. Das bedeutet, dass C auch schneller sein wird, also stellt sich heraus, dass MQ uns nichts sagt und eine vergleichbare Leistung verspricht....

Ich sollte anmerken, dass Python eine kleine Parallelisierung beim Ausführen von Code hat - für eine halbe Sekunde für etwa zwei Kerne, der Rest wird auf einem Kern gezählt.

 
Die NumPy-Bibliothek ist in C geschrieben
 
Maxim Dmitrievsky #:
die NumPy-Bibliothek ist in C geschrieben.

Nun, ja, das macht Sinn. Deshalb habe ich auch erwähnt, dass der Python-Wrapper schneller ist als ein C-Compiler wie MQL5.

 

Hier auf R bietet ChatGPT

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")

Ergebnis

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

Soweit ich weiß, kann Python mit einer Integer-Matrix arbeiten, und die Geschwindigkeiten sind hier von einer anderen Größenordnung

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")

Wenn der Code korrekt ist, sieht das Ergebnis wie folgt aus

Array size: 0.0762939453125 MB
Time taken: 0.5172276496887207 seconds

Die Frage der Genauigkeit/Vergleichbarkeit der Ergebnisse der Berechnungen selbst sollte geprüft werden.

 
fxsaber #:

Dies ist einfach ein Übergang von CMatrixDouble zu matrix<double>.

Es braucht 20% mehr Ausführungszeit, um die Formate in beide Richtungen zu konvertieren. Aber es ist immer noch viel (> 3 mal) langsamer als NumPy.