Wednesday 24 May 2017

Exponentiell Gleitender Durchschnitt Algorithmus


Ich habe im Wesentlichen eine Reihe von Werten wie folgt: Das obige Array ist vereinfacht, Im sammeln 1 Wert pro Millisekunde in meinem realen Code und ich muss die Ausgabe auf einem Algorithmus verarbeiten, den ich schrieb, um den nächstgelegenen Peak vor einem Zeitpunkt zu finden. Meine Logik scheitert, weil in meinem Beispiel oben, 0.36 ist die reale Spitze, aber mein Algorithmus würde nach hinten schauen und sehen die letzte Zahl 0,25 als die Spitze, als theres eine Abnahme auf 0,24 vor ihm. Das Ziel ist, diese Werte zu nehmen und einen Algorithmus an sie anzuwenden, der sie ein bisschen glättet, so dass ich mehr lineare Werte habe. (Dh: Id wie meine Ergebnisse zu curvy, nicht Jaggedy) Ive wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden. Wie kann ich das tun? Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, ich mache viel besser mit Code. Wie verarbeite ich Werte in meinem Array, indem du eine exponentielle gleitende durchschnittliche Berechnung anwende, um sie herauszufordern, um den 8. Februar 12 um 20:27 zu bitten, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Du musst einen Zustand halten und du brauchst einen Tuning-Parameter. Dies fordert eine kleine Klasse (vorausgesetzt, du bist mit Java 5 oder höher): Instantiieren Sie mit dem Zerfallsparameter, den Sie wollen (kann die Abstimmung zwischen 0 und 1) und dann mit durchschnittlichen () zu filtern. Beim Lesen einer Seite auf einige mathematische Wiederholung, alles, was Sie wirklich wissen müssen, wenn es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben. (Sie haben auch ein paar andere Notationen, was nicht hilft.) Allerdings ist die EMA ziemlich einfach, da man sich nur an einen alten Wert erinnern muss, keine komplizierten Zustand Arrays erforderlich. Antwortete Feb 8 12 um 20:42 TKKocheran: Ziemlich viel. Isn39t es schön, wenn es einfach sein kann (wenn man mit einer neuen Sequenz beginnt, bekomme du einen neuen Mittelwert.) Beachten Sie, dass die ersten paar Begriffe in der gemittelten Sequenz ein bisschen wegen der Brenneffekte umgehen werden, aber man bekommt diese mit anderen gleitenden Durchschnitten auch. Allerdings ist ein guter Vorteil, dass man die gleitende durchschnittliche Logik in den Mittelalter einpacken und experimentieren kann, ohne den Rest deines Programms zu stark zu stören. Ndash Donal Fellows Feb 9 12 at 0:06 Ich habe eine harte Zeit, Ihre Fragen zu verstehen, aber ich werde versuchen, trotzdem zu antworten. 1) Wenn dein Algorithmus 0,25 statt 0,36 gefunden hat, dann ist es falsch Es ist falsch, weil es eine monotone Zunahme oder Abnahme annimmt (das geht immer nach oben oder immer nach unten). Es sei denn, du durchschnittst alle deine Daten, deine Datenpunkte - wie du sie präsentierst - sind nichtlinear. Wenn Sie wirklich wollen, um den maximalen Wert zwischen zwei Punkten in der Zeit zu finden, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie die max dieser Subarray. 2) Nun ist das Konzept der gleitenden Durchschnitte sehr einfach: Stellen Sie sich vor, dass ich die folgende Liste habe: 1.4, 1.5, 1.4, 1.5, 1.5. Ich kann es glatt machen, indem ich den Durchschnitt von zwei Zahlen: 1.45, 1.45, 1.45, 1.5. Beachten Sie, dass die erste Zahl ist der Durchschnitt von 1,5 und 1,4 (zweite und erste Zahlen) die zweite (neue Liste) ist der Durchschnitt von 1,4 und 1,5 (dritte und zweite alte Liste) die dritte (neue Liste) der Durchschnitt von 1,5 und 1,4 (Vierte und dritte) und so weiter. Ich hätte es mal drei oder vier machen können, oder n. Beachten Sie, wie die Daten viel glatter sind. Ein guter Weg, um gleitende Durchschnitte bei der Arbeit zu sehen, ist, zu Google Finance zu gehen, eine Aktie auszuwählen (Tesla Motors ziemlich flüchtig (TSLA) auszuprobieren) und klicken Sie auf die Technik am unteren Rand des Diagramms. Wählen Sie Moving Average mit einem bestimmten Zeitraum und Exponential gleitenden Durchschnitt, um ihre Unterschiede zu vergleichen. Exponentieller gleitender Durchschnitt ist nur eine weitere Ausarbeitung von diesem, aber gewichtet die älteren Daten weniger als die neuen Daten ist dies ein Weg, um die Glättung nach hinten voranzutreiben. Bitte lesen Sie den Wikipedia-Eintrag. Also, das ist mehr ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu winzig. Viel Glück. Wenn du Schwierigkeiten mit der Mathematik hast, könntest du mit einem einfachen gleitenden Durchschnitt anstatt exponentiell gehen. Also die Ausgabe, die du bekommst, wäre die letzten x Begriffe geteilt durch x. Ungetesteter Pseudocode: Beachten Sie, dass Sie die Start - und Endteile der Daten behandeln müssen, da Sie deutlich die letzten 5 Begriffe haben, wenn Sie auf Ihrem 2. Datenpunkt sind. Auch gibt es effizientere Möglichkeiten, diesen gleitenden Durchschnitt zu berechnen (Summsumme - älteste neueste), aber das ist es, das Konzept zu bekommen, was passiert. Antwortete am 8. Februar 12 um 20: 41Im in den Prozess der Schaffung eines Forex Trading-Algorithmus und wollte meinen Schuss bei der Berechnung EMA (Exponential Moving Averages) zu versuchen. Meine Ergebnisse scheinen korrekt zu sein (im Vergleich zu den Berechnungen, die ich von Hand gemacht habe), so glaube ich, dass die folgende Methode funktioniert, aber wollte nur einen zusätzlichen Satz von Augen bekommen, um sicherzustellen, dass ich nichts fehlt. Beachten Sie, dass dies nur die EMA für den neuesten Preis zurückgibt, gibt es nicht ein Array von EMAs als das nicht was ich für meine Anwendung benötige. Rekursion ist ein gutes Werkzeug für den richtigen Job, aber hier wird es verwendet, um einfaches Looping zu erreichen. Als solche der Code. Ist schwer zu lesen und zu begründen. Ist langsamer, weil viel von dem Code in ema nur einmal laufen muss. Wird mit groß genug Wert des Fensters wegen überlaufenden Pythons Call Stack fehlschlagen. Bitte dokumentieren Sie mindestens die Parameter jeder Funktion, zB. Dieses Fenster ist die Länge des Fensters, und diese Position zählt rückwärts vom Ende der Daten. (In der Tat wäre es klarer, wenn Position ein normaler Vorwärtsindex in Daten wäre) Heben Sie eine Ausnahme an, wenn Sie einen Parameter einen ungültigen Wert finden. Das Zurückgeben von keinem wird nur eine verwirrende Ausnahme später verursachen. In der Tat, wenn ich versucht Indikatoren (). Ema (closeprices, 600) Ich bekomme unendliche Rekursion, weil sma zurückgibt Keine. Was macht ema rufen sma immer und immer wieder. Der vorherige Punkt zeigt auch, dass wenn len (Daten) lt Fenster 2 nicht die richtige Gültigkeitsprüfung ist. Die 1 in data-window2 1: - window 1 scheint mir nicht richtig zu sein. Ich nehme an, du willst data-window2: - window Die Anweisung return previousema ist an einem seltsamen Ort, weil an diesem Punkt haben Sie eine neue currentema berechnet. Dies ist der Grundfall der Rekursion, und es ist üblich, den Basisfall zuerst zu behandeln. Mein Vorschlag für ema: antwortete Nov 26 14 um 18:56 Hübsche flache Bewertung: Du brauchst nicht eine Klasse für das zu schreiben, was du tust (und ich schlage vor, dass du einen Blick auf dieses Video hast). Ihre Klasse verkapselt keine Daten und Sie verwenden sie einfach, um Ihre Funktionen in der gleichen Entität zu haben. Ich denke, die Dinge würden einfacher zu verstehen, wenn Sie klassifizieren würde, um es offensichtlich zu machen, dass Sie sich nicht wirklich auf irgendeine Instanz verlassen. Allerdings wäre eine noch bessere Option, nur Funktionen in einem Indikator-Modul zu definieren. Antwortete am 24. November 14 um 18:04 Vielen Dank für die Anregungen, die ich eigentlich hatte sie als Klassenmethoden und diskutiert hin und her zwischen sogar mit einer Klasse oder einfach nur definieren Funktionen in einem Indikator-Modul (was ich jetzt tun). Ndash ChrisC Nov 25 14 at 19:12 Nur das Video zu sehen, tolle Sachen. Ndash ChrisC Nov 25 14 at 19:43 Ihre Antwort 2017 Stack Exchange, IncI müssen die letzten 7 Tage Arbeitsstunden in einer flachen Datei Leseschleife zu verfolgen. Es wird verwendet, um die Ermüdbarkeit der Arbeit zu beheben. Im Moment habe ich etwas, das funktioniert, aber es scheint ziemlich ausführlich und ich bin nicht sicher, ob theres ein Muster, das mehr prägnant ist. Derzeit habe ich eine Java-Klasse mit einem statischen Array, um die letzten x Tage Daten zu halten, dann, wie ich durch die Datei lese, hacke ich das erste Element und verschiebe das andere 6 (für eine Woche rollende Summe) zurück um eins. Die Verarbeitung dieses statischen Arrays erfolgt in seiner eigenen Methode, dh. Meine Frage: Ist das eine vernünftige Design-Ansatz, oder gibt es etwas blendend offensichtlich und einfach, diese Aufgabe zu tun Danke Jungs fragten Aug 30 11 um 14:33 Danke alot Jungs: I39ve bekam die Nachricht: Verwenden Sie ein übergeordnetes Objekt und nutzen Sie die Relevante Methoden oder einen Kreispuffer. Tolle Antworten, alle von ihnen. Wenn du darüber nachdenkst, brauchst du immer Zugriff auf das gesamte Array, so dass du diesen ersten Eintrag loswerden kannst - was ich mir nicht ganz sicher war. Ich entschuldigte mich, dass ich nicht ein paar Liner verpasst hatte und war im Grunde genommen eine vernünftige, wenn nicht effiziente und knappe Spur. Das ist es, was ich an dieser Seite liebe: hochwertige, relevante Antworten von Leuten, die ihre Sht kennen. Ndash Pete855217 Aug 30 11 at 15:05 Warum initialisieren Sie runningTotal auf null Was ist sein Typ Wo es deklariert ist Es wäre gut, wenn man einige Code-Samples passt, die dem tatsächlichen Java-Code ähneln. Wenn du fortfährst, wäre meine Kritik die folgende: Deine Funktion ist zu viel. Eine Funktion oder Methode sollte zusammenhängend sein. Genauer gesagt, sollten sie nur eins und nur eins tun. Noch schlimmer, was passiert in deiner for-Schleife, wenn x 5 Du kopierst runningTotal6 in runningTotal5. Aber dann haben Sie zwei Kopien des gleichen Wertes an Position 5 und 6. In Ihrem Design, Ihre Funktion movesshuffles die Elemente in Ihrem Array berechnet die Gesamtausdruck Zeug auf Standard-Fehler gibt die Summe Es ist zu viel. Mein erster Vorschlag ist nicht, Sachen herum in der Array zu bewegen. Stattdessen implementiere ich einen kreisförmigen Puffer und verwende ihn statt des Arrays. Es wird Ihr Design zu vereinfachen. Mein zweiter Vorschlag ist, Dinge in Funktionen zusammenzufassen, die zusammenhängen: haben eine Datenstruktur (ein kreisförmiger Puffer), die es Ihnen erlaubt, es hinzuzufügen (und das fällt den ältesten Eintrag, wenn es seine Kapazität erreicht.) Haben die Datenstruktur implementieren Interator haben eine Funktion, die die Summe auf dem Iterator berechnet (Sie interessieren sich nicht, wenn Sie die Summe aus einem Array, einer Liste oder einem kreisförmigen Bufer berechnen.) Nennen Sie es nicht total. Nennen Sie es Summe, was ist das, was Sie rechnen. Das ist, was Id tun :) That39s super Info Luis, aber denken Sie daran, diese Funktion ist ein kleiner Teil der Funktionalität der Klasse, und es wäre übertrieben, um zu viel Code hinzufügen, um es perfekt zu machen. Sie sind technisch korrekt, und ich verstehe, dass mein Code 39 zu viel39 ist, aber zur gleichen Zeit manchmal ist es besser, auf der Seite des kleineren, klareren Codes zu irren, als für Perfektion zu gehen. Angesichts meiner Java-Fähigkeiten, sogar die Pseudocode Sie beschreiben Kompilieren würde ich blasen mein Budget auf diesem (), aber danke für die klare Beschreibung. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, es geht nicht um Perfektion, sondern um etablierte industrielle Praktiken, die wir für die letzten 3 Jahrzehnte kennen. Sauberer Code ist immer einer, der partitioniert ist. Wir haben jahrzehntelange Beweise dafür, dass dies der Weg ist, in den allgemeinen Fall zu gehen (in Bezug auf Kosteneffizienz, Defektreduktion, Verständnis usw.). Es sei denn, es ist wegwerfen Code für eine einmalige Art von Ding. Es ist niemals kostspielig, dies zu tun, wenn man auf diese Weise irgendeine Problemanalyse startet. Codierung 101, brechen das Problem und der Code folgt, weder Overkill noch schwierig) ndash luis. espinal Ihre Aufgabe ist zu einfach und die Vorwürfe, die Sie adoptiert haben, ist sicherlich gut für den Job. Allerdings, wenn Sie ein besseres Design verwenden möchten, müssen Sie loszuwerden, alle diese Nummer Bewegung Sie besser verwenden eine FIFO-Warteschlange und machen gute Nutzung von Push-und Pop-Methoden, die Art und Weise der Code nicht reflektieren jede Datenbewegung, nur die beiden logischen Aktionen Von neuen Daten und entfernen Sie Daten älter als 7 Tage. Antwortete Aug 30 11 um 14:49

No comments:

Post a Comment