Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 3257

 
Forester #:

У меня встроенный побыстрее сработал: на i7-6700

Добавил в код данные процессора и EX5-инструкций.
 
Forester #:

А во время работы Алглибовского PearsonCorrM память все время растет: и 5 гг видел, на скрин 4,6 попало

Почти в два раза увеличивается объем потребления за счет этой строки.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Машинное обучение в трейдинге: теория, модели, практика и алготорговля

fxsaber, 2023.09.25 18:01

#include <Math\Alglib\statistics.mqh> // https://www.mql5.com/ru/code/11077

const matrix<double> CorrMatrix( const matrix<double> &Matrix )
{
  matrix<double> Res = {};
  
  const CMatrixDouble MatrixIn(Matrix);
  CMatrixDouble MatrixOut;  

  if (CBaseStat::PearsonCorrM(MatrixIn, MatrixIn.Rows(), MatrixIn.Cols(), MatrixOut)) // https://www.mql5.com/ru/code/11077
    Res = MatrixOut.ToMatrix();
  
  return(Res);
}

Это просто переход от CMatrixDouble к matrix<double>. Из-за памяти пришлось даже делать такое сравнение матриц.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Машинное обучение в трейдинге: теория, модели, практика и алготорговля

fxsaber, 2023.09.25 18:01

bool IsEqual( matrix<double> &Matrix1, const matrix<double> &Matrix2 )
{
//  return(MathAbs((Matrix1 - Matrix2).Mean()) < 1e-15); // Дорого по памяти.
  
  Matrix1 -= Matrix2;  
  
  const bool Res = (MathAbs(Matrix1.Mean()) < 1e-15);
  
  Matrix1 += Matrix2;
  
  return(Res);
}
 
fxsaber #:
Почти в два раза увеличивается объем потребления за счет этой строки.

Это просто переход от CMatrixDouble к matrix<double>. Из-за памяти пришлось даже делать такое сравнение матриц.

И время на 40% увеличивает эта конвертация. Закомментировал // Res = MatrixOut.ToMatrix();

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

Т.е. если работать только с алглибововским фнкционалом (без перевода его матриц в матрицы терминала) то будет быстрее.

 
fxsaber #:

Питон за какое время считает такую же по размерам исходную матрицу, как в примере выше?

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

Замер времени с учетом создания матрицы

 

выбрасывайте свои камни )



 
Maxim Dmitrievsky #:

Замер времени с учетом создания матрицы

Array size: 1716.61376953125 MB
Time taken: 4.784467697143555 seconds

Это на стареньком FX-8350

 
fxsaber #:

На ее основе сделал расчет корреляционной матрицы.

Замерил производительность.

Для статистики такой результат у меня

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 
Явно Python гораздо быстрей. А значит и на C будет быстрей, выходит, что MQ чего то нам не договаривают, обещая сопоставимую производительность...

Замечу, что у Python при запуске кода происходит небольшое распараллеливание - на пол секунды примерно на два ядра, остаток на одном ядре считает.

 
библиотека NumPy написана на С
 
Maxim Dmitrievsky #:
библиотека NumPy написана на С

Ну да, логично. Поэтому я и упомянул, что обёртка питона быстрей, чем компилятор типа Си MQL5.

 

Вот на R 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")

Результат

> 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
> 
Причина обращения: