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

 
elibrarius:

Comprobado y andamiaje - mucho más rápido que NS (4 min.), y el resultado es casi el mismo. Y lo que es interesante la regresión lineal cuenta aún más rápido, con los mismos resultados.
Como alguien escribió aquí, todo es cuestión de características.


Bueno, esto es lo principal, y el juego con diferentes modelos y bolsas no dará un gran aumento :)

 
Maxim Dmitrievsky:

Allí, por lo que entendí, se pueden establecer 1-2 épocas, porque casi siempre converge a la primera... quizás fue una omisión... aunque hace mucho que no lo uso, puedo estar confundido.

En ninguna parte he visto un límite en épocas
 
elibrarius:
No he visto un límite en ninguna parte de las épocas

Función mlptrainlm

/************************************************************************* Entrenamiento de redes neuronales mediante Levenberg-Marquardt modificado con cálculo hessiano exacto y regularización. La subrutina entrena la red neuronal con reinicios desde posiciones aleatorias. El algoritmo es adecuado para problemas de pequeña y mediana escala (cientos de pesos). PARÁMETROS DE ENTRADA: Red - red neuronal con geometría inicializada XY - conjunto de entrenamiento NPuntos - tamaño del conjunto de entrenamiento Decaimiento - constante de decaimiento de los pesos, >=0.001 El término Decay 'Decay*|||Weights|^2' se añade a la función de error. Si no sabe qué Decay elegir, utilice 0.001. Reinicios - número de reinicios desde la posición aleatoria, >0. Si no sabe qué Reinicios elegir, utilice 2.
Creo que es esto.
 
Maxim Dmitrievsky:

Bueno, eso es lo principal, y jugar con diferentes modelos y bolsas no te va a dar mucho juego :)

Creo que la ventaja de NS es encontrar dependencias no lineales y utilizarlas.
Hay 2 de ellos en el último artículo de Vladimir.

La regresión lineal, por el contrario, empeorará.

 
Maxim Dmitrievsky:

Función mlptrainlm

Esto es sólo un valor recomendado, nadie va a parar al menos a 1000, pero tardará mucho tiempo... He mirado en el código: sólo hay un bucle sobre el número de épocas (por cierto, también he utilizado 2).
 
elibrarius:
Creo que la ventaja de NS es encontrar dependencias no lineales y utilizarlas.
El último artículo de Vladimir tiene 2 de ellos.

Por el contrario, la regresión lineal se verá degradada por ellos.


El andamiaje también se utiliza exclusivamente para patrones no lineales por adelantado, no funciona con los lineales

 
elibrarius:
Esto es sólo un valor recomendado, nadie te impide poner 1000, pero te llevará mucho tiempo... Mirado en el código - sólo hay un bucle en el número de épocas (también usé 2, por cierto).
Lo hice hasta 1500 en un 6 ply. Sí, es largo: unas 32 horas, pero, en primer lugar, el resultado supera las expectativas. En segundo lugar, no es nada largo, comparado con la proyección a mano). Y con MLP - estructura estándar, y enseñar lo que quieras)).
 
Maxim Dmitrievsky:

El andamiaje también se utiliza exclusivamente para patrones no lineales por adelantado, no funciona con los lineales

Tal vez por eso el bosque en la parcela de validación es hasta un 0,4% mejor que la regresión lineal)). El tiempo de aprendizaje es de 36 y 3 minutos respectivamente (a 265 entradas). Me está empezando a gustar la regresión lineal.
 

Si alguien quiere jugar, el andamio aprende en incrementos y pronostica 1 compás por delante. En los ajustes, establezca la profundidad de aprendizaje, el retraso de los incrementos y el número de entradas (cada nueva entrada es un desplazamiento de 1 compás hacia atrás). A continuación, el valor previsto se deduce de los precios actuales. El histograma se dibuja sólo para cada nueva barra, lo vi en el visualizador.

//+------------------------------------------------------------------+
//|                                          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:
Quizá por eso el bosque en el gráfico de validación es hasta un 0,4% mejor que la regresión lineal)). Tiempo de aprendizaje de 36 y 3 minutos respectivamente (a 265 entradas). Me está empezando a gustar la regresión lineal.

También he comparado - he hecho la autoregresión de BP y he hecho lo mismo a través del bosque - las diferencias son mínimas :) En esencia, esto significa que no hay un patrón normal allí o cerca de allí