Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 516

 
elibrarius:

Checked e andaimes - muito mais rápido que NS (4 min.), e o resultado é praticamente o mesmo. E o que é interessante, a regressão linear conta ainda mais rápido, com os mesmos resultados.
Como alguém escreveu aqui - é tudo sobre características.


Bem, isto é o principal, e o jogo com diferentes modelos e bolsas não vai dar um grande aumento :)

 
Maxim Dmitrievsky:

Lá, pelo que entendi, você pode definir 1-2 épocas, porque quase sempre converge na primeira vez... talvez tenha sido uma omissão... embora eu não a tenha usado por muito tempo, eu poderia ficar confuso.

Em nenhum lugar eu vi um limite em épocas.
 
elibrarius:
Não tenho visto um limite em nenhuma época.

função mlptrainlm

/************************************************************************* Treinamento da rede neural usando Levenberg-Marquardt modificado com cálculo e regularização exata de Hessian. A sub-rotina treina a rede neural com reinícios a partir de posições aleatórias. O algoritmo é bem adequado para problemas de pequena e média escala (centenas de pesos). PARÂMETROS DE ENTRADA: Rede - rede neural com geometria inicializada XY - conjunto de treinamento NPoints - tamanho do conjunto de treinamento Decadência - constante de decadência de peso, >=0.001 Decay term 'Decay*|||Weights|||^2' é adicionado à função de erro. Se você não sabe o que Decay para escolher, use 0.001. Restar - número de reinícios da posição aleatória, >0. Se você não sabe o que Restar, use 2.
Acho que é agora.
 
Maxim Dmitrievsky:

Bem, isso é o principal, e brincar com diferentes modelos e bolsas não lhe dará muito impulso :)

Eu acho que a vantagem da NS é encontrar dependências não lineares e usá-las.
Há dois deles no último artigo do Vladimir.

Regressão linear, pelo contrário, eles irão piorar.

 
Maxim Dmitrievsky:

função mlptrainlm

Este é apenas um valor recomendado, ninguém vai parar pelo menos 1000, mas vai demorar muito tempo... Procurei no código - há apenas um laço no número de épocas (a propósito, também usei 2).
 
elibrarius:
Eu acho que a vantagem da NS é encontrar dependências não lineares e usá-las.
O último artigo do Vladimir tem dois deles.

A regressão linear, pelo contrário, será degradada por eles.


O andaime também é usado exclusivamente para padrões não lineares de antemão, não funciona com padrões lineares

 
elibrarius:
Este é apenas um valor recomendado, ninguém o impede de colocar 1000, mas vai demorar muito tempo... Olhado no código - há apenas um loop no número de épocas (a propósito, também usei 2).
Chegou aos 1500 em 6 horas. Sim, longo - cerca de 32 horas, mas, em primeiro lugar, o resultado excede as expectativas. Em segundo lugar, não muito tempo, em comparação com a projeção à mão). E com o MLP - estrutura padrão, e ensine o que quiser)).
 
Maxim Dmitrievsky:

O andaime também é usado exclusivamente para padrões não lineares de antemão, não funciona com padrões lineares

Talvez seja por isso que a floresta na parcela de validação é até 0,4% melhor do que a regressão linear)))). O tempo de aprendizagem é de 36 e 3 min, respectivamente (a 265 entradas). Estou a começar a gostar da regressão linear.
 

Se alguém quiser brincar, o andaime aprende com os incrementos e dá uma previsão de 1 barra à frente. Nos ajustes, defina a profundidade de aprendizagem, atraso para os incrementos e número de entradas (cada nova entrada é um deslocamento de 1 barra para trás). Em seguida, o valor previsto é deduzido dos preços atuais. Histograma é desenhado apenas para cada nova barra, eu vi no 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:
Talvez seja por isso que a floresta na parcela de validação é até 0,4% melhor do que a regressão linear)). Tempo de aprendizagem 36 e 3 min, respectivamente (a 265 entradas). Estou a começar a gostar da regressão linear.

Eu também comparei - fiz autoregressão da BP e fiz o mesmo através da floresta - as diferenças são mínimas :) Em essência, isto significa que não há um padrão normal lá ou por aí.