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

 

R замечательна своей мешаниной. В каждый отдельный момент времени в ней есть всё, любые пакеты на любые случаи жизни.

Но спустя год-два, это неповторимо - исполнить примеры из книги будет невозможно. 

 
Maxim Kuznetsov #:

R замечательна.... 

Всё остальное не правда)
 
Forester #:

Думаю, что PearsonCorrM2 будет быстро работать. Подаем 1 матрицу полную, 2-ю матрицу из одной проверяемой строки. И если идти с конца, то можно размер первой матрицы указывать, как номер очередной строки, чтобы не пересчитывать корреляцию повторно, строкам ниже проверяемой.

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

#include <Math\Alglib\statistics.mqh> // https://www.mql5.com/ru/code/11077

const matrix<double> CorrMatrix( const matrix<double> &Matrix )
{
  matrix<double> Res = {};
  
  const CMatrixDouble MatrixIn(Matrix);
  CMatrixDouble MatrixOut;  

  if (CBaseStat::PearsonCorrM(MatrixIn, MatrixIn.Rows(), MatrixIn.Cols(), MatrixOut)) // https://www.mql5.com/ru/code/11077
    Res = MatrixOut.ToMatrix();
  
  return(Res);
}

const matrix<double> CorrMatrix2( const matrix<double> &Matrix )
{
  matrix<double> Res = {};
  Res.Init(Matrix.Cols(), Matrix.Cols());
  
  const CMatrixDouble MatrixIn(Matrix);
  CMatrixDouble Vector(Matrix);
  CMatrixDouble Corr;

  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);
  }
  
  return(Res);
}

#property script_show_inputs

input int inRows = 5; // Длина строки
input int inCols = 100; // Количество строк

void FillArray( double &Array[], const int Amount )
{
  for (uint i = ArrayResize(Array, Amount); (bool)i--;)
    Array[i] = MathRand();
}

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

#define TOSTRING(A) #A + " = " + (string)(A) + " "

void OnStart()
{  
  double Array[];
  FillArray(Array, inRows * inCols);

  matrix<double> Matrix;  
  Matrix.Assign(Array);
  Matrix.Init(inCols, inRows);
  Matrix = Matrix.Transpose();
  
  Print(TOSTRING(inRows) + TOSTRING(inCols));
  
  matrix<double> Matrix1 = CorrMatrix(Matrix);
  matrix<double> Matrix2 = CorrMatrix2(Matrix);
  matrix<double> Matrix3 = Matrix.CorrCoef(false);
  
  Print(TOSTRING(IsEqual(Matrix1, Matrix2)));  
  Print(TOSTRING(IsEqual(Matrix1, Matrix3)));  
}


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

inRows = 5 inCols = 90 
IsEqual(Matrix1, Matrix2) = true 
IsEqual(Matrix1, Matrix3) = true 


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

inRows = 5 inCols = 100 
IsEqual(Matrix1, Matrix2) = false 
IsEqual(Matrix1, Matrix3) = true 


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

 
Maxim Kuznetsov #:

R замечательна своей мешаниной. В каждый отдельный момент времени в ней есть всё, любые пакеты на любые случаи жизни.

Но спустя год-два, это неповторимо - исполнить примеры из книги будет невозможно. 

Не может быть мешаниной хорошо структурированная система с прекрасным справочным аппаратом, созданным профессиональной командой. Система R ориентированная на трейдинг, без отвлечения на всё и всея ради универсальности и популизма.

Именно это демонстрирует книга.

И еще, что делает книга, основанная на R, - разбивает иллюзии, что модель на базе МО можно получить наскоком, не владея большим набором инструментов, а самое главное, не понимая зачем нужен тот или иной инструмент (пакет, функция), зачем нужен тот или иной этап построения модели, не понимая, что выбросить что-то невозможно - все развалится.

 

Прекрасный пример полного не понимания ЧТО делается - это десятки страниц корреляций чего-то с чем-то. 

Прежде, чем считать корреляцию, нужно ответить на вопрос: для используемых рядов корреляция существует? Для финансовых рядов - это первый и самый главный вопрос, так как для финансовых рядов корреляция не существует, так как для них не существует математическое ожидание и нужно доказывать, что используемой среднее МОЖНО использовать в качестве математического ожидания.

Кстати, в R -  это проверить  раз чихнуть, рутина.

 
СанСаныч Фоменко #:

Замечательная книга!

Охватывает должно быть всю проблематику МО.

для новичков, коим вы и являетесь пока еще

вообще для мальчиков ) тайдиверс

 
СанСаныч Фоменко #:

Прекрасный пример полного не понимания ЧТО делается - это десятки страниц корреляций чего-то с чем-то.

Раз не понимаете, поясню.

MathRand - это случайное число. Т.е. корреляция считается на случайных матрицах. Цель - убедиться, что различные варианты реализаций алгоритмов дают одинаковый результат. При этом сравнивается скорость выполнения алгоритмов и потребление памяти. Некомпетентны - не лезьте.

 
fxsaber #:

Штатной не нашел для построчного расчета. Alglib показался медленным. Пробую свой вариант.

#include <fxsaber\Math\Math.mqh> // https://www.mql5.com/ru/code/17982

matrix<double> CorrMatrix( const double &Array[], const int PatternLen, const bool CreateMatrix = true )
{
  matrix<double> Res = {};
  const int Size = ArraySize(Array) / PatternLen - 1;
  
  if (CreateMatrix)
  {
    Res.Init(Size + 1, Size + 1);
    Res[Size][Size] = 1;
  }
  
  double Corr[];

  DEJAVU Dejavu;
  Dejavu.SetSignal(Array);
  
  if (CreateMatrix)
    for (int i = 0, j; i < Size; i++)
    {
      Res[i][i] = 1;
      j = i + 1;

      Dejavu.SetPattern(PatternLen, i * PatternLen);
      Dejavu.GetCorrelation(Corr, PatternLen, j * PatternLen);
      
      for (; j <= Size; j++)
      {
        const double Tmp = Corr[(j + 1) * PatternLen - 1];
        
        Res[i][j] = Tmp;
        Res[j][i] = Tmp;
      }    
    }
  else
    for (int i = 0; i < Size; i++)
    {
      Dejavu.SetPattern(PatternLen, i * PatternLen);
      Dejavu.GetCorrelation(Corr, PatternLen, (i + 1) * PatternLen);
    }
        
  return(Res);
}

#property script_show_inputs

input int inRows = 100; // Длина строки
input int inCols = 15000; // Количество строк

#define TOSTRING(A) #A + " = " + (string)(A) + " "

// NumPy: https://www.mql5.com/ru/forum/86386/page3257#comment_49545300
void OnStart()
{  
  PrintCPU(); // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685

  double Array[];
  FillArray(Array, inRows * inCols); // https://www.mql5.com/ru/forum/86386/page3267#comment_49671602

  matrix<double> Matrix;  
  Matrix.Assign(Array);
  Matrix.Init(inCols, inRows);
  Matrix = Matrix.Transpose();
  
  ulong StartTime, StartMemory;
  
  Print(TOSTRING(inRows) + TOSTRING(inCols));
  
  BENCH(matrix<double> Matrix1 = CorrMatrix(Matrix)) // https://www.mql5.com/ru/forum/86386/page3267#comment_49671602
  BENCH(matrix<double> Matrix2 = Matrix.CorrCoef(false)); // https://www.mql5.com/ru/docs/basis/types/matrix_vector
  BENCH(matrix<double> Matrix3 = CorrMatrix(Array, inRows)); // https://www.mql5.com/ru/code/17982

  BENCH(CorrMatrix(Array, inRows, false)); // https://www.mql5.com/ru/code/17982

  Print(TOSTRING(IsEqual(Matrix1, Matrix2)));
  Print(TOSTRING(IsEqual(Matrix1, Matrix3)));
}


Результат.

EX5: 4000 AVX Release.
TerminalInfoString(TERMINAL_CPU_NAME) = Intel Core i7-2700K  @ 3.50GHz 
TerminalInfoInteger(TERMINAL_CPU_CORES) = 8 
TerminalInfoString(TERMINAL_CPU_ARCHITECTURE) = AVX 
inRows = 100 inCols = 15000 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 13795998 mcs, 1717 MB
matrix<double> Matrix2 = Matrix.CorrCoef(false) - 38346008 mcs, 1717 MB
matrix<double> Matrix3 = CorrMatrix(Array, inRows) - 26632760 mcs, 1716 MB
CorrMatrix(Array, inRows, false) - 19412824 mcs, 0 MB
IsEqual(Matrix1, Matrix2) = true 
IsEqual(Matrix1, Matrix3) = true 

Самоделка получилась быстрее штатного варианта, но медленнее Alglib (не смог понять алгоритм). При этом самоделка может считать матрицы любого размера, в отличие от других вариантов.

 
fxsaber #:


Результат.

Самоделка получилась быстрее штатного варианта, но медленнее Alglib (не смог понять алгоритм). При этом самоделка может считать матрицы любого размера, в отличие от других вариантов.

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

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

 
fxsaber #:
Раз не понимаете, поясню.

MathRand - это случайное число. Т.е. корреляция считается на случайных матрицах. Цель - убедиться, что различные варианты реализаций алгоритмов дают одинаковый результат. При этом сравнивается скорость выполнения алгоритмов и потребление памяти. Некомпетентны - не лезьте.

Так а конечная цель всей этой эпопеи с корреляцией какая?

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