Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 516

 
elibrarius:

Überprüft und Gerüst - viel schneller als NS (4 min.), und das Ergebnis ist etwa die gleiche. Interessant ist auch, dass die lineare Regression sogar noch schneller zu den gleichen Ergebnissen führt.
Wie jemand hier schrieb - es geht nur um Funktionen.


Nun, das ist die Hauptsache, und das Spiel mit verschiedenen Modellen und Taschen wird nicht eine große Steigerung geben :)

 
Maxim Dmitrievsky:

Soweit ich verstanden habe, kann man dort 1-2 Epochen einstellen, weil es fast immer beim ersten Mal konvergiert... vielleicht war das eine Auslassung? obwohl ich es schon lange nicht mehr benutzt habe, könnte ich verwirrt sein.

Nirgendwo habe ich eine Grenze in Epochen gesehen
 
elibrarius:
Ich habe nirgendwo eine Grenze in Epochen gesehen

mlptrainlm-Funktion

/************************************************************************* Training neuronaler Netze mit modifiziertem Levenberg-Marquardt mit exakter Hessian-Berechnung und Regularisierung. Das Unterprogramm trainiert das neuronale Netz mit Neustarts aus zufälligen Positionen. Der Algorithmus eignet sich gut für kleine und mittlere Probleme (Hunderte von Gewichten). EINGABEPARAMETER: Netz - neuronales Netz mit initialisierter Geometrie XY - Trainingsmenge NPunkte - Größe der Trainingsmenge Decay - Gewichtsabnahmekonstante, >=0.001 Abklingterm 'Abkling*|||Gewichte||^2' wird zur Fehlerfunktion hinzugefügt. Wenn Sie nicht wissen, welchen Abklingterm Sie wählen sollen, verwenden Sie 0,001. Neustarts - Anzahl der Neustarts von der Zufallsposition, >0. Wenn Sie nicht wissen, welchen Neustart Sie wählen sollen, verwenden Sie 2.
Ich glaube, das ist es.
 
Maxim Dmitrievsky:

Nun, das ist die Hauptsache, und das Spielen mit verschiedenen Modellen und Taschen wird dir keinen großen Auftrieb geben :)

Ich denke, der Vorteil von NS ist es, nicht-lineare Abhängigkeiten zu finden und sie zu nutzen.
In Vladimirs letztem Artikel gibt es 2 davon.

Bei linearer Regression werden sie sich im Gegenteil verschlechtern.

 
Maxim Dmitrievsky:

mlptrainlm-Funktion

Dies ist nur ein empfohlener Wert, niemand wird mindestens 1000 aufhalten, aber es wird lange dauern... Ich habe im Code nachgesehen - es gibt nur eine Schleife über die Anzahl der Epochen (ich habe übrigens auch 2 verwendet).
 
elibrarius:
Ich denke, der Vorteil von NS ist es, nicht-lineare Abhängigkeiten zu finden und sie zu nutzen.
Der letzte Artikel von Vladimir enthält 2 davon.

Die lineare Regression hingegen wird durch sie verschlechtert.


Scaffolding wird auch ausschließlich für nichtlineare Muster verwendet, es funktioniert nicht bei linearen Mustern

 
elibrarius:
Dies ist nur ein empfohlener Wert, niemand hält Sie davon ab, 1000 zu setzen, aber es wird lange dauern... Ich habe im Code nachgesehen - es gibt nur eine Schleife über die Anzahl der Epochen (ich habe übrigens auch 2 verwendet).
Ich habe es bis zu 1500 auf einem 6-lagigen Reifen geschafft. Ja, lang - etwa 32 Stunden, aber erstens übertrifft das Ergebnis die Erwartungen. Zweitens ist es gar nicht so lang, wenn man es mit der Hand projiziert ). Und mit MLP - Standard-Struktur, und lehren, was Sie wollen.))
 
Maxim Dmitrievsky:

Scaffolding wird auch ausschließlich für nichtlineare Muster verwendet, es funktioniert nicht bei linearen Mustern

Vielleicht ist das der Grund, warum Forest auf dem Validierungsplot um 0,4 % besser ist als die lineare Regression))). Die Lernzeit beträgt 36 bzw. 3 Minuten (bei 265 Eingaben). Die lineare Regression beginnt mir zu gefallen.
 

Wenn jemand herumspielen möchte, lernt das Gerüst aus den Inkrementen und gibt eine Vorhersage von 1 Takt voraus. In den Einstellungen legen Sie die Lerntiefe, die Verzögerung für die Inkremente und die Anzahl der Einträge fest (jeder neue Eintrag ist eine Verschiebung um 1 Takt nach hinten). Dann wird der prognostizierte Wert von den aktuellen Preisen abgezogen. Das Histogramm wird nur für jeden neuen Balken gezeichnet, ich habe es im Visualizer gesehen.

//+------------------------------------------------------------------+
//|                                          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:
Vielleicht ist das der Grund, warum der Wald im Validierungsplot um 0,4 % besser ist als die lineare Regression). Lernzeit 36 bzw. 3 Minuten (bei 265 Eingaben). Die lineare Regression beginnt mir zu gefallen.

Ich habe auch verglichen - ich habe BP Autoregression und ich habe das gleiche durch den Wald - die Unterschiede sind minimal :) Im Wesentlichen bedeutet dies, dass es dort kein normales Muster gibt.