eine Handelsstrategie auf der Grundlage der Elliott-Wellen-Theorie - Seite 287

 
zu olyakish


Guten Abend zusammen.
Könnten Sie bitte die Kinder dieses Algorithmus nennen?

Ich danke Ihnen im Voraus


Das sage ich Ihnen.

Wir wenden einen mehrfachen Medianfilter auf die Preiskurve an. Was ist das? Wir nehmen ein Fenster ungerader Größe (>=3) und lassen es durch alle Werte der ursprünglichen Kurve laufen. Sortieren Sie an jedem aktuellen Punkt die im Fenster enthaltenen Punkte nach ihrem Wert. Dem aktuellen Punkt wird ein Durchschnittswert (in dem Sinne, dass er sich in der Mitte des Arrays befindet) aus dem sortierten Array zugewiesen. Auf das Ergebnis wird erneut der gleiche Filter angewendet. Wir wiederholen es viele Male (normalerweise reichen 20-30 Mal).
Um die Widerstandsniveaus zu erhalten, drehen wir die Preiskurve auf den Kopf und machen dasselbe. Dann spiegeln wir das erhaltene Ergebnis rückwärts.
Das ist alles!
...



Eine kurze Frage.
Angenommen, wir haben einen Verlauf von 1000 Berichten (Balken)
Fenster 3
wir berechnen keine Ergebnisse für 1000.999 Fenster und führen die erste Berechnung durch, wenn wir zum 998. Bericht kommen (wir haben Daten von 998.999 und 1000 Berichten)
unser erster Durchgang liefert 998 Ergebnisse
für den zweiten Durchlauf erhalten wir 996 Berichte, indem wir das im vorherigen Durchlauf gebildete Array verwenden
im dritten Durchgang erhalten wir 994 ...
und so weiter ...
Das heißt, bei 30 Durchläufen erhalten wir eine Reihe von 960 Werten

Vielleicht habe ich Sie nicht richtig verstanden?
 
zu olyakisch

<br/ translate="no"> Eine kurze Frage
Nehmen wir an, wir haben eine Geschichte von 1000 Berichten (Balken)
Fenster 3
es stellt sich heraus, dass für 1000,999 wir nicht zählen, weil es kleiner ist als das Fenster und die erste Berechnung, die wir nur tun, wenn wir zu 998 Bericht (wir haben Daten von 998,999 und 1000 Berichte)
erhalten wir den ersten Durchlauf mit 998 Ergebnisse
der zweite Durchlauf erhalten wir 996 Bericht bereits durch den vorherigen Lauf des Arrays
der dritte Lauf erhalten wir 994 ...
und so weiter ...
d. h., wenn Sie 30 Mal ausgeführt haben, erhalten Sie ein Array mit 960 Werten

Vielleicht habe ich Sie missverstanden?



Nicht ganz. Technisch gesehen läuft das ein wenig anders ab. Bevor Sie einen Filter anwenden, erweitern Sie das ursprüngliche Feld um die Hälfte der Breite des Filterfensters in beide Richtungen. Leere Stellen im neuen Array füllen Sie entweder mit einer Konstante, d.h. dem letzten Wert vom Rand des ursprünglichen Arrays, oder symmetrisch mit den Extremwerten des ursprünglichen Arrays. In diesem Fall erhalten Sie wieder 1000 Punkte, nachdem Sie den Filter auf das ursprüngliche Array mit 1000 Punkten angewendet haben. Wenn Sie das nächste Mal filtern, wiederholt sich alles.
In diesem Fall kann es natürlich zu Verzerrungen an den Rändern kommen. Dies lässt sich jedoch nicht vermeiden, da jeder Fensterfilter (und überhaupt jeder Filter) eine Phasenverzögerung aufweist, auch der Medianfilter. Im Allgemeinen ist das die Art und Weise, wie die Natur funktioniert.
Wir können es so machen, wie Sie es beschreiben, aber dann kommen wir nicht an den Rand des ursprünglichen Arrays; oder wir können eine Erweiterung verwenden, aber dann kommen wir nicht an den Rand des Ergebnisses.
Dies ist die schlechte Nachricht.
Die gute Nachricht ist, dass der Medianfilter nicht so empfindlich auf Kanteneffekte reagiert wie lineare Filter. Die wenigen Beispiele, die ich mir ansehen konnte, zeigen, dass die Verzerrungen an den Rändern entweder gering sind oder in einigen Fällen gar nicht auftreten.

PS. Ja... Mir ist gerade eine andere Idee in den Sinn gekommen. Der Filter kann rekursiv angewendet werden. Ich weiß nicht, was es bewirken würde, ich habe es nicht ausprobiert, aber es würde schneller zählen.
 
Andre69, ich habe den von Ihnen vorgeschlagenen Medianfilter-Algorithmus implementiert. Es zeigt sich, dass sich die Form der geglätteten Kurve nach dem dritten Durchlauf nicht mehr ändert. Dieser Effekt wurde in einem breiten Spektrum von Fenstergrößen (bis zu 10000 Proben) getestet.
Was die Anwendungen im Handel betrifft, so ist es richtig, "linkes Fenster" zu verwenden, wenn dem aktuellen Punkt ein Wert aus der Mitte des Fensters zugewiesen wird, das sich VOLLSTÄNDIG links vom aktuellen Wert befindet. Natürlich führt dies zu einer Phasenverzögerung (Lag), aber das ist der Lauf der Welt:-)
 
zu Neutron

Andre69, ich habe den von Ihnen vorgeschlagenen Medianfilter-Algorithmus implementiert. Es zeigt sich, dass sich die Form der geglätteten Kurve nach dem dritten Durchlauf nicht mehr ändert. Ich habe diesen Effekt in einem breiten Spektrum von Fenstergrößen (bis zu 10000 Proben) überprüft. <br/ translate="no"> Was Anwendungen im Handel betrifft, so ist es richtig, das "linke Fenster" zu verwenden, wenn dem aktuellen Punkt ein Wert aus der Mitte des Fensters zugewiesen wird, der VOLLSTÄNDIG links vom aktuellen Wert liegt. Natürlich führt dies zu einer Phasenverzögerung (Lag), aber das ist der Lauf der Welt:-)


Ja... Das passt nicht zusammen. Ich habe mit der Überprüfung begonnen. Schließlich habe ich mir den Code angesehen, den ich für die Medianfilterung verwende. Ich habe es vor N Jahren (N>5) für ein kleines Grafikausgabeprogramm geschrieben. Jetzt habe ich begonnen, dieses Programm als Polygon für alle möglichen Forschungen zu verwenden. Das ist praktisch, und ich habe mir die alten Teile des Codes noch gar nicht angesehen. Es funktioniert alles gut und schön... Jetzt sehe ich es mir an... und entdeckte plötzlich, dass die Funktion, von der ich dachte, sie würde den Median filtern, genau das nicht tut! Entschuldigung für die unfreiwillige Fehlinformation! Ich neige mein schuldbewusstes Haupt.
Warum und wieso ich das damals getan habe - Gott bewahre, ich weiß es nicht mehr.
Beim klassischen Median wird der zentrale Wert einer sortierten Reihe genommen. In diesem speziellen Fall habe ich den Durchschnitt zwischen dem zentralen Wert und dem davor liegenden Wert genommen. Vielleicht brauchte ich sie aus irgendeinem Grund vor langer Zeit. Ich habe auch einen nicht-linearen Filter, obwohl es sich natürlich nicht um den Median im engeren Sinne handelt. Als ich zur klassischen Version zurückkehrte, sah es so aus, wie Sie es beschrieben haben. In meiner Variante ändert sich die Kurve bei jeder Anwendung des Filters und tendiert schließlich zu einer geraden Linie (nach mehreren hundert Filterungen). Je größer das Filterfenster ist, desto schneller geschieht dies.
Um weitere Unklarheiten zu vermeiden, stelle ich ein Stück Code in C zur Verfügung.
Es ist einfach, ich hoffe, jeder kann es herausfinden.
//---------------------------------------------------------------------------
void __fastcall TPlotForm2D_WL::FilterCurveMedian(int Flen)
{
 //количество точек кривой
 int NN=Chart1->Series[IndexUpDown->Position-1]->Count();
 
 //объявляем временные массивы и выделяем память под них
 double* TempArray=new double[NN+(Flen/2)*2];
 double* ResultArray= new double[NN];
 double* XArray=new double[NN];
 double* MedArray=new double[Flen];

 //заполняем массив значений Х точками текущей кривой
 for(int i=0;i<NN;++i)
  XArray[i]=Chart1->Series[IndexUpDown->Position-1]->
                           XValues->Value[i];

 double Start=2*Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[0];
 double End=2*Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[NN-1];

 int k=0;

 //заполняем временный массив значениями Y точками текущей кривой
 for(int i=Flen/2;i>0;--i) //симметричное расширение влево
  TempArray[k++]=Start-Chart1->Series[IndexUpDown->Position-1]->
                                      YValues->Value[i];
 for(int i=0;i<NN;++i)
  TempArray[k++]=Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[i];
 for(int i=NN-1;i>=NN-Flen/2;--i)//симметричное расширение вправо
  TempArray[k++]=End-Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[i];

 //собственно фильтрация
 for(int i=Flen/2;i<NN+Flen/2;++i)
  {
   for(int j=-Flen/2;j<=Flen/2;++j)
    MedArray[j+Flen/2]=TempArray[i+j];
   ::sort(MedArray,MedArray+Flen);
   //Это то, что я написал когда-то. Уже не помню, почему так.
   //Но это работает!!!!!!!!!!
   ResultArray[i-Flen/2]=(MedArray[Flen/2]+MedArray[Flen/2-1])/2;
   //А эта строчка - классический медианный фильтр.
   //И это не работает, так как хотелось бы. ???? Sorry
   //ResultArray[i-Flen/2]=MedArray[Flen/2];
  }


 //дальше вывод и удаление временных массивов
 AddFastLine();

 for(int i=0;i<NN;++i)
  Chart1->Series[Chart1->SeriesCount()-1]->
          AddXY(XArray[i],ResultArray[i],"",clBlue);

 SwitchOnCurve(PlotForm2D_WL->Chart1->SeriesCount()-1);

 delete [] TempArray;
 delete [] ResultArray;
 delete [] XArray;
 delete [] MedArray;

 if(PlotForm2D_WL->Visible)
  PlotForm2D_WL->Visible = false;
 PlotForm2D_WL->Show();

}
//---------------------------------------------------------------------------



Was das "linke Fenster" betrifft, so stimme ich zu. Aber im Moment denke ich, es geht um die Details.

Ich möchte mich noch einmal entschuldigen.

 
zu Nordwind
...Aber wenn Sie ernsthaft daran interessiert sind, diese Forschungsarbeit zu erhalten, schicken Sie uns eine E-Mail (info@disserr.ru), und wir werden die angeforderte Arbeit nach Möglichkeit aus dem Archiv liefern...


Vielleicht gibt es etwas Neues über diese Arbeit?
 
zu Северный Ветер
...Aber wenn Sie ernsthaft daran interessiert sind, diese Forschungsarbeit zu erhalten, schreiben Sie uns (info@disserr.ru) und wir werden die gewünschte Arbeit aus dem Archiv liefern, wenn möglich...


Gibt es irgendwelche Neuigkeiten zu dieser Arbeit?

Nach der Veröffentlichung ihrer Antwort habe ich keine weiteren Schritte unternommen.
Ich habe Ihnen gerade gezeigt, wie Sie versuchen können, das Thesenmaterial zu finden.
Ich weise Sie darauf hin, dass das Material möglicherweise bezahlt werden muss.
 
2 Andre69

Mit MatLab werden einige schwere Positionskämpfe ausgetragen.
Für den Anfang habe ich mich entschieden, nur die Wavelet-Zerlegung der Preisreihen und der Indikatorreihenwerte zu betrachten. Bei DWT habe ich keine Überraschungen gefunden, alles ist mehr oder weniger verständlich.
Für CWT war die Indikatorzerlegung ebenfalls recht eindeutig. Die Preisreihen haben jedoch folgendes Bild ergeben:


Die Struktur dieses Bildes unterscheidet sich im Allgemeinen deutlich von der des Bildes in Andre69s Beitrag vom 28.06.07 20:43 auf Seite. 141. Ich würde gerne verstehen, warum.
Andererseits ist sie zu regelmäßig strukturiert. Warum?
Diese Analyse wurde für eine Serie von 1024 Proben durchgeführt.
Skaleneinstellungen: Min=1, Step=1, Max=512. DMeyer-Wavelet

PS Übrigens war der obige Beitrag der letzte in einer endlosen Reihe über Wavelets. :-)
Ich würde gerne wissen, wie es weitergeht. Sollte?
 
an Yurixx
Die Struktur dieses Bildes ist ganz anders als z.B. die des Bildes im Beitrag Andre69 28.06.07 20:43 auf Seite 141. 141. Ich würde gerne verstehen, warum.
Andererseits ist sie zu regelmäßig strukturiert. Warum?


Yura, eine solche regelmäßige Struktur liegt in der Natur der Randeffekte, die zwangsläufig an den Enden des untersuchten BP auftreten. Es ist unmöglich, solche Auswirkungen zu vermeiden. Wenn es die Bedingung des zu lösenden Problems zulässt, können Sie jedoch einige Terme der Reihe an jedem Ende des VR zurücklassen (die Anzahl der Terme entspricht der Breite des Stichprobenfensters), die an den Berechnungen teilnehmen, aber nicht für die Visualisierung verwendet werden. Nach dieser Prozedur wird das Bild angemessen und isotrop sein.
 
<br / translate="no"> Aber wenn die Bedingungen des zu lösenden Problems es zulassen, können Sie an jedem Ende des BP einige Zeilenglieder stehen lassen, die an den Berechnungen teilnehmen, aber nicht in der Visualisierung verwendet werden. Nach dieser Prozedur wird das Bild angemessen und isotrop sein.


Danke, Sergey, für die Klarstellung. Alles, was bleibt, ist herauszufinden, wie man das macht, worüber man schreibt.
Parsing Wavelet Toolbox habe ich solche Funktionen nicht gefunden. Vielleicht habe ich etwas übersehen oder es kann nur manuell gemacht werden?
 
Dieser Effekt kann minimiert werden, wenn die Bedingung n/N<<1 erfüllt ist, wobei n die Größe des Fensters ist (in Ihrem Fall, so wie ich es verstehe, n = Max), N ist die Anzahl der BP-Mitglieder (1024). Geht man von 0,01<<1 aus, so ergibt sich Mach<10 für die verfügbaren Serien.
In diesem Fall sehen die dargestellten Ergebnisse korrekt aus.
Grund der Beschwerde: