L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 516

 
elibrarius:

Vérifié et échafaudage - beaucoup plus rapide que NS (4 min.), et le résultat est à peu près le même. Et ce qui est intéressant, c'est que la régression linéaire compte encore plus vite, avec les mêmes résultats.
Comme quelqu'un l'a écrit ici - tout est question de fonctionnalités.


Eh bien, c'est l'essentiel, et le jeu avec différents modèles et sacs ne donnera pas une grande augmentation :)

 
Maxim Dmitrievsky:

Là, d'après ce que j'ai compris, vous pouvez définir 1-2 époques, parce qu'il converge presque toujours la première fois... peut-être que c'était une omission ? bien que je ne l'ai pas utilisé depuis longtemps, je pourrais être confus.

Je n'ai vu nulle part une limite dans les époques
 
elibrarius:
Je n'ai pas vu de limite nulle part depuis des millénaires.

fonction mlptrainlm

/************************************************************************* Entraînement de réseaux neuronaux à l'aide de Levenberg-Marquardt modifié avec calcul exact du hessien et régularisation. La sous-routine entraîne le réseau neuronal avec des redémarrages à partir de positions aléatoires. L'algorithme est bien adapté aux problèmes de petite et moyenne échelle (centaines de poids). PARAMÈTRES D'ENTRÉE : Réseau - réseau neuronal avec géométrie initialisée XY - ensemble de formation NPoints - taille de l'ensemble de formation Decay - constante de décroissance des poids, >=0.001 Le terme Decay 'Decay*|||Weights||^2' est ajouté à la fonction d'erreur. Si vous ne savez pas quel Decay choisir, utilisez 0.001. Restarts - nombre de redémarrages à partir d'une position aléatoire, >0. Si vous ne savez pas quel Restart choisir, utilisez 2.
Je pense que c'est ça.
 
Maxim Dmitrievsky:

C'est l'essentiel, et jouer avec différents modèles et sacs ne vous donnera pas un grand coup de pouce :)

Je pense que l'avantage de NS est de trouver des dépendances non linéaires et de les utiliser.
Il y en a 2 dans le dernier article de Vladimir.

Régression linéaire, ils vont au contraire s'aggraver.

 
Maxim Dmitrievsky:

fonction mlptrainlm

Il s'agit juste d'une valeur recommandée, personne ne s'arrête à au moins 1000, mais cela prendra beaucoup de temps... J'ai regardé dans le code - il y a juste une boucle sur le nombre d'époques (j'ai aussi utilisé 2, d'ailleurs).
 
elibrarius:
Je pense que l'avantage de NS est de trouver des dépendances non linéaires et de les utiliser.
Le dernier article de Vladimir en compte deux.

La régression linéaire sera, au contraire, dégradée par eux.


L'échafaudage est également utilisé exclusivement pour les modèles non linéaires à l'avance, il ne fonctionne pas sur les modèles linéaires.

 
elibrarius:
C'est juste une valeur recommandée, personne ne vous empêche de mettre 1000, mais cela prendra beaucoup de temps... J'ai regardé dans le code - il y a juste une boucle sur le nombre d'époques (j'ai aussi utilisé 2, d'ailleurs).
Je l'ai fait jusqu'à 1500 sur un 6 plis. Oui, long - environ 32 heures, mais, tout d'abord, le résultat dépasse les attentes. Deuxièmement, pas long du tout, comparé à la projection à la main). Et avec MLP - structure standard, et enseignez ce que vous voulez.))
 
Maxim Dmitrievsky:

L'échafaudage est également utilisé exclusivement pour les modèles non linéaires à l'avance, il ne fonctionne pas sur les modèles linéaires.

C'est peut-être pour cela que la forêt sur le graphique de validation est meilleure de 0,4 % que la régression linéaire))). Le temps d'apprentissage est de 36 et 3 minutes respectivement (à 265 entrées). Je commence à aimer la régression linéaire.
 

Si quelqu'un veut jouer avec, l'échafaudage apprend des incréments et donne une prédiction d'une mesure à l'avance. Dans les paramètres, réglez la profondeur d'apprentissage, le décalage des incréments et le nombre d'entrées (chaque nouvelle entrée est un décalage d'une mesure en arrière). Ensuite, la valeur prévisionnelle est déduite des prix actuels. L'histogramme est dessiné seulement pour chaque nouvelle barre, je l'ai vu dans le visualiseur.

//+------------------------------------------------------------------+
//|                                          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:
C'est peut-être la raison pour laquelle la forêt dans le graphique de validation est supérieure de 0,4 % à la régression linéaire)). Temps d'apprentissage 36 et 3 min respectivement (à 265 entrées). Je commence à aimer la régression linéaire.

J'ai également comparé - j'ai fait une autorégression BP et j'ai fait la même chose à travers la forêt - les différences sont minimes :) En substance, cela signifie qu'il n'y a pas de modèle normal à cet endroit ou aux alentours.

Raison: