Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 3269

 
fxsaber #:

Al principio intenté hacer la variante frontal: contar todas las líneas cada vez. Me dio la impresión de que hay algún error en Alglib, porque no pude encontrarlo en mi propia.


El resultado suele coincidir.


Pero en algunas situaciones, no.


Si siempre fuera así, sería culpa mía. Pero hay algo sospechoso aquí.

Hice

Print(Matriz1);
Print("------------------");
Print(Matriz2);


Matrix2 tiene los 5 primeros coincidentes y luego ceros.
Cambié Res.Col(Corr.Fila(0), i); por Res.Fila(Corr.Fila(0), i);

Las matrices se volvieron similares, pero IsEqual sigue sin pasar. Algo más en alguna parte...
 
Forester #:

Cambiado Res.Col(Corr.Fila(0), i); a Res.Fila(Corr.Fila(0), i);

Parece que está mal.

 
Forester #:
Hecho

Print(Matriz1);
Print("------------------");
Print(Matriz2);


Matrix2 tiene los 5 primeros coincidentes, luego ceros.
Cambié Res.Col(Corr.Fila(0), i); por Res.Fila(Corr.Fila(0), i);

Las matrices se volvieron similares, pero IsEqual sigue sin pasar. Algo más en alguna parte...

Encontrado el problema

Debería ser así

for (int i = 0; i < (int)Matrix.Cols(); i++)
{
if (i)
Vector.SwapCols(0, i);

CBaseStat::PearsonCorrM2(Vector, MatrixIn, MatrixIn.Rows(), 1, MatrixIn.Cols(), Corr);

Res.Col(Corr.Row(0), i);
}

 
Y PearsonCorrM2 se puede acelerar por 2 veces si se cuenta por triángulo.es decir, ir desde el final. Cuenta 100 línea con todos, luego 99 con todos 0-99, 99 y 100 ya contados - puedes simplemente copiar. ...50 línea con todos hasta 50, etc. Y no contar con sí mismo porque =1.

P.S.
En general, su código es hermoso y conciso. Yo lo haría todo en loops))))
 
Forester #:
Y PearsonCorrM2 se puede acelerar por 2 veces si se cuenta por triángulo.es decir, ir desde el final. Cuenta la línea 100 con todos, luego la 99 con todos 0-99, 99 y 100 ya contados - puedes simplemente copiar. ...la línea 50 con todos hasta la 50 y así sucesivamente.
He leído en alguna parte que se puede calcular rápidamente la correlación a través de la transformada rápida de Fourier ... También como una opción para acelerar.
 
residuos_a = a_mat - a_mat. media_columna residuos_b = b_mat - b_mat. media_columna a_residuos_suma = residuos_a. suma_columna b_residuos_suma = residuos_b. suma_columna productos_residuales = producto_punto( residuos_a. transposición, residuos_b)
sum_products = sqrt( dot_product( a_residual_sums, b_residual_sums))
correlaciones = productos_residuales / productos_suma 
 
mytarmailS #:
Leí en alguna parte que se puede leer rápidamente la correlación a través de una transformada rápida de Fourier... También como una opción para acelerar.

Yo lo he hecho. Tiene sentido cuando la longitud de la cadena es grande. Te lo enseñaré algún día.

 
Forester #:

Encontrado el problema

Debería ser así

Exacto, ¡gracias! No entiendo por qué la opción incorrecta funcionaba con inCols < 100.
 

Foro sobre negociación, sistemas automatizados de negociación y ensayo de estrategias de negociación

Aprendizaje automático en el trading: teoría, modelos, práctica y negociación de algoritmos

Maxim Dmitrievsky, 2023.10.01 10:55 AM

residuales_a = a_mat - a_mat. column_means residuales_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))

correlaciones = productos_residuales / productos_suma

Esto parece ser un cálculo frontal de la matriz de correlaciones.

 
fxsaber #:
Cierto, ¡gracias! No entiendo por qué la opción incorrecta trabajó con inCols < 100.

Aparentemente

Sens = 1 e-10
demasiado. Al azar - la correlación media allí es alrededor de 0, probablemente.