Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 3270

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Aprendizado de máquina na negociação: teoria, modelos, prática e negociação de algoritmos

Maxim Dmitrievsky, 2023.10.01 10:55 AM

residuals_a = a_mat - a_mat. column_means residuals_b = b_mat - b_mat. column_means a_residual_sums = residuals_a. column_sums b_residual_sums = residuals_b. column_sums residual_products = dot_product( residuals_a. transpose, residuals_b)

sum_products = sqrt( dot_product( a_residual_sums, b_residual_sums))

correlações = residual_products / sum_products

Esse parece ser um cálculo direto da matriz de correlação.

 
fxsaber #:
Certo, obrigado! Não entendo por que a opção errada funcionou com inCols < 100.

Aparentemente

Sens = 1 e-10
demais. Aleatório - a correlação média é aproximadamente 0, provavelmente.
 
Forester #:

Provavelmente muito. Aleatório - há uma correlação média de aproximadamente 0, provavelmente.

Não é o erro médio que é medido aqui, mas a diferença máxima entre os elementos correspondentes.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Aprendizado de máquina na negociação: teoria, modelos, prática e algo-trading

fxsaber, 2023.10.01 09:38 pm

bool IsEqual( matrix<double> &Matrix1, const matrix<double> &Matrix2, const double Sens = 1 e-10 )
{
  Matrix1 -= Matrix2;  
  
  const bool Res = (MathMax(MathAbs(Matrix1.Max()), MathAbs(Matrix1.Min())) < Sens);
  
  Matrix1 += Matrix2;
  
  return(Res);
}


É por isso que não está claro como o código errado

  for (int i = 0; i < (int)Matrix.Rows(); i++)

obtém uma correspondência.

inRows = 5 inCols = 50 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 242 mcs, 0 MB
matrix<double> Matrix4 = CorrMatrix2(Matrix) - 117 mcs, 0 MB
IsEqual(Matrix1, Matrix4) = true 
 
Forester #:
E o PearsonCorrM2 pode ser acelerado em duas vezes se você contar por triângulo, ou seja, a partir do final. Conte 100 linhas com todos, depois 99 com todos os 0-99, 99 e 100º já contados - você pode simplesmente copiar. ...50ª linha com todos até a 50ª, etc. Bem, não conte com ele mesmo porque =1.
Acho que não adianta.
inRows = 100 inCols = 15000 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 14196778 mcs, 1717 MB
matrix<double> Matrix4 = CorrMatrix2(Matrix) - 538256223 mcs, 1717 MB
IsEqual(Matrix1, Matrix4) = true 
O terrível freio ainda ficará mais lento. Aqui, inequivocamente, você não pode prescindir de ferramentas feitas por você mesmo.
 
fxsaber #:

É por isso que não está claro como, com o código errado.

obtém uma correspondência.

Descobri que, se você trocar os cálculos da matriz, obterá uma incompatibilidade.

inRows = 5 inCols = 50 
matrix<double> Matrix4 = CorrMatrix2(Matrix) - 113 mcs, 0 MB
matrix<double> Matrix1 = CorrMatrix(Matrix) - 214 mcs, 0 MB
IsEqual(Matrix1, Matrix4) = false 

Ou seja, o lixo da memória durante o cálculo da primeira matriz entrou na nova matriz e, por algum milagre, coincidiu com o resultado desejado.

 
fxsaber #:

Acho que se trata de um cálculo frontal da matriz de correlação.

Sim, se fizermos μl sem ciclos em novas matrizes, não será mais rápido?
 
fxsaber #:
196

500 segundos contra 14 - é por isso que me lembro de ele ser

PearsonCorrM

o mais rápido, devido ao algoritmo.

Maxim Dmitrievsky #:
Bem, sim, se você fizer isso em novas matrizes µl, não será mais rápido?

Acho que todas as 9 funções usadas no PearsonCorrM e no PearsonCorrM2 podem ser reescritas em matrizes e comparadas. Em princípio, levaria uma hora de trabalho para reescrever as declarações e referências da matriz. Ao mesmo tempo, descobriremos se as matrizes são melhores do que as matrizes dinâmicas.

Títulos
IsFiniteMatrix(
IsFiniteVector(
AblasInternalSplitLength(
AblasSplitLength(
RMatrixGemmK(
RMatrixGemm(
RMatrixSyrk2(
RMatrixSyrk(
RankX(

 
Forester #:

Acho que todas as nove funções usadas no PearsonCorrM e no PearsonCorrM2 podem ser reescritas em matrizes e comparadas. Em princípio, levará uma hora de trabalho para reescrever os anúncios e as referências da matriz. Ao mesmo tempo, descobriremos se as matrizes são melhores do que as matrizes dinâmicas.

Tudo já foi feito: a MQ reescreveu-os para suas matrizes.

Forester #:

500 seg. vs. 14 - foi por isso que me lembrei disso.

O mais rápido, por causa do algoritmo.

Não me dei conta do algoritmo. O NumPy não fica muito atrás apenas devido ao fato de não realizar cálculos repetidos.

O NumPy parece ter um algoritmo diferente do ALglib, pois o desempenho é muito diferente. Mas está claro que em toda a enorme comunidade Python havia algum algoritmista muito forte que dedicou uma quantidade razoável de tempo para estudar essa questão.
 
fxsaber #:

Isso já foi feito: os MQs os reescreveram para se adequar às suas matrizes.

E ficou mais lento?)

 
Forester #:

E ficou mais lento ??))))

Compare com a versão antiga do Alglib. Não tenho dados de que ele tenha se tornado mais lento.