Wednesday, 21 June 2017

Gewichtet Gleitender Durchschnitt C


Ich versuche, den gleitenden Durchschnitt eines Signals zu berechnen. Der Signalwert (a double) wird zu beliebigen Zeiten aktualisiert. Ich suche nach einem effizienten Weg, um seinen zeitgewichteten 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, 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, machen Sie die Alarmverarbeitung (Drop off die älteste Aktualisierung), entfernen Sie den Kopf und überprüfen Sie noch einmal, bis alle Alarme vor der angegebenen 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 der 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: 35Ich weiß, das ist erreichbar mit Boost 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: 27Weighted 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 Mittelwertes (MA). Die meisten technischen Analysten glauben, dass Preisaktion. Der Eröffnungs - oder Schlussbestandspreis, ist nicht genug, auf die für die ordnungsgemäße Vorhersage des Kaufs oder der Verkaufssignale der MAs Crossover-Aktion abzusehen ist. Um dieses Problem zu lösen, weisen die Analysten nunmehr die aktuellsten Preisdaten mit dem exponentiell geglätteten gleitenden Durchschnitt (EMA) zu. (Erfahren Sie mehr bei der Erforschung der exponentiell gewogenen bewegten Durchschnitt.) Ein Beispiel Zum Beispiel, mit einem 10-Tage-MA, würde ein Analytiker den Schlusskurs des 10. Tages und multiplizieren diese Zahl um 10, der neunte Tag um neun, der achte Tag für acht und so weiter zum ersten der MA. Sobald die Summe bestimmt worden ist, würde der Analytiker dann die Zahl durch die Addition der Multiplikatoren teilen. Wenn Sie die Multiplikatoren des 10-Tage-MA-Beispiels hinzufügen, ist die Zahl 55. Dieser Indikator wird als linear gewichteter gleitender Durchschnitt bezeichnet. (Für verwandte Lesung, check out Simple Moving Averages machen Trends Stand Out.) Viele Techniker sind fest in der exponentiell geglätteten gleitenden Durchschnitt (EMA). Dieser Indikator wurde in so vielen verschiedenen Weisen erklärt, dass er Studenten und Investoren gleichermaßen verwechselt. Vielleicht kommt die beste Erklärung von John J. Murphys Technische Analyse der Finanzmärkte, (veröffentlicht vom New York Institute of Finance, 1999): Der exponentiell geglättete gleitende Durchschnitt adressiert beide Probleme, die mit dem einfachen gleitenden Durchschnitt verbunden sind. Zuerst weist der exponentiell geglättete Durchschnitt den neueren Daten ein größeres Gewicht zu. Daher ist es ein gewichteter gleitender Durchschnitt. Aber während es den vergangenen Preisdaten eine geringere Bedeutung zuweist, enthält es in der Berechnung alle Daten im Leben des Instruments. Darüber hinaus ist der Benutzer in der Lage, die Gewichtung anpassen, um mehr oder weniger Gewicht auf die jüngsten Tage Preis, die zu einem Prozentsatz der vorherigen Tage Wert hinzugefügt wird. Die Summe der beiden Prozentwerte addiert sich zu 100. Beispielsweise könnte dem letzten Tagepreis ein Gewicht von 10 (.10) zugewiesen werden, der zu den vorherigen Tagen Gewicht von 90 (.90) hinzugefügt wird. Dies gibt den letzten Tag 10 der Gesamtgewichtung. Dies wäre das Äquivalent zu einem 20-Tage-Durchschnitt, indem man den letzten Tage Preis einen kleineren Wert von 5 (.05). Abbildung 1: Exponentiell geglättete Moving Average Die obige Grafik zeigt den Nasdaq Composite Index von der ersten Woche im August 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-Periode, hat definitive 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 unterging. Der zweite schwarze Pfeil zeigt ein weiteres heruntergekommenes Bein, das die Techniker eigentlich erwarten. Die Nasdaq konnte nicht genug Volumen und Interesse von den Einzelhandelsanlegern erzeugen, um die 3.000 Mark zu brechen. Dann tauchte es wieder auf den Boden bei 1619.58 am 4. April. Der Aufwärtstrend vom 12. April ist durch einen Pfeil markiert. Hier schloss der Index um 1.961.46, und Techniker begannen, institutionelle Fondsmanager zu sehen, die anfangen, einige Schnäppchen wie Cisco, Microsoft und einige der energiebezogenen Fragen aufzuheben. (Lesen Sie unsere verwandten Artikel: Moving Average Envelopes: Verfeinern eines beliebten Trading-Tool und Moving Average Bounce.) Artikel 50 ist eine Klausel im EU-Vertrag, die die Schritte, die ein Mitgliedsland ergreifen muss, um die Europäische Union zu verlassen, umreißt. Großbritannien. Beta ist ein Maß für die Volatilität oder das systematische Risiko eines Wertpapiers oder eines Portfolios im Vergleich zum Gesamtmarkt. Eine Art von Steuern, die auf Kapitalgewinne von Einzelpersonen und Kapitalgesellschaften angefallen sind. Kapitalgewinne sind die Gewinne, die ein Investor ist. Ein Auftrag, eine Sicherheit bei oder unter einem bestimmten Preis zu erwerben. Ein Kauflimitauftrag erlaubt es Händlern und Anlegern zu spezifizieren. Eine IRS-Regel (Internal Revenue Service), die strafrechtliche Abhebungen von einem IRA-Konto ermöglicht. Die Regel verlangt, dass. What039s die Differenz zwischen gleitenden durchschnittlichen und gewichteten gleitenden Durchschnitt Ein 5-Periode gleitenden Durchschnitt, basierend auf den oben genannten Preisen, würde nach der folgenden Formel berechnet werden: Basierend auf der obigen Gleichung, der durchschnittliche Preis über den oben genannten Zeitraum War 90,66. Mit bewegten Durchschnitten ist eine effektive Methode zur Beseitigung starker Preisschwankungen. Die Schlüsselbegrenzung ist, dass Datenpunkte von älteren Daten nicht anders als Datenpunkte am Anfang des Datensatzes gewichtet werden. Hier kommen gewichtete Bewegungsdurchschnitte ins Spiel. Gewichtete Durchschnitte weisen den aktuellen Datenpunkten eine schwerere Gewichtung zu, da sie in der fernen Vergangenheit relevanter sind als Datenpunkte. Die Summe der Gewichtung sollte bis zu 1 (oder 100) addieren. Im Falle des einfachen gleitenden Durchschnitts sind die Gewichtungen gleichmäßig verteilt, weshalb sie in der obigen Tabelle nicht dargestellt sind. Schlusskurs von AAPL

No comments:

Post a Comment