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

 
Maxim Dmitrievsky #:

А почему вам так нравится mql для расчетов? можно dll писать на си и там будет максимально быстро

Я ограничен своей некомпетентностью.

 
Maxim Dmitrievsky #:

по мне так mql все равно язык для открытия сделок, в основном. И что правильно, по сути.

Ещё тестирование и визуализация ну и быстро действие наверно
 
mytarmailS #:
Так а конечная цель всей этой эпопеи с корреляцией какая?

Ну узнали вы какая реализация быстрее, какая даёт идентичные результаты какая нет... Дальше что с этими знаниями будете делать?  

Смогу считать то, что у других не получится из-за технических ограничений.

 
mytarmailS #:
Ещё тестирование и визуализация ну и быстро действие наверно

Оптимизация финальная тоже норм, чтобы параметры сделок подобрать

 
fxsaber #:

Попробовал сначала сделать лобовой вариант - считать каждый раз все строки. Сложилось впечатление, что в Alglib какая-то ошибка, т.к. у себя не смог найти.


Результат часто совпадает.


Но в некоторых ситуациях - нет.


Если бы всегда так было - моя ошибка точно. Но тут что-то нечистое.

Сделал

   Print(Matrix1);
   Print("------------------");
   Print(Matrix2);


У Matrix2 первые 5 совпадают, дальше нули.
Поменял Res.Col(Corr.Row(0), i); на Res.Row(Corr.Row(0), i);

Матрицы стали похожи но все равно IsEqual не проходят. Что-то еще где-то...
 
Forester #:

Поменял Res.Col(Corr.Row(0), i); на Res.Row(Corr.Row(0), i);

Вроде, это неправильно.

 
Forester #:
Сделал

   Print(Matrix1);
   Print("------------------");
   Print(Matrix2);


У Matrix2 первые 5 совпадают, дальше нули.
Поменял Res.Col(Corr.Row(0), i); на Res.Row(Corr.Row(0), i);

Матрицы стали похожи но все равно IsEqual не проходят. Что-то еще где-то...

Нашел проблему

Должно быть так

  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);
  }

 
Ну и PearsonCorrM2 можно ускорить в 2 раза, если считать по треугольнику.Т.е. идти с конца. Посчитать 100 строку со всеми, потом 99 со всеми 0-99, 99 и 100я уже посчитаны - можно просто скопировать. ...50ю строку со всеми до 50й и т.д. Ну и саму с собой не считать т.к. =1.

П.С.
А вообще красивый у вас код и лаконичный. Я бы все циклами делал)))
 
Forester #:
Ну и PearsonCorrM2 можно ускорить в 2 раза, если считать по треугольнику.Т.е. идти с конца. Посчитать 100 строку со всеми, потом 99 со всеми 0-99, 99 и 100я уже посчитаны - можно просто скопировать. ...50ю строку со всеми до 50й и т.д.
Где-то Читал что можно быстро считать корреляцию через быстрое преобразование фурье..  Тоже как вариант ускориться
 
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))


correlations = residual_products / sum_products 
Причина обращения: