Saturday 21 October 2017

Weighted Moving Average C


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 von Alarmzeitwerten 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 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 Aktualisierungen ankommen, stellen 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 am 15. Dezember um 18:12 Vielen Dank 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 durch, wie 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: 35Weight Moving Averages: Die Grundlagen Im Laufe der Jahre haben Techniker zwei Probleme mit dem einfachen gleitenden Durchschnitt gefunden. Das erste Problem liegt im Zeitrahmen des gleitenden Durchschnitts (MA). Die meisten technischen Analysten glauben, dass Preis-Aktion. Der Eröffnungs - oder Schlussaktienkurs, reicht nicht aus, um davon abhängen zu können, ob Kauf - oder Verkaufssignale der MAs-Crossover-Aktion richtig vorhergesagt werden. Zur Lösung dieses Problems weisen die Analysten den jüngsten Preisdaten nun mehr Gewicht zu, indem sie den exponentiell geglätteten gleitenden Durchschnitt (EMA) verwenden. (Erfahren Sie mehr bei der Exploration der exponentiell gewogenen gleitenden Durchschnitt.) Ein Beispiel Zum Beispiel, mit einem 10-Tage-MA, würde ein Analytiker den Schlusskurs des 10. Tag nehmen und multiplizieren Sie diese Zahl mit 10, der neunte Tag um neun, der achte Tag um acht und so weiter auf die erste der MA. Sobald die Summe bestimmt worden ist, würde der Analytiker dann die Zahl durch Addition der Multiplikatoren dividieren. Wenn Sie die Multiplikatoren des 10-Tage-MA-Beispiels hinzufügen, ist die Zahl 55. Dieses Kennzeichen wird als linear gewichteter gleitender Durchschnitt bezeichnet. (Für verwandte Themen lesen Sie in Simple Moving Averages machen Trends Stand Out.) Viele Techniker sind fest Anhänger in der exponentiell geglättet gleitenden Durchschnitt (EMA). Dieser Indikator wurde auf so viele verschiedene Weisen erklärt, dass er Studenten und Investoren gleichermaßen verwirrt. Vielleicht die beste Erklärung kommt von John J. Murphys Technische Analyse der Finanzmärkte, (veröffentlicht von der New York Institute of Finance, 1999): Der exponentiell geglättete gleitende Durchschnitt behebt beide Probleme mit dem einfachen gleitenden Durchschnitt verbunden. Erstens weist der exponentiell geglättete Durchschnitt den neueren Daten ein größeres Gewicht zu. Daher ist es ein gewichteter gleitender Durchschnitt. Doch während es den vergangenen Preisdaten eine geringere Bedeutung zuweist, enthält es in seiner Berechnung alle Daten in der Lebensdauer des Instruments. Zusätzlich ist der Benutzer in der Lage, die Gewichtung anzupassen, um ein größeres oder geringeres Gewicht zu dem letzten Tagespreis zu ergeben, der zu einem Prozentsatz des vorherigen Tageswertes addiert wird. Die Summe der beiden Prozentwerte addiert sich zu 100. Beispielsweise könnte dem letzten Tagespreis ein Gewicht von 10 (.10) zugewiesen werden, das zu dem vorherigen Tagegewicht von 90 (.90) addiert wird. Das ergibt den letzten Tag 10 der Gesamtgewichtung. Dies wäre das Äquivalent zu einem 20-Tage-Durchschnitt, indem die letzten Tage Preis einen kleineren Wert von 5 (.05). Abbildung 1: Exponentiell geglättete gleitende Durchschnittswerte Die obige Grafik zeigt den Nasdaq Composite Index von der ersten Woche im Aug. 2000 bis zum 1. Juni 2001. Wie Sie deutlich sehen können, ist die EMA, die in diesem Fall die Schlusskursdaten über einen Neun-Tage-Zeitraum, hat endgültige Verkaufssignale am 8. September (gekennzeichnet durch einen schwarzen Pfeil nach unten). Dies war der Tag, an dem der Index unter dem Niveau von 4.000 unterbrach. Der zweite schwarze Pfeil zeigt ein anderes Bein, das die Techniker tatsächlich erwartet hatten. Der Nasdaq konnte nicht genug Volumen und Interesse von den Kleinanlegern erzeugen, um die 3.000 Marke zu brechen. Danach tauchte es wieder zu Boden, um 1619.58 am 4. April. Der Aufwärtstrend vom 12. April ist durch einen Pfeil markiert. Hier schloss der Index bei 1.961,46, und Techniker begannen zu sehen, institutionelle Fondsmanager ab, um einige Schnäppchen wie Cisco, Microsoft und einige der energiebezogenen Fragen abholen. (Lesen Sie unsere verwandten Artikel: Moving Average Umschläge: Verfeinern eines beliebten Trading-Tool und Moving Average Bounce.) Ein Begriff von John Maynard Keynes verwendet in einem seiner Wirtschaftsbücher. In seiner 1936 erschienenen Publikation The General Theory of Employment. Ein Gesetz der Gesetzgebung, die eine große Anzahl von Reformen in U. S. Pensionspläne Gesetze und Verordnungen. Dieses Gesetz machte mehrere. Ein Maß für den aktiven Teil einer Volkswirtschaft. Die Erwerbsquote bezieht sich auf die Anzahl der Personen, die sind. Der gesamte Bestand an Währung und anderen flüssigen Instrumenten in einer Volkswirtschaft zu einer bestimmten Zeit. Die Geldmenge. 1. Im Allgemeinen eine Situation der Gleichheit. Parität kann in vielen verschiedenen Kontexten auftreten, aber es bedeutet immer, dass zwei Dinge. Eine Klassifizierung von Handelsaktien, wenn eine deklarierte Dividende dem Verkäufer statt dem Käufer gehört. Eine Aktie wird sein. Was ist der Unterschied zwischen gleitendem Durchschnitt und gewichtetem gleitendem Durchschnitt Ein 5-Perioden-gleitender Durchschnitt, basierend auf den obigen Preisen, würde nach folgender Formel berechnet werden: Basierend auf der obigen Gleichung ist der Durchschnittspreis über dem oben aufgeführten Zeitraum War 90,66. Die Verwendung von gleitenden Durchschnitten ist eine wirksame Methode zur Beseitigung starker Preisschwankungen. Die Schlüsselbegrenzung besteht darin, dass Datenpunkte von älteren Daten nicht anders gewichtet werden als Datenpunkte nahe dem Anfang des Datensatzes. Hier kommen gewichtete gleitende Mittelwerte ins Spiel. Gewichtete Mittelwerte weisen eine höhere Gewichtung auf aktuellere Datenpunkte zu, da sie relevanter sind als Datenpunkte in der fernen Vergangenheit. Die Summe der Gewichtung sollte bis zu 1 (oder 100) addieren. Im Fall des einfachen gleitenden Durchschnitts sind die Gewichtungen gleichmäßig verteilt, weshalb sie in der obigen Tabelle nicht dargestellt sind. Schlusskurs der AAPL

No comments:

Post a Comment