Berater für neuronale Netze, Erfahrungsaustausch. - Seite 9

 
Andrey Emelyanov:

Ich habe bereits 2013 versucht, einen ähnlichen Algorithmus zu implementieren... Aber ich habe 7 Indikatoren verwendet, und Zigzag wurde verwendet, um einen Vektor für das Training des NS zu bilden. Aber das Wesentliche ist dasselbe - ich habe nach umgekehrten Positionen gesucht... Als ich anfing, Zigzag zu verwenden, hatte ich keine Ahnung, was ich mit ihnen machen sollte. bis ich zufällig auf einige Muster stieß. Das hat meinen TS radikal verändert. Jetzt ist mein Algorithmus viel einfacher:

1. Berechnung von Mustern auf Minuten- und Stundenbasis für das letzte Jahr;

2. Erstellung eines Wörterbuchs der Wendepunkte (Paare "Minutenmuster - Stundenmuster") ;

3. NS-Unterricht unter Verwendung des Kipppunkt-Wörterbuchs (bei 150-160 Paaren);

Dies ist das Ergebnis meines Ansatzes:

Zu den Nachteilen meines Ansatzes:

1) Hohes Risiko des TS - da es nicht möglich ist, den genauen Wert des Break Price zu bestimmen, platziert der TS 9 Pending Orders mit Lots: 1, 1, 3, 6, 14, 31, 70, 158, 355;

2) Es ist schwierig, einen Ausstiegsalgorithmus (Schleppnetz TS) zu implementieren;

NS kann also für den Handel verwendet werden, die Frage ist nur, was man NS beibringen soll...

P/s: Unter Mustern verstehe ich die Muster von A. Merrill (M & W).

Das ist ein kluger Ansatz. Und die Muster wurden einfach als die Position der Balken in der Matrix beschrieben, ohne das tatsächliche Preis-Delta zu berücksichtigen - nur die relative Position?

Ich habe eine Idee, um die Muster-Indikatoren zu versuchen, aber mit einem anderen Rahmen - die ersten fünf Balken analysieren wir die Indikatoren auf die letzten 5 Indikatoren, und die beiden Indikatoren für die Trendanalyse - wir analysieren in Schritten von 10 und berücksichtigen die absoluten Veränderungen.

Der Zickzackkurs ist eine clevere Idee, aber wie werden die Spitzen aus den flachen Wobbeln herausgefiltert, die falsche Trendwechselpunkte sein könnten?

 
-Aleks-:

Ein vernünftiger Ansatz. Und die Muster, die einfach als die Position der Balken in der Matrix beschrieben werden, ohne das tatsächliche Preis-Delta zu berücksichtigen - nur die relative Position?

Ich habe eine Idee, die Musterindikatoren auszuprobieren, aber mit einem anderen Rahmen - die ersten fünf Balken analysieren wir die Indikatoren auf den letzten 5 Indikatoren, und zwei Indikatoren für die Trendanalyse - wir analysieren in 10er Schritten und berücksichtigen gleichzeitig die absoluten Veränderungen.

Der Zickzackkurs ist eine kluge Idee, aber wie können Spitzen, die aus flachen Wobbeln gefiltert werden, falsche Trendwechselpunkte sein?

Ich mache es so:

Es gibt ein dynamisches Array, das ausschließlich Paare von Mustern speichert (ich nenne es ein Wörterbuch), wenn ein Musterpaar ein zweites Mal in das Wörterbuch gelangt, schreibe ich es nicht auf; und zwei Zähler-Arrays von Senior Timeframe und Junior - sie zählen, wie oft ein Muster an der Bildung von Paaren beteiligt war, auch wenn es nicht in das Wörterbuch geschrieben wurde.

Der Trainingsvektor wird nach dem Wörterbuch gebildet, das Gewicht eines einzelnen Musters = Muster_Zähler / Maximum_Zähler. D.h. das Muster, das am häufigsten an der Bildung von Paaren beteiligt ist, ist gleich 1, und alle anderen Muster sind kleiner als 1. Dies ist die Tabelle, die Sie nach dem Unterrichten des NS erhalten:

Hauptmuster Hauptzählung Slave-Muster Anzahl der Sklaven 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

Struktur des NS: 64 Eingangsneuronen, 4 interne, 1 Ausgang. Das heißt, ein Eingangsneuron beschreibt ein Muster. Das Training des Gitters dauert 40-50 Minuten, und der Fehler von NS übersteigt nicht 0,00001.

Damit habe ich ein Modell, das die Bedeutung von Musterpaaren vorhersagen kann, auch wenn es vorher nicht im Wörterbuch stand.

Ich kämpfe schon lange mit flachen und falschen Gipfeln, aber ich arbeite auf dem Niveau der ZigZaga-Berechnung. Ich habe den Code eines Standard-Zigzag leicht modifiziert, nämlich ZZ-Prozentsatz auf seiner Basis implementiert. Bislang sieht der Code mehr oder weniger wie folgt aus:

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 ist eine Klasse zur Berechnung von ZigZag...

Dateien:
MyCExtremum.mqh  37 kb
 
-Aleks-:

Ein vernünftiger Ansatz. Und die Muster, die einfach als die Position der Balken in der Matrix beschrieben werden, ohne das tatsächliche Preis-Delta zu berücksichtigen - nur die relative Position?

Ich habe eine Idee, die Musterindikatoren auszuprobieren, aber mit einem anderen Rahmen - die ersten fünf Balken analysieren wir die Indikatoren auf den letzten 5 Indikatoren, und zwei Indikatoren für die Trendanalyse - wir analysieren in 10er Schritten und berücksichtigen gleichzeitig die absoluten Veränderungen.

Der Zickzackkurs ist eine clevere Idee, aber wie werden die Spitzen aus den flachen Wobbeln herausgefiltert, die falsche Trendwechselpunkte sein könnten?

Über die Analyse von Indikatoren anhand von Mustern - das ist sehr interessant... Ich denke, es gibt weniger Rauschen bei Indikatoren, aber wir sollten Indikatoren so auswählen, dass einige "geringes Rauschen" und andere "hohes Rauschen" unterdrücken, dann erhalten Sie einen Multifilter.
 

Andrey Emelyanov:

Struktur des NS: 64 Eingangsneuronen, 4 interne, 1 Ausgang. Das heißt, ein Eingangsneuron beschreibt ein Muster.

Hoffen Sie auf Ergebnisse mit diesem Modell? Ihre innere Schicht fungiert als Zwischenkompressor, nicht als Klassifikator.
 
Andrey Emelyanov:

Ich tue Folgendes:

Es gibt ein dynamisches Array, das ausschließlich Paare von Mustern speichert (ich nenne es das Wörterbuch), wenn ein Paar von Mustern ein zweites Mal in das Wörterbuch gelangt, schreibe ich es nicht auf; und zwei Arrays mit Zählern für hohe und niedrige Zeitrahmen - sie zählen, wie oft ein Muster an der Bildung von Paaren beteiligt war, auch wenn es nicht in das Wörterbuch geschrieben wurde.

Der Trainingsvektor wird entsprechend dem Wörterbuch gebildet, das Gewicht eines einzelnen Musters = pattern_counter / maximum_counter. D.h. das Muster, das am häufigsten an der Bildung von Paaren beteiligt ist, ist gleich 1, und alle anderen Muster sind kleiner als 1. Dies ist die Tabelle, die Sie nach dem Unterrichten des NS erhalten:

Hauptmuster Hauptzählung Slave-Muster Anzahl der Sklaven 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

Struktur des NS: 64 Eingangsneuronen, 4 interne, 1 Ausgang. Das heißt, ein Eingangsneuron beschreibt ein Muster. Das Training des Gitters dauert 40-50 Minuten, und der Fehler von NS übersteigt nicht 0,00001.

Damit habe ich ein Modell, das die Bedeutung von Musterpaaren vorhersagen kann, auch wenn es vorher nicht im Wörterbuch stand.

Ich kämpfe schon lange mit flachen und falschen Gipfeln, aber ich arbeite auf dem Niveau der ZigZaga-Berechnung. Ich habe den Code eines Standard-Zigzag leicht modifiziert, nämlich ZZ-Prozentsatz auf seiner Basis implementiert. Bislang sieht der Code mehr oder weniger wie folgt aus:

Die Anordnung ist eine interessante Lösung. Gibt es statistische Unterschiede zwischen den Paaren/Zeiträumen, wie stabil ist generell die Variabilität der Häufigkeit des Auftretens eines Musters, das ein positives Vorhersageergebnis liefert?

Was den Zickzackkurs angeht, so habe ich auch eine prozentuale Lösung, aber ich verwende auch einen tieferen Verlauf, um einen Referenzabschnitt des Zickzackkurses zu berechnen, mit dem ich die prozentuale Veränderung in anderen Bereichen vergleiche.

 
Andrey Emelyanov:
Was die Analyse von Indikatoren mit Mustern angeht - das ist sehr interessant... Ich denke, dass es bei Indikatoren weniger Rauschen gibt, aber man muss die Indikatoren so auswählen, dass einer "geringes Rauschen" und der andere "hohes Rauschen" unterdrückt, dann hat man einen Multifilter.
Es gibt viele verschiedene Indikatoren. Ich habe mit Standard-Oszillatoren (und ihrer Art von zinslos) experimentiert, und ich habe es geschafft, Gewinn auf alle von ihnen zu machen - es hängt alles von den Einstellungen... Die Frage ist nur, ob es sich um Zufall oder Regelmäßigkeit handelt.
 
Комбинатор:
Hoffen Sie auf Ergebnisse mit diesem Modell? Ihre innere Schicht fungiert als Zwischenkompressor, nicht als Klassifikator.
Das ist die Kompression, die ich brauche... zu einem bestimmten Zeitpunkt (auf dem aktuellen Balken) sind von 64 Eingängen nur 2 Eingänge ungleich Null... und die Aufgabe des Netzes besteht nicht darin, durch Kauf/Verkauf zu teilen, sondern zu messen, wie hoch die Wahrscheinlichkeit eines Bounce bei gegebenen Inputs ist. Oder argumentiere ich falsch?
 
-Aleks-:

Die Anordnung ist eine interessante Lösung. Gibt es Unterschiede in der Statistik zwischen den Paaren/Zeiträumen, wie stabil ist die Häufigkeitsvariabilität des Auftretens von Mustern im Allgemeinen, die zu einem positiven Vorhersageergebnis führt?

Was den Zickzackkurs angeht, so habe ich auch eine prozentuale Lösung, aber ich verwende auch einen tieferen Verlauf, um einen Referenzabschnitt des Zickzackkurses zu berechnen, mit dem ich die prozentuale Veränderung in anderen Bereichen vergleiche.

Wie jeder weiß, geben die Muster von A. Merrill keine genaue Antwort darauf, ob sich das Muster weiterentwickelt (Trendfortsetzung) oder in ein anderes Muster übergeht (Kurserholung). Deshalb habe ich beschlossen, die Antwort in zwei Zeitrahmen zu suchen - eine Stunde und eine Minute. Ich sammle Statistiken über die Wiederholung von Paaren und habe noch kein universelles Trainingswörterbuch. Ich bin jedoch sicher, dass diese Verbindung bestehen muss... Sonst gäbe es keine harmonischen Muster: Schmetterlinge, Fledermäuse, usw.
 
Andrey Emelyanov:
Wie jeder weiß, geben die Muster von A. Merrill keine genaue Antwort darauf, ob sich das Muster weiterentwickelt (Trendfortsetzung) oder in ein anderes Muster übergeht (Kurserholung). Deshalb habe ich beschlossen, die Antwort in zwei Zeitrahmen zu suchen - eine Stunde und eine Minute. Ich sammle Statistiken über die Wiederholung von Paaren und habe noch kein universelles Trainingswörterbuch. Ich bin jedoch sicher, dass diese Verbindung bestehen muss... Sonst gäbe es keine harmonischen Modelle: Schmetterlinge, Fledermäuse, usw.
Modelle, die von einem Menschen visuell als "Schmetterlinge, Fledermäuse usw." wahrgenommen werden, entstehen nur im menschlichen Gehirn, und da es meiner Meinung nach notwendig ist, diesen Faktor zu berücksichtigen, ist es notwendig, die kognitive Psychologie zu diesem Thema zu studieren, um zu verstehen, was für das Gehirn bei der Wahrnehmung von Mustern wesentlich ist und was nicht, d. h. welche Fehler akzeptabel sind und welche nicht. Das Gehirn vervollständigt oft das, was es zu sehen erwartet - sein Mustervokabular ist begrenzt, also fügt es ähnliche Kombinationen von Kerzenständern zu einem einzigen Bild zusammen, d. h. es verwendet nicht das exakte mathematische Modell, um zu beschreiben, was es sieht.
 

Mein Baby ist immer noch dumm und stumpf, aber es macht Fortschritte... 8 Eingangsindikatoren, 1 Ausgang, 15 Neuronen in der verdeckten Schicht. 2000 Eingabevektoren, 10000 Trainingsepochen.

Dies ist bereits das 3. oder 4. Mal, wobei alle so ziemlich die gleichen Ergebnisse erzielen. Ich denke, ich brauche mehr Neuronen und einen Eingabevektor, aber das Training dauert sehr lange.

Ich habe eine ungefähre Vorstellung von dem Muster, das es aufgreifen sollte, ich habe Indikatoren aus verschiedenen Zeitrahmen ausgewählt und die Ausgaben scheinen aussagekräftige Informationen zu enthalten.

Grund der Beschwerde: