Conseillers en réseaux neuronaux, partageant leurs expériences. - page 9

 
Andrey Emelyanov:

J'ai aussi essayé d'implémenter un algorithme similaire en 2013... Mais j'ai utilisé 7 indicateurs, et Zigzag a été utilisé pour former un vecteur pour l'entraînement du NS. Mais l'essence est la même - je cherchais des positions inversées... Lorsque j'ai commencé à utiliser Zigzag, je n'avais aucune chance avec les données des indicateurs et les signaux de trading. jusqu'à ce que je tombe accidentellement sur des modèles. Cela a radicalement changé mon TS. Maintenant, mon algorithme est beaucoup plus simple :

1. Calculer les tendances à la minute et à l'heure, sur l'année écoulée ;

2. Réalisation d'un dictionnaire des points d'inflexion (paires "schéma des minutes - schéma des heures") ;

3. enseignement du NS à l'aide du dictionnaire du point de bascule (sur 150-160 paires) ;

C'est le résultat de ma démarche :

aux inconvénients de mon approche :

1) Risque élevé du TS - comme il n'est pas possible de déterminer la valeur exacte du prix de rupture, le TS place 9 ordres en attente avec des lots : 1, 1, 3, 6, 14, 31, 70, 158, 355 ;

2) Difficile de mettre en œuvre un algorithme de sortie (chalut TS) ;

Donc NS peut être utilisé pour le trading, la seule question est de savoir ce qu'il faut enseigner à NS...

P/s : Par motifs, j'entends les motifs de A. Merrill (M & W) .

C'est une approche intelligente. Et les modèles ont été décrits simplement comme la position des barres dans la matrice, sans prendre en compte le delta de prix réel - seulement la position relative ?

J'ai une idée, pour essayer les indicateurs de tendance mais avec un cadre différent - les cinq premières barres nous analysons les indicateurs sur les 5 derniers indicateurs, et les deux indicateurs pour l'analyse de tendance - nous analysons par incréments de 10 et prenons en compte les changements absolus.

Le zig-zag est une idée intelligente, mais comment les pics sont-ils filtrés à partir des ondulations plates qui pourraient être de faux points de changement de tendance ?

 
-Aleks-:

Une approche raisonnable. Et les modèles décrits simplement comme la position des barres dans la matrice, sans prendre en compte le delta de prix réel - juste la position relative ?

J'ai une idée, pour essayer les indicateurs de tendance, mais avec un cadre différent - les cinq premières barres nous analysons les indicateurs sur les 5 derniers indicateurs, et deux indicateurs pour l'analyse des tendances - nous analysons par pas de 10 et en même temps nous prenons en compte les changements absolus.

Le zig-zag est une idée intelligente, mais comment des pics filtrés à partir de wobbles plats pourraient être de faux points de changement de tendance ?

Je le fais de cette façon :

Il y a un tableau dynamique qui stocke exclusivement les paires de motifs (je l'appelle un dictionnaire), si une paire de motifs entre dans le dictionnaire une deuxième fois, je ne l'écris pas ; et deux tableaux de compteurs de senior timeframe et junior - ils comptent combien de fois un motif a été impliqué dans la formation de paires, même s'il n'a pas été écrit dans le dictionnaire.

Le vecteur d'apprentissage est formé selon le dictionnaire, le poids d'un motif individuel = compteur_de_motifs / compteur_maximum. C'est-à-dire que le motif qui participe le plus souvent à la formation de paires est égal à 1, et tous les autres motifs sont inférieurs à 1. C'est le tableau que vous obtenez après avoir enseigné le NS :

Motif principal Compte principal Modèle d'esclave Nombre d'esclaves Somme_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

Structure du SN : 64 neurones d'entrée, 4 internes, 1 de sortie. C'est-à-dire qu'un neurone d'entrée décrit un seul motif. L'entraînement de la grille prend 40 à 50 minutes, et l'erreur de NS ne dépasse pas 0,00001.

J'ai donc un modèle qui peut prédire la signification de paires de motifs, même si elle ne figurait pas dans le dictionnaire auparavant.

J'ai longtemps lutté contre les pics plats et faux, mais je travaille au niveau du calcul de ZigZaga. J'ai légèrement modifié le code d'un Zigzag standard, à savoir, implémenté le pourcentage ZZ sur sa base. Jusqu'à présent, le code ressemble plus ou moins à ce qui suit :

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 est une classe permettant de calculer le ZigZag...

Dossiers :
MyCExtremum.mqh  37 kb
 
-Aleks-:

Une approche raisonnable. Et les modèles sont décrits simplement comme la position des barres dans la matrice, sans prendre en compte le delta de prix réel - juste la position relative ?

J'ai une idée, pour essayer les indicateurs de tendance, mais avec un cadre différent - les cinq premières barres nous analysons les indicateurs sur les 5 derniers indicateurs, et deux indicateurs pour l'analyse des tendances - nous analysons par pas de 10 et en même temps nous prenons en compte les changements absolus.

Le zig-zag est une idée intelligente, mais comment les pics sont-ils filtrés à partir des ondulations plates qui pourraient être de faux points de changement de tendance ?

A propos de l'analyse des indicateurs à l'aide de modèles - c'est très intéressant... Je pense qu'il y a moins de bruit sur les indicateurs, mais nous devrions choisir les indicateurs de sorte que certains suppriment le "faible bruit" et d'autres le "fort bruit", alors vous obtenez un multifiltre.
 

Andrey Emelyanov:

Structure du SN : 64 neurones d'entrée, 4 internes, 1 de sortie. C'est-à-dire qu'un neurone d'entrée décrit un seul motif.

Vous espérez des résultats avec ce modèle ? Votre couche interne agit comme un compresseur intermédiaire, pas comme un classificateur.
 
Andrey Emelyanov:

Je fais ce qui suit :

Il y a un tableau dynamique qui stocke exclusivement les paires de motifs (je l'appelle le dictionnaire), si une paire de motifs se retrouve dans le dictionnaire une deuxième fois, je ne l'écris pas ; et deux tableaux de compteurs de temps forts et de temps faibles - ils comptent combien de fois un motif a été impliqué dans la formation de paires, même s'il n'a pas été écrit dans le dictionnaire.

Le vecteur d'apprentissage est formé selon le dictionnaire, le poids d'un motif individuel = compteur_de_motifs / compteur_maximum. C'est-à-dire que le motif qui participe le plus souvent à la formation de paires est égal à 1, et tous les autres motifs sont inférieurs à 1. C'est le tableau que vous obtenez après avoir enseigné le NS :

Motif principal Compte principal Modèle d'esclave Nombre d'esclaves Somme_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

Structure du SN : 64 neurones d'entrée, 4 internes, 1 de sortie. C'est-à-dire qu'un neurone d'entrée décrit un seul motif. L'entraînement de la grille prend 40 à 50 minutes, et l'erreur de NS ne dépasse pas 0,00001.

J'ai donc un modèle qui peut prédire la signification de paires de motifs, même si elle ne figurait pas dans le dictionnaire auparavant.

J'ai longtemps lutté contre les pics plats et faux, mais je travaille au niveau du calcul de ZigZaga. J'ai légèrement modifié le code d'un Zigzag standard, à savoir, implémenté le pourcentage ZZ sur sa base. Jusqu'à présent, le code ressemble plus ou moins à ce qui suit :

Le tableau est une solution intéressante. Y a-t-il des différences dans les statistiques entre les paires/périodes, quelle est la stabilité en général de la variabilité de la fréquence d'occurrence d'un modèle donnant un résultat de prédiction positif ?

En ce qui concerne le zig-zag, j'ai aussi une solution en pourcentage, mais j'utilise aussi un historique plus profond pour calculer une section de référence du zig-zag, par rapport à laquelle je compare le pourcentage de changement des autres.

 
Andrey Emelyanov:
Quant à l'analyse des indicateurs avec des modèles, c'est très intéressant... Je pense qu'il y a moins de bruit dans les indicateurs, mais il faut choisir les indicateurs de façon à ce que l'un supprime le "faible bruit" et l'autre le "fort bruit", puis vous avez un multi-filtre.
Il existe de nombreux indicateurs différents. J'ai expérimenté avec des oscillateurs standards (et leur type de sans intérêt), et j'ai réussi à faire du profit sur chacun d'eux - tout dépend des réglages... Il s'agit juste de savoir si c'est du hasard ou de la régularité.
 
Комбинатор:
Vous espérez des résultats avec ce modèle ? Votre couche interne agit comme un compresseur intermédiaire, pas comme un classificateur.
C'est la compression dont j'ai besoin... à un moment donné (sur la barre actuelle), sur 64 entrées, seules 2 entrées sont non nulles... et la tâche du réseau n'est pas de diviser par achat/vente, mais de mesurer quelle est la probabilité d'un rebond à des entrées données. Ou est-ce que je raisonne mal ?
 
-Aleks-:

Le tableau est une solution intéressante. Existe-t-il des différences statistiques entre les paires/périodes, quelle est la stabilité en général de la variabilité de la fréquence d'apparition du motif qui donne un résultat de prédiction positif ?

En ce qui concerne le zig-zag, j'ai aussi une solution en pourcentage, mais j'utilise aussi un historique plus profond pour calculer une section de référence du zig-zag, par rapport à laquelle je compare le pourcentage de changement des autres.

Comme tout le monde le sait, les modèles d'A. Merrill ne donnent pas une réponse exacte à la question de savoir si le modèle va se développer davantage (maintien de la tendance) ou se transformer en un autre modèle (rebond du prix). C'est pourquoi j'ai décidé de chercher la réponse en utilisant deux échelles de temps - une heure et une minute. Je collecte des statistiques sur la récurrence des paires et je ne dispose pas encore d'un dictionnaire de formation universel. Cependant, je suis sûr que cette connexion doit exister... Sinon, il n'y aurait pas de motifs harmonieux : papillons, chauves-souris, etc.
 
Andrey Emelyanov:
Comme tout le monde le sait, les modèles d'A. Merrill ne donnent pas une réponse exacte à la question de savoir si le modèle va se développer davantage (maintien de la tendance) ou se transformer en un autre modèle (rebond du prix). C'est pourquoi j'ai décidé de chercher la réponse en utilisant deux échelles de temps - une heure et une minute. Je collecte des statistiques sur la récurrence des paires et je ne dispose pas encore d'un dictionnaire de formation universel. Cependant, je suis sûr que cette connexion doit exister... Sinon, il n'y aurait pas de modèles harmonieux : papillons, chauves-souris, etc.
Les modèles perçus visuellement par un homme comme "papillons, chauves-souris, etc." naissent uniquement dans le cerveau humain et, comme je le pense, il est nécessaire de considérer ce facteur, il est nécessaire d'étudier la psychologie cognitive sur ce sujet pour comprendre ce qui est essentiel pour le cerveau et ce qui ne l'est pas dans la perception du modèle, c'est-à-dire quelles erreurs sont acceptables et lesquelles ne le sont pas. Le cerveau complète souvent ce qu'il s'attend à voir - son vocabulaire de motifs est limité, il regroupe donc des combinaisons similaires de chandeliers en une seule image, c'est-à-dire qu'il n'utilise pas le modèle mathématique exact pour décrire ce qu'il voit.
 

Mon bébé est toujours aussi bête et ennuyeux, mais il avance... 8 indicateurs d'entrée, 1 sortie, 15 neurones dans la couche couverte. 2000 vecteurs d'entrée, 10000 époques d'apprentissage.

C'est en fait le 3e ou 4e, et tous obtiennent à peu près les mêmes résultats. Je suppose que j'ai besoin de plus de neurones et de vecteurs d'entrée, mais l'entraînement prend beaucoup de temps.

J'ai une idée approximative du modèle qu'il devrait détecter, j'ai sélectionné des indicateurs de différentes périodes et les sorties semblent contenir des informations significatives.

Raison: