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

 
elibrarius:

Проверял и леса - значительно быстрее чем НС (4 мин.), и результат примерно тот же. И что интересно линейная регрессия считает еще быстрее, при тех же результатах.
Как кто-то тут писал - все дело в фичах.


Ну вот это и есть основное, а игра с модельками разными и пакетиками большого прироста не дадут :)

 
Maxim Dmitrievsky:

Там, насколько я понял, можно 1-2 эпохи ставить, т.к. он почти всегда сходится с первого раза.. мб в этом упущение было? хотя я давно уже его не юзал, могу что-то путать

Нигде ограничения в эпохах не видел
 
elibrarius:
Нигде ограничения в эпохах не видел

mlptrainlm function

/************************************************************************* Neural network training using modified Levenberg-Marquardt with exact Hessian calculation and regularization. Subroutine trains neural network with restarts from random positions. Algorithm is well suited for small and medium scale problems (hundreds of weights). INPUT PARAMETERS: Network - neural network with initialized geometry XY - training set NPoints - training set size Decay - weight decay constant, >=0.001 Decay term 'Decay*||Weights||^2' is added to error function. If you don't know what Decay to choose, use 0.001. Restarts - number of restarts from random position, >0. If you don't know what Restarts to choose, use 2.
По моему оно
 
Maxim Dmitrievsky:

Ну вот это и есть основное, а игра с модельками разными и пакетиками большого прироста не дадут :)

Думаю преимущество НС находить нелинейные зависимости и использовать.
В последней статье Владимира их 2.

Линейную регрессию они будут наоборот ухудшать.

 
Maxim Dmitrievsky:

mlptrainlm function

Это просто рекомендованное значение, никто не мешает хоть 1000 поставить, но это будет долго... смотрел в коде - там просто цикл по к-ву эпох (я кстати тоже 2 использовал).
 
elibrarius:
Думаю преимущество НС находить нелинейные зависимости и использовать.
В последней статье Владимира их 2.

Линейную регрессию они будут наоборот ухудшать.


леса тоже используются исключительно для заранее нелинейных закономерностей, на линейных не работают

 
elibrarius:
Это просто рекомендованное значение, никто не мешает хоть 1000 поставить, но это будет долго... смотрел в коде - там просто цикл по к-ву эпох (я кстати тоже 2 использовал).
Делал до 1500 на 6-ти слойке. Да, долго - около 32 ч, но, во первых, результат превосходит ожидания. Во вторых, совсем и недолго, по сравнению с проектированием руками.) А с МЛП - стандартная структура, и обучай чему хошь.))
 
Maxim Dmitrievsky:

леса тоже используются исключительно для заранее нелинейных закономерностей, на линейных не работают

Возможно поэтому лес на валидационном участке на целых 0,4% лучше, чем линейная регрессия))). Время обучения 36 и 3 мин соответственно (при 265 входах). Что то мне линейная регрессия начинает нравится.
 

Может кто хочет побаловаться - леса обучаются на приращениях, дают прогноз на 1 бар вперед. В настройках задается глубина обучения, лаг для приращений и кол-во входов (каждый новый вход это смещение на 1 бар назад). Потом из текущих цен вычитается прогнозное значение. Гистограмму рисует только для каждого нового бара, в визуализаторе смотрел.

//+------------------------------------------------------------------+
//|                                          NonLinearPredictor.mql5 |
//|                                                  Dmitrievsky Max |
//|                        https://www.mql5.com/ru/users/dmitrievsky |
//+------------------------------------------------------------------+
#property copyright "Dmitrievsky Max."
#property link      "https://www.mql5.com/ru/users/dmitrievsky"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Tensor non-linear predictor"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrOrangeRed,clrOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- подключим библиотеку Alglib
#include <Math\Alglib\alglib.mqh>

//RDF system. Here we create all RF objects.
CDecisionForest      RDF;                                     //Random forest object
CDFReport            RDF_report;                              //RF return errors in this object, then we can check it
double RFout[1], vector[];                                    //Arrays for calculate result of RF
CMatrixDouble RMmatrix;
int retcode=0;

//--- input parameters
input int             last_bars=500;
input int             lag=5; 
input int             bars_seria = 100;

//--- indicator buffers
double         SpreadBuffer[];
double         ColorsBuffer[];

//--- время открытия предыдущего бара
static datetime last_time=0;
int needToLearn=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,SpreadBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorsBuffer,INDICATOR_COLOR_INDEX);
//--- установим индексацию как в таймсерии - от настоящего в прошлое
   ArraySetAsSeries(SpreadBuffer,true);
   ArraySetAsSeries(ColorsBuffer,true);
   RMmatrix.Resize(last_bars,bars_seria);
   ArrayResize(vector,bars_seria-1);
//---
   IndicatorSetString(INDICATOR_SHORTNAME,StringFormat("Non-linear predictor (%s, %s, %s)",_Symbol,(string)last_bars, (string)lag));
   IndicatorSetInteger(INDICATOR_DIGITS,5);
   return(INIT_SUCCEEDED);
  }
 
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  ArraySetAsSeries(close,true);
  
   if(prev_calculated==0 || needToLearn>last_bars/5) 
     {
      for(int i=0;i<last_bars;i++) 
       {   
        for(int l=0;l<ArraySize(vector);l++)
         {
          RMmatrix[i].Set(l,MathLog(close[i+1+l]/close[i+lag+1+l]));
         }   
        RMmatrix[i].Set(bars_seria-1,MathLog(close[i]/close[i+lag]));
       }
      CDForest::DFBuildRandomDecisionForest(RMmatrix,last_bars,bars_seria-1,1,100,0.95,retcode,RDF,RDF_report);
      needToLearn=0;
     }
     
   if(isNewBar()) 
    {
     if(retcode==1)
      {
       for(int i=0;i<ArraySize(vector);i++)
        {
         vector[i]=MathLog(close[i]/close[i+lag]);
        }
    
       CDForest::DFProcess(RDF,vector,RFout);
       SpreadBuffer[0]=MathLog(close[0]/close[0+lag])-RFout[0];
       ColorsBuffer[0]=(SpreadBuffer[0]>0?0:1);
      }
      needToLearn++;
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| возвращает true при появлении нового бара                        |
//+------------------------------------------------------------------+
bool isNewBar()
  {
   datetime lastbar_time=datetime(SeriesInfoInteger(Symbol(),_Period,SERIES_LASTBAR_DATE));
   if(last_time==0)
     {
      last_time=lastbar_time;
      return(false);
     }
   if(last_time!=lastbar_time)
     {
      last_time=lastbar_time;
      return(true);
     }
   return(false);
  
  }
 
elibrarius:
Возможно поэтому лес на валидационном участке на целых 0,4% лучше, чем линейная регрессия))). Время обучения 36 и 3 мин соответственно (при 265 входах). Что то мне линейная регрессия начинает нравится.

Я тоже сравнивал - делал авторегрессию ВР и делал то же самое через лес - различия минимальные :) По сути это означает что ни там ни там нет нормальной закономерности

Причина обращения: