Tuesday, 27 June 2017

Exponentiell Gleitender Durchschnitt Code In Java


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: 41März 29., 2014 von Ryan Hamilton Let8217s sehen, wie man gleitende durchschnittliche Analytik in q für die kdb-Datenbank zu schreiben. Als Beispieldaten (mcd. csv) werden wir Aktienkursdaten für McDonalds MCD verwenden. Der unten genannte Code lädt historische Bestandsdaten für MCD herunter und platziert sie in die Tabelle t: Einfacher Moving Average Der einfache gleitende Durchschnitt kann verwendet werden, um schwankende Daten zu glätten, um die Gesamttrends und Zyklen zu identifizieren. Der einfache gleitende Durchschnitt ist der Mittelwert der Datenpunkte und gewichtet jeden Wert in der Berechnung gleichermaßen. Zum Beispiel, um den gleitenden Durchschnittspreis einer Aktie für die letzten zehn Tage zu finden, fügen wir einfach den Tagespreis für diese zehn Tage hinzu und teilen sich um zehn. Dieses Fenster der Größe zehn Tage bewegt sich dann über die Daten, mit den Werten innerhalb des Fensters, um den Durchschnitt zu finden. Hier8217s der Code in kdb für 1020 Tag gleitenden Durchschnitt und die resultierende Diagramm. Einfache Verschiebung Durchschnittliche Aktien Chart Kdb (Produziert mit qStudio) Was Exponential Moving Average ist und wie es zu berechnen Eines der Probleme mit dem einfachen gleitenden Durchschnitt ist, dass es jeden Tag eine gleichgewichtige Gewichtung gibt. Für viele Zwecke macht es mehr Sinn, den neueren Tagen eine höhere Gewichtung zu geben, eine Methode, dies zu tun, ist mit dem Exponential Moving Average. Hierbei handelt es sich um ein exponentiell abnehmendes Gewicht für die in der Vergangenheit liegenden Daten. Die einfachste Form der exponentiellen Glättung ergibt sich aus der Formel: Wo ist der Glättungsfaktor und 0 Diese Tabelle zeigt, wie die verschiedenen GewichteEMAs unter den Werten 1,2,3 berechnet werden , 4,8,10,20 und einem Glättungsfaktor von 0,7. (Excel-Kalkulationstabelle) Um diese Berechnung in kdb durchzuführen, können wir folgendes tun: (Dieser Code wurde ursprünglich in die Google Mail-Liste von Attila geschrieben, die vollständige Diskussion kann hier gefunden werden) Dieser Backslash Adverb funktioniert als Die alternative Syntax verallgemeinert zu Funktionen von 3 oder mehr Argumente, bei denen das erste Argument als Anfangswert verwendet wird und die Argumente entsprechende Elemente aus den Listen sind: Exponential Moving Average Chart Schließlich nehmen wir unsere Formel und wenden sie auf unsere Aktienkursdaten an, so dass wir den exponentiellen gleitenden Durchschnitt sehen können Für zwei verschiedene Glättungsfaktoren: Exponentielle Verschiebung Durchschnittliche Aktienkursdiagramm mit qStudio erstellt Wie Sie mit EMA sehen können, können wir mit einem ausgewählten Glättungsfaktor mehr aktuelle Werte priorisieren, um das Gleichgewicht zwischen aktuellen und historischen Daten zu bestimmen. Das Schreiben von kdb-Analysen wie Exponential Moving Average wird in unserem kdb-Training abgedeckt. Wir bieten regelmäßig Schulungen in London, New York an. Asien oder unser Online-KDB-Kurs steht ab sofort zur Verfügung. 1 Antwort auf 8220Exponential Moving Average EMA in Kdb8221 Danke Ryan, das ist sehr hilfreich. Aber ich denke, es gibt einen Tippfehler in ema8217s Definition, sollte sein: ema: xyJava gleitenden Durchschnitt Methode Wenn Sie auf der Suche nach einer EMA, die für Streaming-Daten optimiert ist, aus einer Datei oder Quoting-Service stammen, wird die folgende Beispielklasse gut machen , Im Gegensatz zu der Verwendung von Brute-Force-Berechnungen. Dieser Ansatz ist besonders nützlich, wenn Sie Daten in Echtzeit verarbeiten. EMAs, ein spezieller Fall von gewichteten gleitenden Durchschnitten, haben den Vorteil, dass die relative Gewichtung für jede aufeinanderfolgende Periode um einen konstanten Faktor f 2 (N1) abnimmt, wobei N die Anzahl der Perioden ist, über die die EMA angewendet werden soll. Angesichts dieser Tatsache können Sie die aktuelle EMA (dh für die aktuelle Periode) mit der folgenden iterativen Formel berechnen: eman fprice (1-f) eman-1 Die folgende Beispielklasse implementiert diese iterative Natur von EMA und minimiert die rechnerischen Anforderungen an brute - Kraftmethoden oder Nachverarbeitungsmethoden. Private int numPeriods 0 private int totalPeriods 0 private double runningEMA 0.0 private double factor 0.0 public EMA (int numPeriods) this. numPeriods numPeriods factor 2.0 (numPeriods 1.0) Rücksetzen von Berechnungen zur Erzeugung von EMA für den angegebenen Zeitraum. Public void reset (int numPeriods) Rückgabewerte EMA für die Periode definiert während des Konstruktors. Wenn verarbeitete Perioden kleiner als der EMA-Bereich sind, wird Null zurückgegeben. Public double calculate (double price) runningEMA factorprice (1-Faktor) runningEMA if (totalPeriods lt numPeriods) Von wo du die Preisdaten kommst und was du mit den EMA-Ergebnissen machst, liegt bei dir. Zum Beispiel, wenn Sie die Preisdaten in einem Array hatten und eine EMA in ein anderes Array berechnen möchten, wird das folgende Snippet funktionieren: doppelte Preise. Aus dem Berechnungen, der Datei oder dem Zitierdienst doppelte ema neue doubleprices. length EMA ema neue EMA (50) 50 Periode EMA für (int idx0 iltprices. length idx) emaidx ema (pricesidx) Viel Glück und beste Wünsche für Ihr Projekt. AveragesSimple Gleitende durchschnittliche DurchschnitteSimple gleitender Durchschnitt Sie werden ermutigt, diese Aufgabe entsprechend der Aufgabenbeschreibung zu lösen, unter Verwendung einer beliebigen Sprache, die Sie kennen können. Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine stateful functionclassinstance, die eine Periode annimmt und gibt eine Routine zurück, die eine Zahl als Argument annimmt und gibt einen einfachen gleitenden Durchschnitt ihrer Argumente so weit zurück. Ein einfacher gleitender Durchschnitt ist ein Verfahren zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten 160 P 160 Zahlen aus dem Strom, 160 wobei 160 P 160 als Periode bekannt ist. Es kann implementiert werden, indem man eine Initialisierungsroutine mit 160 P 160 als Argument, 160 I (P), 160 anruft, die dann eine Routine zurückgeben sollte, die bei Aufruf mit einzelnen, aufeinanderfolgenden Mitgliedern eines Stroms von Zahlen den Mittelwert von (up To), die letzten 160 P 160 von ihnen, nennen wir diese 160 SMA (). Das Wort 160 Stateful 160 in der Aufgabenbeschreibung bezieht sich auf die Notwendigkeit von 160 SMA () 160, sich an bestimmte Informationen zwischen Anrufen zu erinnern: 160 Die Periode, 160 P 160 Ein bestellter Container von mindestens den letzten 160 P 160 Zahlen von jedem von Seine individuellen Anrufe. Stateful 160 bedeutet auch, dass sukzessive Aufrufe zu 160 I (), 160 der Initialisierer, 160 getrennte Routinen, die 160 nicht 160 teilen gespeicherten Zustand, so dass sie auf zwei unabhängige Datenströme verwendet werden könnte, Pseudocode für eine Implementierung von 160 SMA 160 ist: Diese Version verwendet eine persistente Warteschlange, um die aktuellsten p-Werte zu halten. Jede Funktion, die von init-moving-average zurückgegeben wird, hat ihren Zustand in einem Atom, das einen Warteschlangenwert hält. Diese Implementierung verwendet eine kreisförmige Liste, um die Zahlen innerhalb des Fensters am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der gerade aus dem Fenster herausgeht und durch den gerade addierten Wert ersetzt wird. Mit einem Closure bearbeiten Momentan ist dieses sma cant nogc, weil es eine Schließung auf dem Heap zuteilt. Einige Escape-Analysen könnten die Heap-Zuweisung entfernen. Verwenden einer Struct-Edit Diese Version vermeidet die Heap-Zuordnung der Schließung, die die Daten im Stack-Frame der Hauptfunktion hält. Gleiche Ausgabe: Um die Gleitkomma-Annäherungen zu vermeiden, die sich aufhäufen und wachsen, könnte der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei (Funktions-) Objekte, die den Status teilen. Es ist idiomatisch in E, um die Eingabe von der Ausgabe zu trennen (aus dem Schreiben lesen), anstatt sie zu einem Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung von Standard DeviationE. Das Elixir-Programm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode des einfachen gleitenden Durchschnitts verwendet wird. Die Run-Funktion liest numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und überprüft dann das Ergebnis auf STDOUT. Die Ausgabe wird unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage für jeden gleitenden Durchschnitt bildet. Erlang hat Schließungen, aber unveränderliche Variablen. Eine Lösung ist dann die Verwendung von Prozessen und eine einfache Nachricht übergeben basierte API. Matrixsprachen haben Routinen, um die Gleitende für eine gegebene Folge von Gegenständen zu berechnen. Es ist weniger effizient zu schleifen wie in den folgenden Befehlen. Kontinuierlich fordert eine Eingabe an. Die am Ende einer Liste L1 hinzugefügt wird. L1 kann durch Drücken von 2ND1 gefunden werden, und Mittelwert finden Sie in ListOPS Drücken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zurückgibt Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt: Liste ist die Liste, die gemittelt wird: p ist die Periode: 5 gibt die gemittelte Liste zurück: Beispiel 2: Verwenden des Programms movinav2 (i , 5) - Initialisierung der gleitenden Durchschnittsberechnung und Definieren der Periode von 5 movinav2 (3, x): x - neue Daten in der Liste (Wert 3) und Ergebnis wird auf Variable x gespeichert und angezeigt movinav2 (4, x) : X - neue Daten (Wert 4), und das neue Ergebnis wird auf Variable x gespeichert und angezeigt (43) 2. Beschreibung der Funktion movinavg: Variable r - ist das Ergebnis (die gemittelte Liste), die zurückgegeben wird Variable i - ist die Indexvariable und zeigt auf das Ende der Unterliste, in der die Liste gemittelt wird. Variable z - eine Helpervariable Die Funktion verwendet die Variable i, um zu bestimmen, welche Werte der Liste in der nächsten Durchschnittsberechnung berücksichtigt werden sollen. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also müssen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise müssen wir p Elemente betrachten, also wird das erste Element dasjenige sein, das von (i-p1) indiziert wird. Bei den ersten Iterationen aber wird die Berechnung gewöhnlich negativ sein, so dass die folgende Gleichung negative Indizes vermeiden wird: max (i-p1,1) oder die Gleichung, max (i-p, 0) 1. Aber die Anzahl der Elemente auf den ersten Iterationen wird auch kleiner sein, der korrekte Wert wird sein (Endindex - Startindex 1) oder die Gleichung (i - (max (ip, 0) 1) 1) und dann , (I-max (ip, 0)). Die Variable z hält den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) und die Ziffern werden (iz) Mitte (Liste, z1, iz) die Liste der Wert, der gemittelte Summe ( .) Summiert sie Summe (.) (Iz) ri wird sie lokalisieren und das Ergebnis an der entsprechenden Stelle in der Ergebnisliste speichern fp1 erstellt eine Teilanwendung, die den (in diesem Fall) den zweiten und dritten Parameter festlegt

No comments:

Post a Comment