Friday 29 September 2017

Einfach Beweglich Durchschnittlich Java


Eine einfache umgehende durchschnittliche Implementierung in Java Bei mehreren Gelegenheiten wollte ich einfache Metriken in meinen Java-Anwendungen berechnen, zB die Anzahl der Treffer pro Stunde oder Fehler während eines Zeitraums. Während die Berechnung einfacher Metriken ist nicht schrecklich schwierig, seine nur zusätzliche Arbeit und Id eher verbringen diese Zeit auf der Problem-Domain. Ich war überrascht, keine weithin akzeptierten Lösungen für Metriken in Java zu finden. Ich fand Metriken, aber es schien ein bisschen zu kompliziert und nicht gut dokumentiert - Alles, was ich wirklich wollte, war, einen gleitenden Durchschnitt zu berechnen. Ich dachte über das Problem etwas mehr und entschied es nicht ein schwieriges Problem. Heres meine Lösung Dies funktioniert durch die Schaffung einer Reihe von Fenster Update-Frequenz Größe, dann ein Thread setzt die Zählung auf den nächsten Index in das Array auf der Update-Frequenz. Die Zählung für das Intervall ist einfach arrayi - arrayi1, das ist die jüngste Zählung abzüglich der ältesten Zählung. Für ein 10-Minuten-Intervall ist die älteste Zählung (i1) genau 10 Minuten alt. Um einen gleitenden Durchschnitt zu unserem Code hinzuzufügen, bedarf es eines Counters, mit AtomicLong. Dieser Zähler sollte auf der Grundlage der von Ihnen interessierten Ereignisse inkrementiert werden (z. B. POST-Anforderungen für einen REST-Dienst). Wir müssen die Implementierung mit Zugriff auf den Zähler versehen und das wird über die GetCount-Schnittstelle erreicht. Hier schaffen wir einen gleitenden Durchschnitt mit einem 5-Minuten-Fenster, das jede Sekunde aktualisiert. Und um den aktuellen Durchschnitt zu erhalten, rufen wir einfach die getAverage-Methode an: Ein wichtiges Implementierungsdetail ist, wie die Arraygröße bestimmt wird: indem man das Fenster durch die Aktualisierungsfrequenz teilt. So kann ein großes Fenster mit einer häufigen Aktualisierungshäufigkeit eine beträchtliche Menge an Speicher verbrauchen. In diesem Beispiel ist die Array-Größe vernünftig 300. Wenn wir jedoch einen 24-Stunden-Gleitender Durchschnitt mit einem Intervall von 1 Sekunde erstellt haben, wäre die Größe 86400 A Eine vernünftigere Aktualisierungsfrequenz für einen Zeitraum von 24 Stunden könnte alle 5 Minuten (Arraygröße von 288) liegen ). Eine weitere Betrachtung der Wahl des Fensters und der Aktualisierungshäufigkeit ist, dass das Fenster durch die Frequenz teilbar sein muss. Zum Beispiel ist ein 2-Minuten-Fenster mit einer 6-Sekunden-Update-Frequenz ok, aber eine 7-Sekunden-Update-Frequenz ist nicht, da es nicht durch 120 teilbar ist. Eine IllegalArgumentException wird ausgelöst, wenn die Fenstermodul-Aktualisierungsfrequenz nicht Null ist. Diese Implementierung erfordert einen Thread pro gleitenden Durchschnitt, was nicht sehr effizient ist. Eine bessere Lösung wäre, einen Faden über viele Durchschnitte zu teilen. Aktualisieren. Ive aktualisiert den Code, um einen Thread hier zu teilen. Schließlich gibt es ein Anfangszustandproblem: Wir haben noch keine Daten für das ganze Fenster. Zum Beispiel, wenn Sie ein 5 Minuten Fenster und nur 15 Sekunden Daten haben. Diese Implementierung gibt null zurück, bis wir 5 Minuten Daten haben. Ein weiterer Ansatz ist, den Durchschnitt zu schätzen. Angenommen, wir haben eine Anzahl von 10 in 30 Sekunden, dann können wir den Durchschnitt als 40 in 2 Minuten abschätzen. Allerdings besteht die Gefahr eines erheblichen Fehlers durch die Extrapolation von unvollständigen Daten. Zum Beispiel, wenn wir einen Ausbruch von 20 Hits in 2 Sekunden, wed schätzen 1200 pro 2 Minuten, was in aller Wahrscheinlichkeit ist weg weg. Ihr Innen für ist Iteration alle Array so thats, warum Sie immer den gleichen Durchschnitt (die Eine für das ganze Array), solltest du von 0 auf die aktuelle Nummer der Außenseite iterieren. Ihr gleitender Durchschnitt wird aktualisiert in j von Ihrem inneren für das bedeutet, dass es überschreibt vorherige Werte jede neue Schleife, sollte dies innerhalb der äußeren für statt der inneren mit i als Index sein. Sie teilen sumj, um Mittelwerte zu berechnen, jede neue innere Schleife j Sie teilen durch 0 die erste Summe. Ich glaube, Sie wollten j1 stattdessen verwenden, der Index ist nicht der gleiche wie die aktuelle Länge Tipps zur Fehlerbehebung: Vermeiden Sie die Verwendung von Variablen zu Loop-Arrays, sollten Sie stattdessen array. length verwenden. Für eine Frage der Reproduktion deines Problems kannst du uns das isolierte Problem anstelle deines aktuellen Codes geben. Dh: Stellen Sie sich vor, wenn der Fehler in Ihren Eingaben ist, wie könnten wir glauben, dass Sie sie wirklich benutzt haben, antworteten sie. Sie sollten für (int j (igtaverageLengthi-averageLength2: 0) jlt iaverageLength2 ampamp jltnumDataPoints j) (oder etwas ähnliches) für Ihren innersten Durchschnitt haben. Außerdem sollte movingAverageisumj modifiziert werden, um den Fall zu behandeln, wenn j 0 ist. Insbesondere sollte es sich wahrscheinlich bewegen. AutomatisumaverageLength und sollte auf den movingAveragei-Steckplatz außerhalb der Mittelungsschleife angewendet werden. Antwortete 4. Oktober 13 um 20:42 Nächstes Mal, nehmen Sie die Kommentare über die Aufgabe aus der Frage, bevor Sie es posten. Aber da du hier ziemlich neu scheinst, denk daran, wie du die Daten durchlaufen würdest und das machst. Sie sollten versuchen, sicherzustellen, dass jede Schleife an der richtigen Stelle anhält, und denken Sie daran, dass, wenn Sie aufhören würden, wenn es keine Zahlen mehr gibt (wie wenn Sie die innere Schleife machen und Sie können nur 3 weitere Zahlen anstelle von 4) Das Programm muss auch aufhören. Stellen Sie sicher, dass Ihr Code dies überprüft. Antwortete 4. Oktober 13 um 20:56 Ohne weitere Details brauchst du wahrscheinlich einen ungewichteten gleitenden Durchschnitt. An jedem Punkt Ai im Eingangsfeld A der Länge N (mit 0ltiltN), das ist einfach der Mittelwert der vorherigen K Einträge des Arrays bis zu und einschließlich Ai. Wenn dort arte K solche Werte sind, dann durchschnittlich die (i1) Werte von A0 bis Ai. Inklusive. Ein bisschen Gedanken zeigen Ihnen, dass Sie nicht alle K-Werte jedes Mal addieren müssen. Halten Sie einfach die Summe, und wenn Sie zum nächsten Punkt gehen (dies ist ein gleitender Durchschnitt), subtrahieren Sie den Wert, der ersetzt wird, und fügen Sie den neuen Wert hinzu, der es ersetzen wird. (Während der ersten K-1 Punkte addierst du einfach den neuen Wert in die Summe und erhöhe deinen Zähler um 1.) An jedem Punkt in diesem Prozess ist der gleitende Durchschnitt die aktuelle Summe, dividiert durch den aktuellen Zählwert. Antwortete Okt 4 13 at 21:05 In einem gleitenden Durchschnitt, müssen Sie eine Art Fenstergröße haben. Ihre Fenstergröße ist durchschnittlich, so dass es so aussieht wie folgt: Die for-Schleife startet bei den aktuellen Daten und geht zurück durchschnittlichLängen-Datenpunkte und fügt sie hinzu. Sie haben nur einen gleitenden Durchschnitt, wenn Sie haben, wenn Sie genug Datenpunkte haben und der Durchschnitt wird die Summe geteilt durch die durchschnittliche Länge. Hinweis: Nicht getestet nur Sudo-Code, aber das ist die Idee. Antwortete 4. Oktober 13 um 21:05 Ihre Antwort 2017 Stack Exchange, IncMoving Durchschnitt - MA BREAKING DOWN Moving Average - MA Als SMA Beispiel, betrachten Sie eine Sicherheit mit den folgenden Schlusskurse über 15 Tage: Woche 1 (5 Tage) 20, 22 , 24, 25, 23 Woche 2 (5 Tage) 26, 28, 26, 29, 27 Woche 3 (5 Tage) 28, 30, 27, 29, 28 Ein 10-Tage-MA würde die Schlusskurse für den ersten ausgleichen 10 Tage als erster Datenpunkt. Der nächste Datenpunkt würde den frühesten Preis fallen lassen, den Preis am Tag 11 hinzufügen und den Durchschnitt nehmen, und so weiter wie unten gezeigt. Wie bereits erwähnt, verbleiben MAs die derzeitige Preisaktion, weil sie auf vergangenen Preisen basieren, je länger der Zeitraum für die MA ist, desto größer ist die Verzögerung. So wird ein 200-Tage-MA ein viel größeres Maß an Verzögerung haben als ein 20-Tage-MA, weil es Preise für die letzten 200 Tage enthält. Die Länge der MA zu verwenden hängt von den Handelszielen ab, wobei kürzere MAs für kurzfristige Handels - und längerfristige MAs für langfristige Investoren besser geeignet sind. Die 200-Tage-MA ist weithin gefolgt von Investoren und Händlern, mit Pausen über und unter diesem gleitenden Durchschnitt als wichtige Handelssignale. MAs vermitteln auch eigene Handelssignale, oder wenn zwei Durchschnitte kreuzen. Eine aufsteigende MA zeigt an, dass die Sicherheit in einem Aufwärtstrend ist. Während eine abnehmende MA anzeigt, dass es sich in einem Abwärtstrend befindet. Ebenso wird die Aufwärtsbewegung mit einem bullish Crossover bestätigt. Die auftritt, wenn ein kurzfristiges MA über einen längerfristigen MA kreuzt. Abwärts-Impuls wird mit einem bärigen Crossover bestätigt, der auftritt, wenn ein kurzfristiges MA unter einem längerfristigen MA übergeht.

No comments:

Post a Comment