トレーディングにおける機械学習:理論、モデル、実践、アルゴトレーディング - ページ 3258

 
fxsaber #:
この路線による消費量はほぼ2倍だ。

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

つまり、(行列を終端行列に変換せずに)Alglibov fnctionalだけで作業すれば、もっと速くなる。

 
fxsaber #:

Pythonは、上の例と同じ大きさの元の行列を計算するのにどれくらいの時間がかかるか?

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ライブラリはC言語で書かれている
 
Maxim Dmitrievsky #:
NumPyライブラリはC言語で書かれている。

まあ、そうだね。だから、MQL5のようなCコンパイラよりもpythonラッパーの方が速いと言ったんだ。

 

RチャットGPTのオファー

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倍以上)遅い。

理由: