Conselheiros em redes neurais, compartilhando experiências. - página 9

 
Andrey Emelyanov:

Eu também tentei implementar um algoritmo semelhante em 2013. Mas eu usei 7 indicadores, e o Zigzag foi usado para formar um vetor para o treinamento do NS. Mas a essência é a mesma - eu estava procurando posições invertidas... Quando comecei a usar o Zigzag, não tinha idéia do que fazer com ele. até que, acidentalmente, me deparei com alguns padrões. Isso mudou radicalmente o meu TS. Agora meu algoritmo é muito mais simples:

1. Cálculo de padrões de minutos e horas, ao longo do último ano;

2. Fazer um dicionário de pontos de viragem (pares "padrão minuto - padrão hora") ;

3. Ensinar NS usando o dicionário de pontos de inclinação (em 150-160 pares);

Este é o resultado da minha abordagem:

Às desvantagens da minha abordagem:

1) Alto risco do TS - como não é possível determinar o valor exato do preço de parada, o TS coloca 9 pedidos pendentes com lotes: 1, 1, 3, 6, 14, 31, 70, 158, 355;

2) Difícil de implementar um algoritmo de saída (TS de arrasto);

Assim, NS pode ser usado para comércio, a única questão é o que ensinar NS...

P/s: Por padrões eu entendo os padrões de A. Merrill's (M & W) .

É uma abordagem inteligente. E os padrões foram descritos simplesmente como a posição das barras na matriz, sem levar em conta o delta de preço real - apenas a posição relativa?

Tenho uma idéia, para tentar os indicadores padrão, mas com um quadro diferente - as primeiras cinco barras analisamos os indicadores nos últimos 5 indicadores, e os dois indicadores para análise de tendências - analisamos em incrementos de 10 e levamos em conta as mudanças absolutas.

O zig-zag é uma idéia inteligente, mas como é que os picos se filtram das oscilações planas que lá podem haver falsos pontos de mudança de tendência?

 
-Aleks-:

Uma abordagem sensata. E os padrões descritos simplesmente como a posição das barras na matriz, sem levar em conta o delta de preço real - apenas a posição relativa?

Tenho uma idéia, para tentar os indicadores padrão, mas com um quadro diferente - as primeiras cinco barras analisamos os indicadores nos últimos 5 indicadores, e dois indicadores para análise de tendências - analisamos em etapas de 10 e ao mesmo tempo levamos em conta as mudanças absolutas.

Sobre o zig-zag é uma idéia inteligente, mas como os picos filtrados das oscilações planas podem ser falsos pontos de mudança de tendência?

Eu o faço desta maneira:

uma matriz dinâmica que armazena exclusivamente pares de padrões (chamo-lhe um dicionário), se um par de padrões entrar no dicionário uma segunda vez eu não o escrevo; e duas matrizes de contadores de tempo sênior e júnior - eles contam quantas vezes um padrão foi envolvido na formação de pares, mesmo que não tenha sido escrito no dicionário.

O vetor de treinamento é formado de acordo com o dicionário, o peso de um padrão individual = padrão_contador_máximo_contador. Ou seja, o padrão, que participa mais frequentemente da formação de pares, é igual a 1, e todos os outros padrões são inferiores a 1. Esta é a tabela que você recebe depois de ensinar a NS:

Padrão principal Contagem principal Padrão de escravo Contagem de escravos Sum_Multilayer_Perceptron
W2 18 W2 21 0.94914702
W14 14 W2 21 0.84972197
M15 20 M15 14 0.83269191
W1 11 W2 21 0.77499075
W13 10 W2 21 0.75006553
M15 20 M3 10 0.73813147
M15 20 M10 10 0.73812512
M15 20 M16 10 0.738099
W5 9 W2 21 0.72506739
W10 9 W2 21 0.72505412
M15 20 M11 9 0.71431236
W2 18 W1 11 0.71204136
W2 18 W5 11 0.7118911
W4 8 W2 21 0.70017271
W2 18 W4 10 0.68815217
W2 18 W7 10 0.68802818
M15 20 M7 7 0.66682395
M15 20 M14 6 0.64291215
W2 18 W13 8 0.64045346
M3 12 M15 14 0.63254238
W9 5 W2 21 0.62522345
W3 5 W2 21 0.62509623
W7 5 W2 21 0.62505511
M15 20 M12 5 0.61917222
M15 20 M8 5 0.6191331
W14 14 W1 11 0.61210667
W6 4 W2 21 0.60012943
W2 18 W14 6 0.59301682

Estrutura dos NS: 64 neurônios de entrada, 4 internos, 1 de saída. Ou seja, um neurônio de entrada descreve um padrão. A grade leva 40-50 minutos para treinar, e o erro da NS não excede 0,00001.

Assim, tenho um modelo que pode prever o significado dos pares de padrões, mesmo que não estivesse no dicionário antes.

Tenho lutado com picos planos e falsos durante muito tempo, mas estou trabalhando no nível de cálculo de ZigZaga. Eu modifiquei ligeiramente o código de um Zigzag padrão, ou seja, implementei a porcentagem ZZ em sua base. Até o momento, o código parece mais ou menos como se segue:

int MyCExtremum::GetCombiZigzag(const double    &high[],     // буфер цен high

                                const double    &low[],      // буфер цен low

                                const datetime  &time[],     // буфер время 

                                int             ExtDepth,    // глубина поиска экстремумов(первого прохода)

                                double          ExtDeviation,// "пороговое значение": жесткая ступенька + % роста цены

                                int             ExtBackstep  // глубина поиска экстремумов(второго прохода)

                               )

  {

   //--- value

   int    shift=0, whatlookfor=0, lasthighpos=0, lastlowpos=0, Deviat=1;

   double lasthigh=0.0, lastlow=0.0, percent=0.0;

   int    rates_total = ArraySize(time);          // размер входных таймсерий

   int    limit       = rates_total - ExtDepth;   // лимит на расчеты...

   //+---------------------------------------------------------------+

   //| ОЧЕНЬ ВАЖНАЯ ПРОВЕРКА ВЛИЯЮЩАЯ НА КОРРЕКТНОСТЬ ВЫЧИСЛЕНИЙ!    |

   //+---------------------------------------------------------------+

   if(ArrayIsSeries(high)) ArraySetAsSeries(high,false);

   if(ArrayIsSeries(low))  ArraySetAsSeries(low,false);

   if(ArrayIsSeries(time)) ArraySetAsSeries(time,false);

   //+---------------------------------------------------------------+

   //| ПРОВЕРКИ ВХОДНЫХ ПЕРЕМЕННЫХ                                   |

   //+---------------------------------------------------------------+

   if(rates_total<20)

     { 

      Print(__FUNCTION__," ERROR: the small size of the buffer.");

      return(-1);                                     

     }

   if(ExtDeviation<0 || ExtDeviation>100)

     { 

      Print(__FUNCTION__," ERROR: Is\'not correct a Deviation. The value of Deviation should be in the interval [0..100].");

      return(-1);                                     

     }

   //--- Проверка: Depth and Backstep

   if((ExtDepth < ExtBackstep)||(ExtDepth < 2))

     {

      Print(__FUNCTION__+" ERROR: Is\'not correct a Depth and Backstep. The value of Depth should be greater than Backstep.");

      return(-1);

     }

   //--- готовим буфер ZigzagBuffer[]

   if(ArraySize(ZigzagBuffer)>0) ArrayFree(ZigzagBuffer);               // Удаляем старые данные

   ArrayResize(ZigzagBuffer,rates_total, EXTREMUM_RESERVE);

   ArrayFill(ZigzagBuffer,0,rates_total,0.0);

   if(ArrayIsSeries(ZigzagBuffer))  ArraySetAsSeries(ZigzagBuffer,  false);

   //---

   if(ArraySize(HighMapBuffer)>0) ArrayFree(HighMapBuffer);             // Удаляем старые данные

   ArrayResize(HighMapBuffer,rates_total, EXTREMUM_RESERVE);

   ArrayFill(HighMapBuffer,0,rates_total,0.0);

   if(ArrayIsSeries(HighMapBuffer)) ArraySetAsSeries(HighMapBuffer, false);

   //---

   if(ArraySize(LowMapBuffer)>0) ArrayFree(LowMapBuffer);               // Удаляем старые данные

   ArrayResize(LowMapBuffer,rates_total, EXTREMUM_RESERVE);

   ArrayFill(LowMapBuffer,0,rates_total,0.0);

   if(ArrayIsSeries(LowMapBuffer))  ArraySetAsSeries(LowMapBuffer,  false);   

   //---

   if(ArraySize(TimeBuffer)>0) ArrayFree(TimeBuffer);                   // Удаляем старые данные

   ArrayResize(TimeBuffer,     rates_total, EXTREMUM_RESERVE);

   ArrayFill(TimeBuffer,    0, rates_total,   0);

   if(ArrayIsSeries(TimeBuffer))  ArraySetAsSeries(TimeBuffer,  false);   

   //--- корректировка Deviation

   if(ExtDeviation < 1)

     {

      Deviat = 1;

     }else

        {

         Deviat = (int)ExtDeviation;

        }

   //--- получаем "свежие" минимумы и максимумы

   if(GetHighMapZigzag(high,ExtDepth,Deviat,ExtBackstep) < 0) return(0);

   if(GetLowMapZigzag(low,ExtDepth,Deviat,ExtBackstep)   < 0) return(0);

   //--- final rejection

   for(shift=ExtDepth;shift<rates_total;shift++)

     {

      switch(whatlookfor)

        {

         case Start: // search for peak or lawn

            if(lastlow==0 && lasthigh==0)

              {

               if(HighMapBuffer[shift]!=0)

                 {

                  lasthigh=high[shift];

                  lasthighpos=shift;

                  whatlookfor=Sill;

                  ZigzagBuffer[shift]=lasthigh;

                  TimeBuffer[shift]=time[shift];

                 }

               if(LowMapBuffer[shift]!=0)

                 {

                  lastlow=low[shift];

                  lastlowpos=shift;

                  whatlookfor=Pike;

                  ZigzagBuffer[shift]=lastlow;

                  TimeBuffer[shift]=time[shift];

                 }

              }

            break;

         case Pike: // search for peak

            if(LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0.0)

              {

               //---

               ZigzagBuffer[lastlowpos] = 0.0;

               TimeBuffer[lastlowpos]   = 0;

               //---

               lastlowpos=shift;

               lastlow=LowMapBuffer[shift];

               ZigzagBuffer[shift]=lastlow;

               TimeBuffer[shift]=time[shift];

               //--- Обязательно: покинуть switch

               break;

              }

            //--- Обход "двойственности"

            if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow)

              {

               //---

               ZigzagBuffer[lastlowpos] = 0.0;

               TimeBuffer[lastlowpos]   = 0;

               //---

               lastlowpos=shift;

               lastlow=LowMapBuffer[shift];

               ZigzagBuffer[shift]=lastlow;

               TimeBuffer[shift]=time[shift];

               //--- Обязательно: покинуть switch

               break;

              }

            if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)

              {

               //--- Проверка: % роста цены

               percent = (HighMapBuffer[shift]-lastlow)/(lastlow/100);

               if(percent > ExtDeviation)

                 {

                  lasthigh=HighMapBuffer[shift];

                  lasthighpos=shift;

                  ZigzagBuffer[shift]=lasthigh;

                  TimeBuffer[shift]=time[shift];

                  whatlookfor=Sill;

                 }

               percent = 0.0;

              }            

            break;

         case Sill: // search for lawn

            if(HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)

              {

               //--- 

               ZigzagBuffer[lasthighpos] = 0.0;

               TimeBuffer[lasthighpos]   = 0;

               //---

               lasthighpos=shift;

               lasthigh=HighMapBuffer[shift];

               ZigzagBuffer[shift]=lasthigh;

               TimeBuffer[shift]=time[shift];

               //--- Обязательно: покинуть switch

               break;

              }

            if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh)

              {

               //--- 

               ZigzagBuffer[lasthighpos] = 0.0;

               TimeBuffer[lasthighpos]   = 0;

               //---

               lasthighpos=shift;

               lasthigh=HighMapBuffer[shift];

               ZigzagBuffer[shift]=lasthigh;

               TimeBuffer[shift]=time[shift];

               //--- Обязательно: покинуть switch

               break;

              }

            if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)

              {

               //--- Проверка: % роста цены

               percent = (lasthigh-LowMapBuffer[shift])/(lasthigh/100);

               if(percent > ExtDeviation)

                 {

                  lastlow=LowMapBuffer[shift];

                  lastlowpos=shift;

                  ZigzagBuffer[shift]=lastlow;

                  TimeBuffer[shift]=time[shift];

                  whatlookfor=Pike;                  

                 }

               percent = 0.0;

              }

            break;

         default: 

            return(-1);

        }

     }

   //--- return value of prev_calculated for next call

   return(rates_total);   

  }

MyCExtremum é uma classe para calcular o ZigZag.

Arquivos anexados:
MyCExtremum.mqh  37 kb
 
-Aleks-:

Uma abordagem sensata. E os padrões descritos simplesmente como a posição das barras na matriz, sem levar em conta o delta de preço real - apenas a posição relativa?

Tenho uma idéia, para tentar os indicadores padrão, mas com um quadro diferente - as primeiras cinco barras analisamos os indicadores nos últimos 5 indicadores, e dois indicadores para análise de tendências - analisamos em etapas de 10 e ao mesmo tempo levamos em conta as mudanças absolutas.

O zig-zag é uma idéia inteligente, mas como é que os picos se filtram das oscilações planas que lá podem haver falsos pontos de mudança de tendência?

Sobre a análise de indicadores usando padrões - isso é muito interessante... Acho que há menos ruído nos indicadores, mas devemos escolher indicadores para que alguns suprimam o "baixo ruído" e outros o "alto ruído", então você obtém um multifiltro.
 

Andrey Emelyanov:

Estrutura dos NS: 64 neurônios de entrada, 4 internos, 1 de saída. Ou seja, um neurônio de entrada descreve um padrão.

Você está esperando resultados com este modelo? Sua camada interna atua como um compressor intermediário, não como um classificador.
 
Andrey Emelyanov:

Eu faço o seguinte:

Há uma matriz dinâmica que armazena exclusivamente pares de padrões (chamo-lhe o dicionário), se um par de padrões entrasse no dicionário uma segunda vez eu não o escrevia; e duas matrizes de alto prazo e contador de baixo prazo - contam quantas vezes um padrão foi envolvido na formação de pares, mesmo que não tenha sido escrito no dicionário.

O vetor de treinamento é formado de acordo com o dicionário, o peso de um padrão individual = padrão_contador_máximo_contador. Ou seja, o padrão, que participa mais frequentemente da formação de pares, é igual a 1, e todos os outros padrões são inferiores a 1. Esta é a tabela que você recebe depois de ensinar a NS:

Padrão principal Contagem principal Padrão de escravo Contagem de escravos Sum_Multilayer_Perceptron
W2 18 W2 21 0.94914702
W14 14 W2 21 0.84972197
M15 20 M15 14 0.83269191
W1 11 W2 21 0.77499075
W13 10 W2 21 0.75006553
M15 20 M3 10 0.73813147
M15 20 M10 10 0.73812512
M15 20 M16 10 0.738099
W5 9 W2 21 0.72506739
W10 9 W2 21 0.72505412
M15 20 M11 9 0.71431236
W2 18 W1 11 0.71204136
W2 18 W5 11 0.7118911
W4 8 W2 21 0.70017271
W2 18 W4 10 0.68815217
W2 18 W7 10 0.68802818
M15 20 M7 7 0.66682395
M15 20 M14 6 0.64291215
W2 18 W13 8 0.64045346
M3 12 M15 14 0.63254238
W9 5 W2 21 0.62522345
W3 5 W2 21 0.62509623
W7 5 W2 21 0.62505511
M15 20 M12 5 0.61917222
M15 20 M8 5 0.6191331
W14 14 W1 11 0.61210667
W6 4 W2 21 0.60012943
W2 18 W14 6 0.59301682

Estrutura dos NS: 64 neurônios de entrada, 4 internos, 1 de saída. Ou seja, um neurônio de entrada descreve um padrão. A grade leva 40-50 minutos para treinar, e o erro da NS não excede 0,00001.

Assim, tenho um modelo que pode prever o significado dos pares de padrões, mesmo que não estivesse no dicionário antes.

Tenho lutado com picos planos e falsos durante muito tempo, mas estou calculando ZigZaga. Eu modifiquei ligeiramente o código de um Zigzag padrão, ou seja, implementei a porcentagem ZZ em sua base. Até o momento, o código parece mais ou menos como se segue:

A matriz é uma solução interessante. Existem diferenças nas estatísticas entre pares/períodos, qual é a estabilidade em geral da variabilidade da freqüência de ocorrência de um padrão dando um resultado de previsão positivo?

Sobre o zig-zag, também tenho uma solução percentual, mas também utilizo um histórico mais profundo para calcular uma seção de referência do zig-zag, contra a qual comparo a mudança percentual em outros.

 
Andrey Emelyanov:
Quanto a analisar indicadores com padrões - isso é muito interessante... Eu acho que há menos ruído nos indicadores, mas você tem que escolher indicadores para que um suprima "baixo ruído" e o outro "alto ruído", então você tem um multifiltro.
Há muitos indicadores diferentes. Fiz experiências com osciladores padrão (e seu tipo de juros), e consegui lucrar com todos eles - tudo depende das configurações... apenas uma questão de se é aleatoriedade ou regularidade.
 
Комбинатор:
Você está esperando resultados com este modelo? Sua camada interna atua como um compressor intermediário, não como um classificador.
Essa é a compressão que eu preciso... em um ponto no tempo (na barra atual) de 64 entradas, apenas 2 entradas não são zero. e a tarefa da rede não é dividir por compra/venda, mas medir o que é a probabilidade de um salto em determinados inputs. Ou estou raciocinando errado?
 
-Aleks-:

A matriz é uma solução interessante. Existe alguma diferença nas estatísticas entre pares/períodos, qual é a estabilidade em geral da variabilidade de frequência de ocorrência de padrões que dá um resultado de previsão positivo?

Sobre o zig-zag, também tenho uma solução percentual, mas também utilizo um histórico mais profundo para calcular uma seção de referência do zig-zag, contra a qual comparo a mudança percentual em outros.

Como todos sabem, os padrões de A. Merrill não dão uma resposta exata se o padrão se desenvolverá mais (manter a tendência) ou se mudará para outro padrão (ricochete de preço). Foi por isso que decidi procurar a resposta usando dois períodos de tempo - uma hora e um minuto. Estou coletando estatísticas de recorrência de pares e ainda não tenho um dicionário universal de treinamento. No entanto, tenho certeza de que essa conexão deve existir... Caso contrário, não haveria padrões harmoniosos: borboletas, morcegos, etc.
 
Andrey Emelyanov:
Como todos sabem, os padrões de A. Merrill não dão uma resposta exata se o padrão se desenvolverá mais (manter a tendência) ou se mudará para outro padrão (ricochete de preço). Foi por isso que decidi procurar a resposta usando dois períodos de tempo - uma hora e um minuto. Eu recolho estatísticas sobre a recorrência de pares e ainda não tenho um dicionário de treinamento universal. No entanto, tenho certeza de que essa conexão deve existir... Caso contrário, não haveria modelos harmoniosos: borboletas, morcegos, etc.
Os modelos percebidos visualmente por um homem como "borboletas, morcegos, etc." nascem apenas no cérebro humano e, como eu penso, é necessário considerar este fator, é necessário estudar psicologia cognitiva sobre este assunto para entender o que é essencial para o cérebro e o que não está na percepção do padrão, ou seja, que erros são aceitáveis e o que não são. O cérebro muitas vezes completa o que espera ver - seu vocabulário padrão é limitado, então ele coloca combinações semelhantes de castiçais em uma única imagem, ou seja, não usa o modelo matemático exato para descrever o que vê.
 

Meu bebê ainda é burro e chato, mas está chegando a algum lugar... 8 indicadores de entrada, 1 de saída, 15 neurônios na camada coberta. 2000 vetores de entrada, 10.000 épocas de treinamento.

Este é na verdade o terceiro ou quarto, todos obtendo praticamente os mesmos resultados. Acho que preciso de mais neurônios e vetor de entrada, mas leva muito tempo para treinar.

Tenho uma idéia aproximada do padrão que deve pegar, selecionei indicadores de diferentes prazos e os resultados parecem ter informações significativas.

Razão: