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

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

Если брать просто 2.5% (или другое) то количество удаленных зависит от распределения, а это не правильно.

Лучше взять квантиль со 100 участками и не удалять  до 1% и после 99%,  а заменять на значения 1% и 99%. Удалять ничего нельзя.

Я беру процент данных, а не процент от диапазона. Поэтому, если данных много (они плотные), то остановка будет быстрой по шкале диапазона.

Пляски от среднего значения и отклонения показали свою малую эффективность.

Как раз исследовал и вопрос замены на другие значения (но это только для квантования делал), мне больше понравился вариант замены на случайные значения из оставшегося подмножества, с учётом вероятности.

 
Aleksey Vyazmikin #:

Я беру процент данных, а не процент от диапазона. Поэтому, если данных много (они плотные), то остановка будет быстрой по шкале диапазона.

Пляски от среднего значения и отклонения показали свою малую эффективность.

Как раз исследовал и вопрос замены на другие значения (но это только для квантования делал), мне больше понравился вариант замены на случайные значения из оставшегося подмножества, с учётом вероятности.

Квантили - это вероятности. Поэтому удаляем/заменяем данные, вероятность которых попасть в диапазон менее 1%/более 99% или других величин. Отсекать количество нельзя - у нас скошенные и хвостатые распределения.

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

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

Квантили - это вероятности. Поэтому удаляем/заменяем данные, вероятность которых попасть в диапазон менее 1%/более 99% или других величин. Отсекать количество нельзя - у нас скошенные и хвостатые распределения.

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

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

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

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


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

Включил сейчас медленный темп обучения - поставлю на ночь - посмотрю, даст ли это что либо.

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

 
Aleksey Vyazmikin #:

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

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

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


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

Включил сейчас медленный темп обучения - поставлю на ночь - посмотрю, даст ли это что либо.

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

Я зимой догнал модель до советника (результаты выкладывал на этой ветке). у меня был противоположный результат: ошибки классификации, а их было менее 20%, попадали на выбросы. Как результат - 80% правильных предсказаний обнулялись этими ошибками.

Для меня ясно одно: от выбросов надо избавляться. И реальный результат модели - это без выбросов.

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

Я зимой догнал модель до советника (результаты выкладывал на этой ветке). у меня был противоположный результат: ошибки классификации, а их было менее 20%, попадали на выбросы. Как результат - 80% правильных предсказаний обнулялись этими ошибками.

Для меня ясно одно: от выбросов надо избавляться. И реальный результат модели - это без выбросов.

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

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

Да и бывает, что если выброс наблюдается с двух сторон, то одна сторона ближе вероятностью к нулям, а другая к единицам.

 
Aleksey Vyazmikin #:

А где итоговый код посмотреть?

Вроде, все публиковал в этой ветке.

 
Rorschach #:

Исходники открыты, можете посмотреть. Функция для расчета корреляции, справа есть надпись [source], после клика по которой вас перекинет на код. Нас интересуют 2885-2907 строки. В 2889 строке используется ковариация, после щелчка по cov, справа появятся все упоминания cov в коде, после щелчка по строке с def cov... перекинет на функцию ковариации и так далее. MQL С-подобный язык, все С-подобные языки похожи на ~90%, без особых проблем можно разобраться в C#, Java, Python, JavaScript.

Спасибо. Немного остыл по алгоритмизации, появится энтузиазм - посмотрю.

 
fxsaber #:

Вроде, все публиковал в этой ветке.

Я читал конечно, но по хронологии  Forester нашёл какую то ошибку, Вы с ней согласились, потом какая то часть кода правилась.

И в итоге полной версии окончательного кода я не увидел тут. Я не про то, что обязаны выложить код, просто спросил...

 
Aleksey Vyazmikin #:

Я читал конечно, но по хронологии  Forester нашёл какую то ошибку, Вы с ней согласились, потом какая то часть кода правилась.

И в итоге полной версии окончательного кода я не увидел тут. Я не про то, что обязаны выложить код, просто спросил...

Быстрая и построчная (исправленная).

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

fxsaber, 2023.10.01 09:38

#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);
}
 
fxsaber #:

Быстрая и построчная (исправленная).

Спасибо!