Monday, 12 June 2017

Einfache Umzugsdurchschnitt


Ich weiß, das ist erreichbar mit Schub wie pro: Aber ich möchte wirklich vermeiden, Boost. Ich habe gegoogelt und fand keine geeigneten oder lesbaren Beispiele. Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Stroms von Gleitkommazahlen mit den aktuellsten 1000 Zahlen als Datenmuster verfolgen. Was ist der einfachste Weg, um dies zu erreichen, experimentierte ich mit einem kreisförmigen Array, einem exponentiellen gleitenden Durchschnitt und einem einfacheren gleitenden Durchschnitt und fand, dass die Ergebnisse aus dem kreisförmigen Array meinen Bedürfnissen am besten entsprechen. Gefragt am 12. Juni 12 um 4:38 Wenn Ihre Bedürfnisse einfach sind, können Sie nur versuchen, einen exponentiellen gleitenden Durchschnitt. Setzen Sie einfach, Sie machen eine Akkumulator-Variable, und wie Ihr Code bei jedem Sample sieht, aktualisiert der Code den Akkumulator mit dem neuen Wert. Sie wählen eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen Sie diese: Sie müssen nur einen Wert von Alpha zu finden, wo die Wirkung einer bestimmten Probe nur für etwa 1000 Proben dauert. Hmm, Im nicht wirklich sicher, dass dies für Sie geeignet ist, jetzt, dass Ive es hier. Das Problem ist, dass 1000 ist ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt Im nicht sicher, es gibt ein Alpha, die den Durchschnitt über die letzten 1000 Zahlen, ohne Unterlauf in der Gleitkomma Berechnung zu verbreiten würde. Aber wenn du einen kleineren Durchschnitt wünschst, wie 30 Zahlen oder so, das ist eine sehr einfache und schnelle Möglichkeit, es zu tun. Antwortete Jun 12 12 um 4:44 1 auf deinem Post. Der exponentielle gleitende Durchschnitt kann das Alpha variabel sein. So kann es verwendet werden, um Zeitbasis-Mittelwerte (z. B. Bytes pro Sekunde) zu berechnen. Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde ist, lassen Sie Alpha 1,0 sein. Andernfalls kannst du alpha sein (usecs seit letztem update1000000). Ndash jxh Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Stroms von Gleitkommazahlen mit den aktuellsten 1000 Zahlen als Datenmuster verfolgen. Beachten Sie, dass die unten genannte Gesamtsumme als Elemente als addreplaced, Vermeidung kostspieliger O (N) Traversal, um die Summe zu berechnen - benötigt für die durchschnittliche - on demand. Insgesamt wird ein anderer Parameter von T verwendet, um z. B. Mit einer langen langen, wenn insgesamt 1000 lang s, ein int für char s, oder ein doppeltes bis total float s. Dies ist ein bisschen fehlerhaft, dass Numsamples an INTMAX vorbeikommen könnten - wenn man sich vorstellt, dass man eine langjährige langjährige langwierige Zeit haben könnte. Oder verwenden Sie ein zusätzliches bool Datenelement, um aufzuzeichnen, wenn der Container zum ersten Mal gefüllt wird, während er Numsamples um das Array herumtreibt (am besten dann umbenannt etwas Unschuldiges wie Pos). Antwortete am 12. Juni 12 um 5:19 man geht davon aus, dass der Quanten-Operator (T-Stichprobe) tatsächlich quasi Operator (T-Probe) ist. Ndash oPless Jun 8 14 um 11:52 oPless ahhh. Gut beobachtet. Eigentlich habe ich gedacht, dass es nicht leer ist () (T Probe), aber natürlich könntest du auch immer Notizen verwenden, die du mochst. Werde reden, danke Ndash Tony D Juni 8 14 bei 14: 27Simple Moving Average - SMA BREAKING DOWN Einfacher Moving Average - SMA Ein einfacher gleitender Durchschnitt ist anpassbar, da er für eine andere Anzahl von Zeiträumen berechnet werden kann, einfach durch Hinzufügen des Schlusskurses der Sicherheit Für eine Reihe von Zeiträumen und dann dividiert diese Summe durch die Anzahl der Zeiträume, die den durchschnittlichen Preis der Sicherheit über den Zeitraum gibt. Ein einfacher gleitender Durchschnitt glättet die Volatilität und macht es einfacher, die Preisentwicklung eines Wertpapiers zu sehen. Wenn der einfache gleitende Durchschnitt aufblickt, bedeutet dies, dass der Sicherheitspreis steigt. Wenn es nach unten zeigt, bedeutet dies, dass der Wert der Sicherheit abnimmt. Je länger der Zeitrahmen für den gleitenden Durchschnitt, desto glatter der einfache gleitende Durchschnitt. Ein kürzerfristiger gleitender Durchschnitt ist volatiler, aber sein Lesen ist näher an den Quelldaten. Analytische Bedeutung Durchgehende Durchschnitte sind ein wichtiges analytisches Instrument, um die aktuellen Preisentwicklungen und das Potenzial für eine Veränderung eines etablierten Trends zu identifizieren. Die einfachste Form der Verwendung eines einfachen gleitenden Durchschnittes in der Analyse ist es, um schnell zu identifizieren, ob eine Sicherheit in einem Aufwärtstrend oder Abwärtstrend ist. Ein weiteres beliebtes, wenn auch etwas komplexeres analytisches Werkzeug ist es, ein Paar einfacher gleitender Durchschnitte zu vergleichen, wobei jeder unterschiedliche Zeitrahmen abdeckt. Wenn ein kurzfristiger einfacher gleitender Durchschnitt über einem längerfristigen Durchschnitt liegt, wird ein Aufwärtstrend erwartet. Auf der anderen Seite signalisiert ein langfristiger Durchschnitt über einem kürzeren Durchschnitt eine Abwärtsbewegung im Trend. Beliebte Trading Patterns Zwei beliebte Trading-Muster, die einfache gleitende Durchschnitte verwenden, gehören das Todeskreuz und ein goldenes Kreuz. Ein Todeskreuz tritt auf, wenn der 50-tägige, einfach gleitende Durchschnitt unter dem 200-Tage-Gleitender Durchschnitt liegt. Dies gilt als bärisches Signal, dass weitere Verluste auf Lager sind. Das goldene Kreuz tritt auf, wenn ein kurzfristiger gleitender Durchschnitt über einen langfristig gleitenden Durchschnitt bricht. Verstärkt durch hohe Handelsvolumina, kann dies signalisieren weitere Gewinne sind in store. A Einfache Moving Average Implementation in Java Bei mehreren Gelegenheiten Ive wollte einfache Metriken in meinem Java-Anwendungen, zum Beispiel die Anzahl der Treffer pro Stunde oder Fehler während einer Zeit zu berechnen Periode. 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 weit weg. In Statistiken ein einfacher gleitender Durchschnitt ist ein Algorithmus, der die ungewichteten Mittel der letzten n Proben berechnet . Der Parameter n wird oft als Fenstergröße bezeichnet, da der Algorithmus als ein Fenster betrachtet werden kann, das über die Datenpunkte gleitet. Durch die Verwendung einer rekursiven Formulierung des Algorithmus wird die Anzahl der pro Probe benötigten Operationen auf eine Addition, eine Subtraktion und eine Division reduziert. Da die Formulierung unabhängig von der Fenstergröße n ist. Die Laufzeitkomplexität ist O (1). D. h. konstant. Die rekursive Formel des ungewichteten gleitenden Durchschnitts ist, wo avg der rollende Durchschnitt ist und x einen Datenpunkt darstellt. Also, wenn das Fenster nach rechts schiebt, fällt ein Datenpunkt, der Schwanz, und ein Datenpunkt, der Kopf, bewegt sich ein. Implementierung Eine Implementierung des einfachen gleitenden Durchschnitts muss die folgenden berücksichtigen: Algorithmeninitialisierung Solange Das Fenster ist nicht vollständig mit Werten belegt, die rekursive Formel scheitert. Speicher Der Zugriff auf das Schwanz-Element ist erforderlich, was je nach Ausführung eine Speicherung von n Elementen erfordert. Meine Implementierung verwendet die vorgestellte Formel, wenn das Fenster vollständig mit Werten belegt ist und wechselt ansonsten auf die Formel, die den Mittelwert durch Neuberechnung der Summe der vorherigen Elemente aktualisiert. Beachten Sie, dass dies aufgrund der Gleitkomma-Arithmetik zu numerischen Instabilitäten führen kann. Soweit Speicherverbrauch betroffen ist, verwendet die Implementierung Iteratoren, um Kopf - und Schwanzelemente zu verfolgen. Dies führt zu einer Implementierung mit konstantem Speicherbedarf unabhängig von der Fenstergröße. Hier ist das Update-Verfahren, das das Fenster nach rechts schiebt. In den meisten Sammlungen werden ihre Enumeratoren ungültig, wenn die zugrunde liegende Sammlung geändert wird. Die Implementierung beruht jedoch auf gültigen Enumeratoren. Vor allem in Streaming-basierten Anwendungen muss die zugrunde liegende Sammlung modifiziert werden, wenn ein neues Element eintrifft. Ein Weg, um damit umzugehen ist eine einfache kreisförmige feste Größe Sammlung der Größe n1, die nie ungültig macht seine Iteratoren und abwechselnd fügen Sie ein Element und rufen Shift. Ich wünschte, ich könnte herausfinden, wie man das tatsächlich umsetzen kann, da die Test-Funktion sehr verwirrend für mich ist8230 Muss ich Daten in Array umwandeln, dann laufe SMA sma neue SMA (20, Array) für eine 20-Periode SMA Wie gehe ich damit um Shift () - Funktion Ist es notwendig, Konstruktoren zu implementieren. (Entschuldigen Sie das Durcheinander). Nein, du musst deine Daten nicht in ein Array konvertieren, solange deine Daten IEnumerable1 implementieren und der aufgelistete Typ doppelt ist. Soweit Ihr privates Messaging betroffen ist, müssen Sie das DataRow auf etwas umwandeln, das auf doppelte Werte zählt. Ihr Ansatz funktioniert. Shift, schiebt das Fenster eine Position nach links. Für einen Datensatz von etwa 40 Werten und einer 20 Periode SMA haben Sie 21 Positionen das Fenster passt in (40 8211 20 1). Bei jedem Aufruf von Shift () wird das Fenster um eine Position nach links verschoben und Average () gibt die SMA für die aktuelle Fensterposition zurück. Das ist der ungewichtete Durchschnitt aller Werte im Fenster. Zusätzlich erlaubt meine Implementierung, die SMA zu berechnen, auch wenn das Fenster am Anfang nicht vollständig gefüllt ist. Also im Grunde hoffe das hilft. Weitere Fragen COPYRIGHT NOTICE Christoph Heindl und cheind. wordpress, 2009-2012. Unerlaubte Verwendung und Vervielfältigung dieses Materials ohne ausdrückliche und schriftliche Erlaubnis von diesem Blogs Autor und Besitzer ist streng verboten. Auszüge und Links können verwendet werden, vorausgesetzt, dass ein vollständiger und klarer Kredit an Christoph Heindl und cheind. wordpress mit entsprechender und spezifischer Richtung zum ursprünglichen Inhalt gegeben wird. kürzliche Posts

No comments:

Post a Comment