Exponentieller Wichtiger Moving Average Algorithmus

Ich versuche, den gleitenden Durchschnitt eines Signals zu berechnen. Der Signalwert (ein Doppel) wird zu beliebigen Zeiten aktualisiert. Ich bin auf der Suche nach einem effizienten Weg, um seine Zeit gewichteten Durchschnitt über ein Zeitfenster, in Echtzeit zu berechnen. Ich könnte es selbst tun, aber es ist schwieriger als ich dachte. Die meisten der Ressourcen Ive gefunden über das Internet berechnen gleitenden Durchschnitt des periodischen Signals, aber Mine Updates zu beliebigen Zeit. Kennt jemand gute Ressourcen für die Der Trick ist die folgende: Sie erhalten Updates zu beliebigen Zeiten über void update (int Zeit, float-Wert). Allerdings müssen Sie auch nachverfolgen, wenn ein Update fällt aus dem Zeitfenster, so dass Sie einen Alarm, der bei der Zeit N, die die vorherige Aktualisierung entfernt wird immer wieder in der Berechnung berücksichtigt. Wenn dies in Echtzeit geschieht, können Sie das Betriebssystem anfordern, einen Aufruf einer Methode void dropoffoldestupdate (int time) aufzurufen, die zum Zeitpunkt N aufgerufen werden soll. Wenn es sich um eine Simulation handelt, können Sie keine Hilfe vom Betriebssystem bekommen und müssen dies tun Tun Sie es manuell. In einer Simulation würden Sie Methoden mit der angegebenen Zeit als Argument aufrufen (was nicht mit der Echtzeit korreliert). Eine vernünftige Annahme ist jedoch, dass die Anrufe so gewartet werden, dass die Zeitargumente zunehmen. In diesem Fall müssen Sie eine sortierte Liste der Alarmzeitwerte pflegen und bei jedem Aktualisierungs - und Leseaufruf überprüfen, ob das Zeitargument größer ist als der Kopf der Alarmliste. Während es größer ist, tun Sie die alarmbezogene Verarbeitung (Drop off der ältesten Aktualisierung), entfernen Sie den Kopf und überprüfen Sie erneut, bis alle Alarme vor der angegebenen Zeit verarbeitet werden. Anschließend den Update-Aufruf durchführen. Ich habe bis jetzt angenommen, dass es offensichtlich ist, was Sie für die tatsächliche Berechnung tun würden, aber ich erarbeiten gerade für den Fall. Ich nehme an, Sie haben eine Methode float read (int Zeit), die Sie verwenden, um die Werte zu lesen. Das Ziel ist, diesen Anruf so effizient wie möglich zu machen. So berechnen Sie den gleitenden Durchschnitt nicht jedes Mal, wenn die Lesemethode aufgerufen wird. Stattdessen müssen Sie den Wert der letzten Aktualisierung oder des letzten Alarms vorberechnen und diesen Wert durch ein paar Gleitkommaoperationen anpassen, um die Zeit seit der letzten Aktualisierung zu berücksichtigen. (D. h. eine konstante Anzahl von Operationen, außer dass möglicherweise eine Liste von aufgestauten Alarmen verarbeitet wird). Hoffentlich ist dies klar - das sollte ein ganz einfacher Algorithmus und sehr effizient sein. Weitere Optimierung. Einer der verbleibenden Probleme ist, wenn eine große Anzahl von Updates innerhalb des Zeitfensters auftreten, dann gibt es eine lange Zeit, für die es weder liest noch Updates, und dann ein Lesen oder Update kommt entlang. In diesem Fall ist der obige Algorithmus ineffizient, wenn der Wert für jedes der Aktualisierungen, die herunterfallen, inkremental aktualisiert wird. Dies ist nicht notwendig, weil wir nur kümmern uns um die letzte Aktualisierung über das Zeitfenster so, wenn es einen Weg, um effizient drop off alle älteren Updates, würde es helfen. Um dies zu tun, können wir den Algorithmus ändern, um eine binäre Suche nach Updates durchzuführen, um das neueste Update vor dem Zeitfenster zu finden. Wenn es relativ wenige Updates gibt, die gelöscht werden müssen, dann kann man den Wert für jedes heruntergelassene Update inkremental aktualisieren. Aber, wenn es viele Updates gibt, die gelöscht werden müssen, dann kann man den Wert vom Kratzer neu berechnen, nachdem er weg von den alten Updates. Anhang auf Inkrementelle Berechnung: Ich sollte klären, was ich meine durch inkrementelle Berechnung oben in den Satz zwicken diesen Wert durch ein paar Gleitkomma-Operationen, um für den Ablauf der Zeit seit dem letzten Update. Initiale nicht-inkrementale Berechnung: dann über die relevanten Daten in der Reihenfolge der zunehmenden Zeit iterieren: movingaverage (sum lastupdate timesincelastupdate) / windowlength. Nun, wenn genau ein Update fällt aus dem Fenster, aber keine neuen Updates eintreffen, passen Sie die Summe als: (beachten Sie, es ist Priorupdate, deren Timestamp geändert, um den Beginn der letzten Fenster beginnt). Und wenn genau ein Update in das Fenster eintritt, aber keine neuen Updates abfallen, passen Sie die Summe als an: Wie offensichtlich sein sollte, ist dies eine grobe Skizze, aber hoffentlich zeigt es, wie Sie den Durchschnitt so halten können, dass es O (1) Operationen pro Update ist Auf amortisierte Basis. Aber beachten Sie weitere Optimierung im vorherigen Absatz. Beachten Sie auch Stabilitätsprobleme, auf die in einer älteren Antwort hingewiesen wird, was bedeutet, dass Gleitkomma-Fehler über eine große Anzahl derartiger Inkrementierungsoperationen akkumulieren können, so dass es eine Abweichung von dem Ergebnis der Vollberechnung gibt, die für die Anwendung signifikant ist. Wenn eine Annäherung OK und theres eine minimale Zeit zwischen Proben ist, könnten Sie versuchen, Super-Sampling. Sie haben ein Array, das gleichmäßig beabstandete Zeitintervalle repräsentiert, die kürzer als das Minimum sind, und zu jedem Zeitpunkt die letzte empfangene Probe speichern. Je kürzer das Intervall, desto näher ist der Mittelwert auf den wahren Wert. Der Zeitraum sollte nicht größer als die Hälfte des Minimums sein, oder es besteht die Möglichkeit, eine Stichprobe zu fehlen. Antwortete Dec 15 11 at 18:12 antwortete 15 Dez, um 22:38 Uhr Danke für die Antwort. Eine Verbesserung, die erforderlich wäre, um tatsächlich Quotecachequot den Wert des Gesamtdurchschnitts, so dass wir don39t Schleife die ganze Zeit. Auch kann es ein kleiner Punkt sein, aber wäre es nicht effizienter, ein deque oder eine Liste zu verwenden, um den Wert zu speichern, da wir davon ausgehen, dass die Aktualisierung in der richtigen Reihenfolge kommen wird. Einfügen wäre schneller als in der Karte. Ndash Arthur Ja, Sie könnten den Wert der Summe zwischenspeichern. Subtrahieren Sie die Werte der Proben, die Sie löschen, fügen Sie die Werte der Proben, die Sie einfügen. Auch, ja, ein dequeltpairltSample, Dategtgt könnte effizienter sein. Ich wählte Karte für Lesbarkeit, und die Leichtigkeit der Aufruf der Karte :: upperbound. Wie immer, schreiben Sie den richtigen Code zuerst, dann Profil und messen inkrementelle Änderungen. Ndash Rob Dez 16 11 um 15:00 Hinweis: Anscheinend ist dies nicht der Weg, um dies zu nähern. Lassen Sie es hier als Referenz auf, was ist falsch mit diesem Ansatz. Überprüfen Sie die Kommentare. AKTUALISIERT - basierend auf Olis Kommentar. Nicht sicher über die Instabilität, dass er aber reden. Verwenden Sie eine sortierte Karte der Ankunftszeiten mit Werten. Bei der Ankunft eines Wertes addieren Sie die Ankunftszeit zur sortierten Karte zusammen mit ihrem Wert und aktualisieren Sie den gleitenden Durchschnitt. Warnung dies ist Pseudocode: Dort. Nicht vollständig ausgefuellt, aber Sie bekommen die Idee. Dinge zu beachten. Wie ich schon sagte ist Pseudocode. Youll Notwendigkeit, eine passende Karte zu wählen. Entfernen Sie nicht die Paare, während Sie iterieren, indem Sie den Iterator ungültig machen und müssen wieder neu starten. Siehe Olis Kommentar unten auch. Antwort # 2 am: Dezember 15, 2010, um 12:22 Uhr Dies doesn39t Arbeit: es doesn39t berücksichtigen, welcher Anteil der Fensterlänge jeder Wert für vorhanden ist. Auch dieser Ansatz der Addition und dann Subtraktion ist nur stabil für Ganzzahl-Typen, nicht Floaten. Ndash Oliver Charlesworth OliCharlesworth - sorry Ich habe einige wichtige Punkte in der Beschreibung (doppelt und zeitgewichtet) verpasst. Ich werde aktualisieren. Vielen Dank. Ndash Dennis Dec 15 11 at 12:33 Die Zeitgewichtung ist ein weiteres Problem. Aber das ist nicht das, worüber ich rede. Ich bezog sich auf die Tatsache, dass, wenn ein neuer Wert zuerst das Zeitfenster betritt, sein Beitrag zum Durchschnitt minimal ist. Ihr Beitrag steigt, bis ein neuer Wert eintritt. Ndash Oliver Charlesworth Dez 15 11 um 12: 35Dieser Repo bietet exponentiell gewichtete Moving Average Algorithmen, oder EWMAs kurz, basierend auf unserem Quantifying Abnormal Behavior talk. Exponentiell gewichteter gleitender Durchschnitt Ein exponentiell gewichteter gleitender Durchschnitt ist ein Weg, um kontinuierlich einen Durchschnittswert für eine Reihe von Zahlen zu berechnen, wenn die Zahlen ankommen. Nachdem ein Wert in der Reihe dem Durchschnitt hinzugefügt worden ist, nimmt sein Gewicht im Durchschnitt exponentiell über die Zeit ab. Dies verzögert den Durchschnitt auf jüngere Daten. EWMAs sind aus mehreren Gründen von Nutzen, vor allem von ihren kostengünstigen Rechen - und Speicherkosten, sowie der Tatsache, dass sie die jüngste zentrale Tendenz der Wertereihe darstellen. Der EWMA-Algorithmus erfordert einen Abklingfaktor, alpha. Je größer die Alpha, desto mehr ist der Durchschnitt in Richtung der jüngsten Geschichte voreingenommen. Das Alpha muß zwischen 0 und 1 liegen und ist typischerweise eine ziemlich kleine Zahl, wie 0,04. Wir diskutieren die Wahl von alpha später. Der Algorithmus arbeitet also im Pseudocode: Multiplizieren Sie die nächste Zahl in der Reihe mit alpha. Multiplizieren Sie den aktuellen Wert des Durchschnitts um 1 minus alpha. Fügen Sie das Ergebnis der Schritte 1 und 2 hinzu, und speichern Sie es als neuen aktuellen Wert des Durchschnitts. Wiederholen Sie für jede Zahl in der Reihe. Es gibt spezielle Verhaltensweisen für das Initialisieren des aktuellen Wertes, und diese variieren zwischen den Implementierungen. Eine Annäherung ist, mit dem ersten Wert in der Reihe zu beginnen, ist, die ersten 10 oder so Werte in der Reihe unter Verwendung eines arithmetischen Mittelwertes zu messen und dann die inkrementale Aktualisierung des Durchschnittes zu beginnen. Jede Methode hat Vor-und Nachteile. Es kann helfen, ihn bildhaft zu betrachten. Angenommen, die Serie hat fünf Zahlen, und wir wählen alpha 0,50 für die Einfachheit. Heres die Serie, mit Zahlen in der Nähe von 300. Jetzt können wir den gleitenden Durchschnitt dieser Zahlen. Zuerst setzen wir den Mittelwert auf den Wert der ersten Zahl. Als nächstes multiplizieren wir die nächste Zahl mit alpha, multiplizieren den aktuellen Wert mit 1-alpha und addieren sie, um einen neuen Wert zu erzeugen. Das geht weiter, bis wir fertig sind. Beachten Sie, dass jeder der Werte in der Serie jedes Mal um die Hälfte abfällt, wenn ein neuer Wert hinzugefügt wird und der obere Teil der Balken im unteren Teil des Bildes die Größe des gleitenden Durchschnitts darstellt. Es ist ein geglättetes oder Tiefpass-Mittel der ursprünglichen Serie. Man betrachte einen gleitenden gleitenden Durchschnitt mit fester Grße (nicht einen exponentiell gewichteten gleitenden Durchschnitt), der im Mittel über den vorhergehenden N Abtastwerten liegt. Was ist das Durchschnittsalter der einzelnen Proben Es ist N / 2. Nehmen wir nun an, Sie möchten eine EWMA konstruieren, deren Muster das gleiche Durchschnittsalter haben. Die Formel für die Berechnung des hierfür erforderlichen Alphas lautet: alpha 2 / (N1). Beweis ist in dem Buch Production and Operations Analysis von Steven Nahmias. Wenn Sie z. B. eine Zeitreihe mit Samples pro Sekunde haben und den gleitenden Durchschnitt über die vorhergehende Minute erhalten möchten, sollten Sie ein Alpha von .032786885 verwenden. Dies ist übrigens die konstante Alpha für diese Repositories SimpleEWMA verwendet. Dieses Repository enthält zwei Implementierungen des EWMA-Algorithmus mit unterschiedlichen Eigenschaften. Die Implementierungen entsprechen alle der MovingAverage-Schnittstelle und der Konstruktor gibt diesen Typ zurück. Aktuelle Implementierungen gehen von einem impliziten Zeitintervall von 1,0 zwischen jeder hinzugefügten Probe aus. Das heißt, der Ablauf der Zeit wird so behandelt, als sei er der gleiche wie der Eintritt der Proben. Wenn Sie einen zeitbasierten Zerfall benötigen, wenn Proben nicht genau in festgelegten Intervallen ankommen, wird dieses Paket Ihre derzeitigen Bedürfnisse nicht unterstützen. Ein SimpleEWMA ist für geringen CPU - und Speicherverbrauch ausgelegt. Es wird aus verschiedenen Gründen ein anderes Verhalten als das VariableEWMA haben. Es hat keine Aufwärmphase und verwendet einen konstanten Zerfall. Diese Eigenschaften lassen es weniger Speicher. Es wird sich auch anders verhalten, wenn es gleich Null ist, was als uninitialisiert angenommen wird. Wenn also ein Wert wahrscheinlich im Laufe der Zeit tatsächlich Null wird, dann wird ein ungleicher Wert einen scharfen Sprung statt einer kleinen Änderung verursachen. Im Gegensatz zu SimpleEWMA unterstützt dies ein benutzerdefiniertes Alter, das gespeichert werden muss und somit mehr Speicher benötigt. Es hat auch eine Aufwärmzeit, wenn Sie mit dem Hinzufügen von Werten beginnen. Es wird einen Wert von 0,0 melden, bis Sie die erforderliche Anzahl von Samples hinzugefügt haben. Er speichert die Anzahl der hinzugefügten Samples. Infolgedessen verwendet es ein wenig mehr als das Doppelte der Erinnerung an SimpleEWMA. Die GoDoc-generierte Dokumentation finden Sie hier. Wir akzeptieren nur Pull-Anfragen für kleinere Korrekturen oder Verbesserungen. Dies beinhaltet: Kleine Bugfixes Typos Dokumentation oder Kommentare Bitte öffnen Sie Probleme, um neue Funktionen zu besprechen. Anfragen für neue Features werden abgelehnt, daher empfehlen wir, das Repository zu forkeln und Änderungen an Ihrer Gabel für Ihren Anwendungsfall vorzunehmen. Dieses Repository ist Copyright (c) 2013 VividCortex, Inc. Alle Rechte vorbehalten. Es ist lizenziert unter der MIT-Lizenz. Bitte beachten Sie die LIZENZ-Datei für gültige Lizenzbestimmungen. Der EWMA-Ansatz hat ein attraktives Merkmal: Er benötigt relativ wenig gespeicherte Daten. Um unsere Schätzung an jedem Punkt zu aktualisieren, benötigen wir nur eine vorherige Schätzung der Varianzrate und des jüngsten Beobachtungswertes. Ein weiteres Ziel der EWMA ist es, Veränderungen in der Volatilität nachzuvollziehen. Für kleine Werte beeinflussen jüngste Beobachtungen die Schätzung zeitnah. Für Werte, die näher an einem liegen, ändert sich die Schätzung langsam auf der Grundlage der jüngsten Änderungen in den Renditen der zugrundeliegenden Variablen. Die von JP Morgan erstellte und öffentlich zugängliche RiskMetrics-Datenbank nutzt die EWMA zur Aktualisierung der täglichen Volatilität. WICHTIG: Die EWMA-Formel geht nicht von einem lang anhaltenden durchschnittlichen Varianzniveau aus. So bedeutet das Konzept der Volatilität Reversion nicht von der EWMA erfasst. Die ARCH / GARCH Modelle sind dafür besser geeignet. Ein sekundäres Ziel der EWMA ist es, Veränderungen in der Volatilität nachzuvollziehen, so dass für kleine Werte die jüngsten Beobachtungen die Schätzung sofort beeinflussen, und für Werte, die näher bei 1 liegen, ändert sich die Schätzung langsam auf die jüngsten Änderungen in den Renditen der zugrunde liegenden Variablen. Die RiskMetrics-Datenbank (erstellt von JP Morgan), die 1994 veröffentlicht wurde, verwendet das EWMA-Modell zur Aktualisierung der täglichen Volatilitätsschätzung. Das Unternehmen festgestellt, dass über eine Reihe von Marktvariablen, gibt dieser Wert der Prognose der Varianz, die am nächsten zu realisierten Varianz Rate kommen. Die realisierten Varianzraten an einem bestimmten Tag wurden als gleichgewichteter Durchschnitt der folgenden 25 Tage berechnet. Um den optimalen Wert von lambda für unseren Datensatz zu berechnen, müssen wir die realisierte Volatilität an jedem Punkt berechnen. Es gibt mehrere Methoden, so wählen Sie ein. Als nächstes wird die Summe der quadratischen Fehler (SSE) zwischen der EWMA-Schätzung und der realisierten Volatilität berechnet. Schließlich minimieren die SSE durch Variieren des Lambdawertes. Klingt einfach Es ist. Die größte Herausforderung besteht darin, einen Algorithmus zur Berechnung der realisierten Volatilität zu vereinbaren. Zum Beispiel wählten die Leute bei RiskMetrics die folgenden 25 Tage, um die realisierte Varianzrate zu berechnen. In Ihrem Fall können Sie einen Algorithmus wählen, der Tägliche Volumen-, HI / LO - und / oder OPEN-CLOSE Preise nutzt. Q 1: Können wir EWMA verwenden, um die Volatilität mehr als einen Schritt voraus zu schätzen (oder prognostizieren) Die EWMA-Volatilitätsdarstellung setzt keine langfristige Durchschnittsvolatilität voraus, so dass die EWMA für jeden Prognosehorizont über einen Schritt hinaus eine Konstante zurückgibt Wert:


Comments

Popular posts from this blog

Forex Vps Hosting Singapore

Is Forex Profitable Trade

Jd Trading System