트레이딩의 머신러닝: 이론, 모델, 실전 및 알고리즘 트레이딩 - 페이지 3258

 
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 
분명히 파이썬이 훨씬 빠릅니다. 이는 C도 더 빠르다는 것을 의미하므로 MQ가 비슷한 성능을 약속하면서 우리에게 무언가를 말하지 않는 것으로 나타났습니다....

파이썬은 코드를 실행할 때 약 두 개의 코어에 대해 0.5초 동안은 병렬화가 적고 나머지는 하나의 코어에서 계산된다는 점에 유의해야 합니다.

 
NumPy 라이브러리는 C로 작성되었습니다.
 
Maxim Dmitrievsky #:
NumPy 라이브러리는 C로 작성되었습니다.

네, 말이 되죠. 그래서 파이썬 래퍼가 MQL5와 같은 C 컴파일러보다 빠르다고 언급한 것입니다.

 

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

내가 알기로 파이썬은 정수 행렬로 작업 할 수 있으며 여기서는 속도가 다른 순서입니다.

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

코드가 올바른 경우 결과는 다음과 같습니다.

Array size: 0.0762939453125 MB
Time taken: 0.5172276496887207 seconds

계산 결과 자체의 정확성 / 비교 가능성에 대한 문제를 확인해야합니다.

 
fxsaber #:

이것은 단순히 CMatrixDouble에서 matrix<double>로 전환하는 것입니다.

두 가지 방식으로 형식을 변환하는 데 실행 시간이 20% 더 걸립니다. 하지만 여전히 NumPy보다 훨씬(3배 이상) 느립니다.

사유: