Friday 14 April 2017

Weighted Moving Average Filter C ++

A Weighted Moving Average ist ein Durchschnitt der Daten, die über einen Zeitraum berechnet werden, wo ein größeres Gewicht an die aktuellsten Daten angehängt ist. Der gewichtete Moving Average kann mit jedem Preis einschließlich der Hi, Low, Open oder Close Preis verwendet werden und kann auch auf andere Indikatoren angewendet werden. Der gewichtete Moving Average glättet eine Datenreihe, die in einem volatilen Markt wichtig ist, da es hilft, Trends viel leichter zu identifizieren. Die Gewichtung wird aus einer Summe von Tagen berechnet. Dundas Chart für Windows Forms hat vier Arten von gleitenden Durchschnitten einschließlich Simple. Exponentiell. Dreieckig. Und gewichtet. Der wichtigste Unterschied zwischen den oben genannten gleitenden Durchschnitten ist, wie sie ihre Datenpunkte abwerten. Wir empfehlen Ihnen, die Verwendung von Finanzformeln zu lesen, bevor Sie weitergehen. Mit Financial Formulas finden Sie eine ausführliche Erläuterung zur Verwendung von Formeln und erklärt auch die verschiedenen Optionen, die Ihnen bei der Anwendung einer Formel zur Verfügung stehen. Ein Liniendiagramm ist eine gute Wahl bei der Anzeige eines gewichteten gleitenden Durchschnitts. Finanzinterpretation: Der gewichtete gleitende Durchschnitt wird verwendet, um einen Wert mit seinem gewichteten gleitenden Durchschnitt zu vergleichen und gibt mehr Einfluss auf aktuelle Daten und weniger Einfluss auf vergangene Daten. Das wichtigste Element, das bei der Berechnung des gleitenden Durchschnitts verwendet wird, ist eine Zeitspanne, die gleich dem beobachteten Marktzyklus sein sollte. Der gewichtete gleitende Durchschnitt ist rückläufiger Indikator und wird immer hinter dem Preis liegen. Wenn der Preis einem Trend folgt, ist der gewichtete gleitende Durchschnitt sehr nahe am Preis. Wenn ein Preis steigt, wird der gewichtete gleitende Durchschnitt höchstwahrscheinlich wegen des Einflusses der historischen Daten nach unten bleiben. Berechnung: Der gewichtete gleitende Durchschnitt wird mit einer Summe von Indizes von Zeitperioden (Datenpunkten) berechnet. Gewicht für jede Periode wird als Index (Anzahl der Datenpunkte) berechnet. Die folgende Tabelle zeigt, wie man einen 5-tägigen gewogenen gleitenden Durchschnitt berechnet: Ist es möglich, einen gleitenden Durchschnitt in C zu implementieren, ohne die Notwendigkeit für ein Fenster von Proben Ive festgestellt, dass ich ein bisschen optimieren kann, indem ich eine Fenstergröße, die eine Macht von ist Zwei für Bit-Shifting statt zu teilen, aber nicht brauchen einen Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes durchschnittliches Ergebnis nur als eine Funktion des alten Ergebnisses auszudrücken und das neue Sample Definieren Sie ein Beispiel gleitender Durchschnitt, über ein Fenster von 4 Samples: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine genaue Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingabe Probe in der Summe (dh die a in Ihrem Beispiel) erinnern. Für eine Länge N gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal ist und xn das Eingangssignal ist. Gl. (1) kann rekursiv geschrieben werden, also musst du dich immer an die Probe xn-N erinnern, um zu berechnen (2). Wie von Conrad Turner hervorgehoben, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus der Vergangenheit und dem aktuellen Eingang berechnen können. Dies ist jedoch kein Standard (ungewichtet) gleitender Durchschnitt, sondern exponentiell Gewichteter gleitender Durchschnitt, wo Proben in der Vergangenheit ein kleineres Gewicht bekommen, aber (zumindest in der Theorie) vergisst du niemals etwas (die Gewichte werden in der Vergangenheit immer kleiner und kleiner). Ich habe einen gleitenden Durchschnitt ohne Einzelposten-Speicher für ein GPS-Tracking-Programm, das ich geschrieben habe. Ich fange mit 1 Probe an und teile mit 1, um die aktuelle avg zu bekommen. Ich füge dann eine Probe hinzu und teile mit 2 auf die aktuelle avg. Das geht weiter, bis ich die Länge des Durchschnitts erreicht habe. Jedes Mal danach füge ich die neue Probe hinzu, bekomme den Durchschnitt und beseitige diesen Durchschnitt von der Summe. Ich bin kein Mathematiker, aber das schien ein guter Weg, es zu tun. Ich dachte, es würde den Magen eines echten Mathe-Kerls drehen, aber es stellt sich heraus, dass es eine der akzeptierten Möglichkeiten ist, es zu tun. Und es geht gut Denken Sie daran, dass je höher Ihre Länge desto langsamer ist es, was Sie folgen wollen. Das mag die meiste Zeit nicht ausmachen, aber wenn man den Satelliten folgt, wenn man langsam ist, könnte der Weg weit von der aktuellen Position entfernt sein und es wird schlecht aussehen. Du hättest eine Lücke zwischen dem Sat und den hinteren Punkten. Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um ausreichende Glättung zu bekommen und nicht zu weit von der tatsächlichen Sat-Position mit den geglätteten Pfad-Punkten zu bekommen. Antwortete 16. November 16 um 23:03 initialize total 0, count0 (jedes Mal, wenn du einen neuen Wert sehe, dann eine Eingabe (scanf), man add totalnewValue, ein Inkrement (count), ein divide average (totalcount) Dies wäre ein gleitender Durchschnitt über Alle Eingänge Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, würde es 4 Eingangsvariablen erfordern, vielleicht jede Eingabe in einen älteren Eingabevariablen kopieren und dann den neuen gleitenden Durchschnitt berechnen, als Summe der 4 Eingangsvariablen, geteilt durch 4 (rechte Verschiebung 2 wäre Gut, wenn alle Eingänge waren positiv, um die durchschnittliche Berechnung beantwortet Feb 3 15 um 4:06 Das wird tatsächlich berechnen den Gesamtdurchschnitt und NICHT der gleitende Durchschnitt. Wie Zähler wird größer die Auswirkungen einer neuen Eingabe Probe wird verschwindend klein ndash Hilmar Feb 3 15 at 13:53 Ihre Antwort 2017 Stack Exchange, IncI Ich versuche, den gleitenden Durchschnitt eines Signals zu berechnen. Der Signalwert (ein Doppel) wird zu zufälligen Zeiten aktualisiert. Ich bin auf der Suche nach einem effizienten Weg, um seine Zeit gewichteten Durchschnitt zu berechnen Über ein zeitfenster, in Echtzeit. Ich könnte es selbst tun, aber es ist schwieriger als ich dachte Die meisten der Ressourcen, die ich über das Internet gefunden habe, berechnen den gleitenden Durchschnitt des periodischen Signals, aber meine Updates zufällig. Kennt jemand gute Ressourcen dafür Der Trick ist der folgende: Sie erhalten Updates zufällig über void update (int time, float value). Allerdings müssen Sie auch auch verfolgen, wenn ein Update aus dem Zeitfenster fällt, also setzen Sie einen Alarm, der zur Zeit N aufruft, der das vorherige Update entfernt, von der jemals wieder in der Berechnung berücksichtigt wird. Wenn dies in Echtzeit geschieht, können Sie das Betriebssystem anfordern, um einen Anruf zu einer Methode zu machen void dropoffoldestupdate (int time) zum Zeitpunkt N aufgerufen werden. Wenn dies eine Simulation ist, können Sie keine Hilfe vom Betriebssystem erhalten und Sie müssen Mach es manuell. In einer Simulation nennst du Methoden mit der Zeit, die als Argument geliefert wird (was nicht mit der Realzeit korreliert). Eine vernünftige Annahme ist jedoch, dass die Anrufe so garantiert werden, dass die Zeitargumente zunehmen. In diesem Fall müssen Sie eine sortierte Liste von Alarmzeitwerten pflegen und für jeden Aktualisierungs - und Leseaufruf überprüfen Sie, ob das Zeitargument größer ist als der Kopf der Alarmliste. Während es größer ist, machst du die Alarmverarbeitung (Drop off die älteste Aktualisierung), entfernen Sie den Kopf und überprüfen Sie noch einmal, bis alle Alarme vor der gegebenen Zeit verarbeitet werden. Dann rufe das Update auf. Ich habe so weit davon ausgegangen, dass es offensichtlich ist, was Sie für die eigentliche Berechnung tun würden, aber ich werde nur im Fall erarbeiten. Ich nehme an, Sie haben eine Methode float lesen (int Zeit), die Sie verwenden, um die Werte zu lesen. Ziel ist es, diesen Anruf so effizient wie möglich zu machen. So berechnen Sie den gleitenden Durchschnitt nicht jedes Mal, wenn die Lesemethode aufgerufen wird. Stattdessen berechnen Sie den Wert ab dem letzten Update oder dem letzten Alarm und optimieren diesen Wert um ein paar Gleitkommaoperationen, um den Ablauf der Zeit seit dem letzten Update zu berücksichtigen. (Z. B. eine konstante Anzahl von Operationen, außer bei der Verarbeitung einer Liste von aufgestauten Alarmen). Hoffentlich ist das klar - das sollte ein ganz einfacher Algorithmus und sehr effizient sein. Weitere Optimierung. Eines der verbleibenden Probleme ist, wenn eine große Anzahl von Updates innerhalb des Zeitfensters passiert, dann gibt es eine lange Zeit, für die es weder Lesungen noch Updates gibt und dann ein Lesen oder Update kommt. In diesem Fall ist der obige Algorithmus ineffizient in der inkrementellen Aktualisierung des Wertes für jeden der Updates, die abfällt. Dies ist nicht notwendig, weil wir uns nur um die letzte Aktualisierung über das Zeitfenster kümmern, also wenn es einen Weg gibt, um alle älteren Updates effizient abzusetzen, 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 aktuellste 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 gelöschte Update inkrementell aktualisieren. Aber wenn es viele Updates gibt, die gelöscht werden müssen, dann kann man den Wert von neuem neu berechnen, nachdem er die alten Updates abgelegt hat. Anhang zur Inkrementalberechnung: Ich sollte klären, was ich mit der inkrementellen Berechnungen oben im Satz tue, um diesen Wert durch ein paar Gleitkommaoperationen zu zwingen, um den Ablauf der Zeit seit dem letzten Update zu berücksichtigen. Initiale nicht-inkrementale Berechnungen: dann iterate über relevanteupdates in der Reihenfolge der zunehmenden Zeit: moveaverage (sum lastupdate timesincelastupdate) windowlength. Nun, wenn genau ein Update aus dem Fenster fällt, aber keine neuen Updates ankommen, stelle die Summe wie folgt ein: (Notiz ist es, dass der Zeitstempel geändert wurde, um den Anfang des letzten Fensters zu starten). Und wenn genau ein Update in das Fenster eintritt, aber keine neuen Updates abfallen, stelle die Summe als: Wie sollte es offensichtlich sein, das ist eine grobe Skizze, aber hoffentlich zeigt es, wie man den Durchschnitt so beibehalten kann, dass es O (1) Operationen pro Update ist Auf amortisierter Basis. Aber bemerken Sie weitere Optimierung im vorherigen Absatz. Beachten Sie auch Stabilitätsprobleme, die in einer älteren Antwort angedeutet werden, was bedeutet, dass sich Gleitkomma-Fehler über eine große Anzahl solcher inkrementeller Operationen ansammeln können, so dass es eine Abweichung von dem Ergebnis der vollständigen Berechnung gibt, die für die Anwendung signifikant ist. Wenn eine Annäherung in Ordnung ist und theres eine minimale Zeit zwischen den Proben, könnte man Super-Sampling versuchen. Haben Sie ein Array, das gleichmäßig beabstandete Zeitintervalle repräsentiert, die kürzer als das Minimum sind, und bei jedem Zeitspanne das letzte erhaltene Sample speichern. Je kürzer das Intervall ist, desto näher wird der Durchschnitt auf den wahren Wert. Der Zeitraum sollte nicht größer als die Hälfte des Minimums sein oder es besteht die Möglichkeit, eine Probe zu fehlen. Antwortete Dec 15 11 um 18:12 antwortete Dec 15 11 um 22:38 Vielen Dank für die Antwort. Eine Verbesserung, die es nötig wäre, um den Wert des Gesamtdurchschnitts tatsächlich zu notieren, so dass wir die ganze Zeit nicht schleifen. Auch kann es ein kleiner Punkt sein, aber wäre es nicht effizienter, einen Deque oder eine Liste zu verwenden, um den Wert zu speichern, da wir davon ausgehen, dass das Update in der richtigen Reihenfolge kommen wird. Einfügung wäre schneller als in der Karte. Ndash Arthur Dec 16 11 at 8:55 Ja, du kannst den Wert der Summe zwischenspeichern. Subtrahieren Sie die Werte der Samples, die Sie löschen, fügen Sie die Werte der Proben hinzu, 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 Karte :: upperbound. Wie immer, schreiben Sie korrekten Code zuerst, dann Profil und messen Sie inkrementelle Änderungen. Ndash Rob Dez 16 11 um 15:00 Hinweis: Anscheinend ist dies nicht der Weg, um dies zu nähern. Verlassen Sie es hier als Referenz auf das, was mit diesem Ansatz falsch ist. Überprüfe die Kommentare. AKTUALISIERT - basierend auf Olis Kommentar. Nicht sicher über die Instabilität, über die er spricht. Verwenden Sie eine sortierte Karte von Ankunftszeiten gegen Werte. Bei der Ankunft eines Wertes fügen Sie die Ankunftszeit zu der sortierten Karte zusammen mit seinem Wert hinzu und aktualisieren Sie den gleitenden Durchschnitt. Warnung das ist Pseudocode: Dort. Nicht voll ausgefunden, aber du bekommst die Idee. Dinge zu beachten. Wie ich schon sagte, ist der Pseudocode. Du musst eine passende Karte auswählen. Dont entfernen Sie die Paare, wie Sie durch, wie Sie den Iterator ungültig machen und müssen wieder anfangen. Siehe Olis Kommentar unten auch. Beantwortet Dec 15 11 at 12:22 Das funktioniert nicht: Es wird nicht berücksichtigt, welcher Anteil der Fensterlänge jeder Wert existiert. Auch dieser Ansatz des Hinzufügens und dann Subtrahieren ist nur stabil für ganzzahlige Typen, nicht Floats. Ndash Oliver Charlesworth Dec 15 11 at 12:29 OliCharlesworth - Entschuldigung Ich vermisse einige wichtige Punkte in der Beschreibung (doppelt und zeitlich gewichtet). 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 mich auf die Tatsache, dass, wenn ein neuer Wert zuerst das Zeitfenster betritt, sein Beitrag zum Durchschnitt minimal ist. Der Beitrag steigt weiter an, bis ein neuer Wert eintritt. Ndash Oliver Charlesworth Dec 15 11 at 12: 35A Simple Moving Average ist ein Durchschnitt der Daten über einen Zeitraum berechnet. Der gleitende Durchschnitt ist der beliebteste Preisindikator für technische Analysen. Dieser Durchschnitt kann mit jedem Preis einschließlich der Hi, Low, Open oder Close verwendet werden und kann auch auf andere Indikatoren angewendet werden. Ein gleitender Durchschnitt glättet eine Datenreihe, die in einem volatilen Markt sehr wichtig ist, da sie dazu beiträgt, signifikante Trends zu identifizieren. Dundas Chart für ASP hat vier Arten von gleitenden Durchschnitten einschließlich Simple, Exponential. Dreieckig. Und gewichtet. Der wichtigste Unterschied zwischen den oben genannten gleitenden Durchschnitten ist, wie sie ihre Datenpunkte abwerten. Wir empfehlen Ihnen, die Verwendung von Finanzformeln zu lesen, bevor Sie weitergehen. Mit Financial Formulas finden Sie eine ausführliche Erläuterung zur Verwendung von Formeln und erklärt auch die verschiedenen Optionen, die Ihnen bei der Anwendung einer Formel zur Verfügung stehen. Ein Liniendiagramm ist eine gute Wahl, wenn man einen einfachen gleitenden Durchschnitt anzeigt. Finanzielle Interpretation: Der Moving Average wird verwendet, um die Wertpapiere mit dem gleitenden Durchschnitt zu vergleichen. Das wichtigste Element, das bei der Berechnung des gleitenden Durchschnitts verwendet wird, ist eine Zeitspanne, die gleich dem beobachteten Marktzyklus sein sollte. Der gleitende Durchschnitt ist ein Nachlaufindikator und wird immer hinter dem Preis stehen. Wenn der Preis nach einem Trend folgt, ist der gleitende Durchschnitt sehr nahe am Sicherheitspreis. Wenn ein Preis steigt, wird der gleitende Durchschnitt wahrscheinlich aufgrund des Einflusses der historischen Daten zurückbleiben. Berechnung: Der gleitende Durchschnitt wird nach folgender Formel berechnet: In der vorherigen Formel steht der n-Wert für einen Zeitraum. Die häufigsten Zeiträume sind: 10 Tage, 50 Tage und 200 Tage. Ein gleitender Durchschnitt bewegt sich, weil bei jedem neuen Datenpunkt der älteste Datenpunkt gelöscht wird. Ein einfacher gleitender Durchschnitt gibt jedem Datenpunktpreis gleiches Gewicht. Dieses Beispiel veranschaulicht, wie man einen 20-Tage-Gleitwert mit der Formel-Methode berechnet.


No comments:

Post a Comment