Friday 29 September 2017

Gewichteter Gleitender Mittelalgorithmus


Ich habe eine Zeitreihe von Aktienkursen und möchte den gleitenden Durchschnitt über ein zehnminütiges Fenster berechnen (siehe Grafik unten). Da Preis-Ticks sporadisch auftreten (d. H. Sie sind nicht periodisch), scheint es am schönsten, einen zeitlich gewichteten gleitenden Durchschnitt zu berechnen. In dem Diagramm gibt es vier Preisänderungen: A, B, C und D, wobei die letzteren drei innerhalb des Fensters auftreten. Beachten Sie, dass, weil B nur einige Zeit in das Fenster (z. B. 3 Minuten) auftritt, der Wert von A noch zur Berechnung beiträgt. In der Tat, so weit ich sagen kann, sollte die Berechnung nur auf den Werten von A, B und C (nicht D) und den Zeitabständen zwischen ihnen und dem nächsten Punkt (oder im Fall von A: die Dauer zwischen dem Start basieren Des Zeitfensters und B). Anfänglich wird D keine Wirkung haben, da seine Zeitwichtung Null ist. Ist das korrekt? Angenommen, das ist richtig, meine Sorge ist, dass der gleitende Durchschnitt mehr als die nicht gewichtete Berechnung (die für den Wert von D sofort Rechnung) lag, aber die nicht gewichtete Berechnung hat seine eigenen Nachteile: A würde Haben so viel Wirkung auf das Ergebnis wie die anderen Preise, obwohl sie außerhalb des Zeitfensters. Eine plötzliche Aufregung von schnellen Preis-Ticks würde stark beeinträchtigen den gleitenden Durchschnitt (obwohl vielleicht dies ist wünschenswert) Kann jeder bieten einen Rat, über welchen Ansatz scheint am besten, oder ob theres eine alternative (oder Hybrid-) Ansatz wert der Prüfung gefragt Apr 14 12 at 21: 35 Ihre Argumentation ist richtig. Was wollen Sie den Durchschnitt für verwenden, obwohl ohne zu wissen, dass seine schwer, einen Rat geben. Möglicherweise wäre eine Alternative, Ihren laufenden Durchschnitt A zu betrachten, und wenn ein neuer Wert V hereinkommt, berechnen Sie den neuen Durchschnitt A, um (1-c) AcV zu sein, wobei c zwischen 0 und 1 ist. Auf diese Weise haben die neueren Zecken Ein stärkerer Einfluss, und die Wirkung der alten Zecken im Laufe der Zeit zerstreut. Man könnte sogar c abhängen von der Zeit seit den vorherigen Zecken (c immer kleiner als die Zecken näher kommen). In dem ersten Modell (Gewichtung) würde der Durchschnitt jede Sekunde unterschiedlich sein (da alte Ablesungen ein geringeres Gewicht und neue Ablesungen höher erhalten), so daß sie sich stets ändern, was nicht wünschenswert sein kann. Mit dem zweiten Ansatz, die Preise machen plötzliche Sprünge, wie neue Preise eingeführt werden und alte verschwinden aus Fenster. Die beiden Vorschläge kommen aus der diskreten Welt, aber Sie könnten eine Inspiration für Ihren speziellen Fall zu finden. Werfen Sie einen Blick auf exponentielle Glättung. In diesem Ansatz stellen Sie den Glättungsfaktor (01) ein, mit dem Sie den Einfluss der letzten Elemente auf den Prognosewert ändern können (ältere Elemente werden exponentiell abnehmende Gewichte zugewiesen): Ich habe eine einfache Animation erstellt, wie die exponentielle Glättung den Verlauf verfolgen würde Eine einheitliche Zeitreihe x1 1 1 1 3 3 2 2 2 1 mit drei verschiedenen: Schauen Sie sich auch einige der Verstärkungstechniken an (siehe die verschiedenen Diskontierungsmethoden) zum Beispiel TD-Learning und Q-Learning. Ja, der gleitende Durchschnitt wird natürlich verzögern. Dies liegt daran, seinen Wert historische Informationen: es fasst Proben des Preises in den letzten 10 Minuten. Diese Art von Durchschnitt ist inhärent laggy. Es hat eine eingebaute in fünf Minuten Versatz (weil eine Box Durchschnitt ohne Offset auf - 5 Minuten basieren würde, auf die Probe zentriert). Wenn der Preis längere Zeit bei A liegt und sich dann einmal um B ändert, dauert es 5 Minuten, bis der Durchschnitt (AB) 2 erreicht ist. Wenn Sie eine Funktion ohne eine Verschiebung in der Domäne durchführen möchten, hat das Gewicht Um gleichmäßig um den Probenpunkt verteilt zu sein. Aber das ist unmöglich, für die Preise in Echtzeit auftreten, da künftige Daten nicht verfügbar ist. Wenn Sie möchten, dass eine neue Änderung, wie D, einen größeren Einfluss haben, verwenden Sie einen Durchschnitt, der ein größeres Gewicht auf die jüngsten Daten oder einen kürzeren Zeitraum oder beides gibt. Eine Möglichkeit, Daten zu glätten, besteht einfach darin, einen einzigen Akkumulator (den geglätteten Schätzer) E zu verwenden und periodische Abtastwerte der Daten S E zu nehmen. E wird wie folgt aktualisiert: Ie. Wird ein Bruchteil K (zwischen 0 und 1) der Differenz zwischen dem aktuellen Preissample S und dem Schätzer E zu E addiert. Angenommen, der Preis sei bei A für eine lange Zeit gewesen, so daß E bei A liegt und sich dann plötzlich ändert Zu B. Der Schätzer beginnt sich in exponentieller Weise zu B zu bewegen (wie Heizkühlung, Ladeentladung eines Kondensators usw.). Am Anfang wird es einen großen Sprung, und dann kleinere und kleinere Schritten. Wie schnell es sich bewegt, hängt von K. Wenn K 0 ist, bewegt sich der Schätzer überhaupt nicht, und wenn K 1 ist, bewegt er sich sofort. Mit K können Sie einstellen, wie viel Gewicht Sie dem Schätzer gegenüber der neuen Probe geben. Mehr Gewicht wird auf neuere Beispiele implizit gegeben, und das Musterfenster erstreckt sich grundsätzlich auf unendlich: E basiert auf jeder Wertprobe, die jemals aufgetreten ist. Obwohl natürlich sehr alte haben keinen Einfluss auf den aktuellen Wert. Eine sehr einfache, schöne Methode. Dies ist die gleiche wie Tom39s Antwort. Seine Formel für den neuen Wert des Schätzers ist (1 - K) E KS. Die algebraisch gleich E K (S - E) ist. Es ist eine quotlineare Blendingfunktion quot zwischen dem aktuellen Schätzer E und dem neuen Abtastwert S, wobei der Wert von K 0, 1 die Mischung steuert. Schreibe es so ist schön und nützlich. Wenn K 0.7 ist, nehmen wir 70 von S und 30 von E, die die gleiche wie die Addition von 70 der Differenz zwischen E und S ist zurück zu E. ndash Kaz Apr 14 12 um 22:15 Bei der Expansion Toms Antwort, die Formel (Tt - t n - 1) T, dh a ist ein Verhältnis von Delta der Ankunftszeit über dem Mittelungsintervall v 1 (vorherige Verwendung verwenden), um den Abstand zwischen den Zecken zu formalisieren (enge Zecken haben eine proportional geringere Gewichtung) Punkt) oder v (1 - u) a (lineare Interpolation oder vu (nächster Punkt) Weitere Informationen finden Sie auf Seite 59 des Buches Eine Einführung in die Hochfrequenzfinanzierung. Ich möchte einen iterativen Algorithmus implementieren, der den gewichteten Durchschnitt berechnet Das spezifische Gewicht-Gesetz spielt keine Rolle, aber es sollte in der Nähe von 1 für die neuesten Werte und in der Nähe von 0 zu den ältesten. Der Algorithmus sollte iterativ, dh es sollte nicht alle vorhergehenden Werte erinnern. Es sollte nur einen neuesten Wert wissen Und alle aggregativen Informationen über Vergangenheit, wie vorherige Werte des Durchschnitts, Summen, Zählungen usw. Zum Beispiel kann der folgende Algorithmus sein: Es gibt exponentielle abnehmende Gewicht, das nicht gut sein kann. Ist es möglich, Schritt abnehmende Gewicht oder etwas Die Anforderungen für das Wiegen Gesetz ist folgende: 1) Das Gewicht sinkt in die Vergangenheit 2) Ich habe einige mittlere oder charakteristische Dauer, so dass Werte älter diese Dauer viel weniger wichtig als neuere 3) I Sollte in der Lage, diese Dauer Ich brauche die folgenden. Angenommen, vi sind Werte, wobei v1 die erste ist. Nehmen wir auch an, dass wi Gewichte sind. Aber w0 ist das letzte. Also, nach dem ersten Wert kam ich erstmal nach dem zweiten Wert v2 kam, hätte ich durchschnittlich Beim nächsten Wert sollte ich beachten, dass sich das Gewichtsprofil mit mir bewegt, während ich mich entlang der Wertsequenz befinde. D. h. Jeder Wert hat nicht sein eigenes Gewicht die ganze Zeit. Mein Ziel ist es, dieses Gewicht zu senken, während Sie Vergangenheit. Gt Aber meine Aufgabe ist es, durchschnittlich neu berechnet jedes Mal neue Wert kommt mit alten Werten wiedergewichtet. OP Ihre Aufgabe ist fast immer unmöglich, auch bei außergewöhnlich einfachen Gewichtungsregelungen. Sie fragen, mit O (1) Speicher, Ertragsdurchschnitte mit einem sich ändernden Gewichtungsschema. Zum Beispiel, wenn neue Werte übergeben werden, für eine nahezu beliebig wechselnde Gewichtsfolge. Dies ist aufgrund der Injektivität unmöglich. Sobald Sie zusammen die Zahlen zusammen, verlieren Sie eine riesige Menge an Informationen. Zum Beispiel, auch wenn Sie die Gewicht-Vektor hatte. Können Sie den ursprünglichen Wertvektor nicht wiederherstellen oder umgekehrt. Es gibt nur zwei Fälle, die ich denken kann, wo Sie weg mit diesem erhalten konnten: Konstante Gewichte wie 2,2,2. 2: Dies ist äquivalent zu einer Online-Algebra, die Sie nicht wollen, weil die alten Werte nicht wiedergewichtet werden. Die relativen Gewichte der vorherigen Antworten ändern sich nicht. Zum Beispiel könnten Sie Gewichte von 8,4,2,1 zu tun. Und fügen Sie in ein neues Element mit beliebigem Gewicht wie. 1. aber Sie müssen alle vorherigen um den gleichen multiplikativen Faktor, wie 16,8,4,21 erhöhen. So fügen Sie bei jedem Schritt ein neues willkürliches Gewicht und eine neue willkürliche Neuskalierung der Vergangenheit hinzu, sodass Sie 2 Freiheitsgrade haben (nur 1, wenn Sie Ihr Dot-Produkt normalisieren müssen). Die Gewicht-Vektoren youd erhalten würde aussehen: So jede Gewichtung Schema können Sie sehen, wie das funktioniert (es sei denn, Sie müssen die Sache normalisiert durch die Summe der Gewichte zu halten, in diesem Fall müssen Sie dann teilen den neuen Durchschnitt durch die neue Summe, die Sie berechnen können, indem Sie nur O (1) Speicher behalten). Multiplizieren Sie einfach den vorherigen Durchschnitt mit den neuen s (die sich implizit über das Punktprodukt in die Gewichte verteilen) und tack auf den neuen wnewValue. Antwort # 1 am: April 22, 2011, 09:31:01 pm »Hier Im Angenommen, Sie wollen, dass die Gewichte zu 1 zu summieren. Solange Sie ein relatives Gewicht erzeugen können, ohne es in der Zukunft ändern, können Sie am Ende mit einer Lösung, die dieses Verhalten imitiert. Das heißt, Sie haben Ihre Gewichte als Sequenz definiert und die Eingabe als Sequenz definiert. Betrachten Sie die Form: sum (s0i0 s1i1 s2i2 snin) sum (s0 s1 s2 sn). Beachten Sie, dass es trivial möglich ist, dies inkrementell mit ein paar Aggregationszähler zu berechnen: Natürlich berechnet calculateWeightFromCounter () in diesem Fall nicht Gewichte, die Summe zu eins - der Trick hier ist, dass wir durch Division durch die Summe der Gewichte So daß letztlich die Gewichte praktisch zusammenfallen. Der eigentliche Trick ist, wie Sie berechnenWeightFromCounter (). Sie könnten einfach zurückkehren, zum Beispiel, aber beachten Sie, dass die letzte gewichtete Zahl nicht in der Nähe der Summe der Zähler unbedingt, so dass Sie möglicherweise nicht am Ende mit den genauen Eigenschaften, die Sie wollen. (Sein schwer zu sagen, da, wie erwähnt, haben Sie ein ziemlich offenes Problem verlassen.) Das Problem ist, dass Gewichte mit jedem neuen Wert ändern. In Ihrem Fall sind sie nicht. Ndash Suzan Cioc Die tatsächlichen verwendeten Gewichte ändern sich mit jedem neuen Wert - die quotweightsquot werden durch eine sukzessive größere Zahl geteilt, wodurch die Durchsetzung, dass die tatsächlichen verwendeten Gewichte immer auf 1. ndash Kaganar Mar 29 12 Um 14:45 Dies ist zu lang, um in einem Kommentar posten, aber es kann nützlich sein, zu wissen. Angenommen, Sie haben: w0vn. Wnv0 (nennen wir diese w0..nvn..0 kurz) Dann ist der nächste Schritt: w0vn1. Wn1v0 (und dies ist w0..n1vn1..0 für kurze) Dies bedeutet, dass wir einen Weg brauchen, um w1..n1vn..0 aus w0..nvn..0 zu berechnen. Es ist sicher möglich, daß vn.0 0. 0, z, 0. 0 ist, wobei z an einer Stelle x ist. Wenn wir keine zusätzliche Speicherung haben, dann ist f (zw (x)) zw (x 1) wobei w (x) das Gewicht für die Stelle x ist. Umordnen der Gleichung w (x 1) f (zw (x)) z. Nun ist w (x 1) besser konstant für eine Konstante x, also ist f (zw (x)) z besser konstant. Damit kann f z fortpflanzen - dh f (zw (x)) zf (w (x)). Aber hier haben wir wieder ein Problem. Beachten Sie, dass wenn z (was eine beliebige Zahl sein könnte) durch f ausbreiten kann. Dann kann w (x) sicherlich. Also ist f (zw (x)) w (x) f (z). Somit ist f (w (x)) w (x) f (z). Aber für eine konstante x. W (x) konstant ist und somit auch f (w (x)) besser konstant ist. W (x) konstant ist, so daß f (z) konstanter ist, so daß w (x) f (z) konstant ist. Somit ist f (w (x)) w (x) c, wobei c eine Konstante ist. Also, f (x) cx wobei c eine Konstante ist, wenn x ein Gewichtswert ist. Das heißt, jedes Gewicht ist ein Vielfaches des vorherigen. Somit nehmen die Gewichte die Form w (x) mbx an. Beachten Sie, dass dies davon ausgeht, dass die einzige Information, die f ist, der letzte aggregierte Wert ist. Beachten Sie, dass an einem gewissen Punkt werden Sie auf diesen Fall reduziert werden, wenn Sie nicht bereit sind, eine nicht konstante Menge an Daten, die Ihre Eingabe zu speichern. Sie können nicht einen unendlichen Längenvektor der reellen Zahlen mit einer reellen Zahl darstellen, aber Sie können sie irgendwie in einer konstanten, endlichen Menge an Speicherung annähern. Aber das wäre nur eine Annäherung. Obwohl ich havent rigoros bewiesen, es ist meine Schlussfolgerung, dass, was Sie wollen, ist unmöglich, mit einem hohen Grad an Präzision zu tun, aber Sie können in der Lage, log (n) Raum (die auch O (1) für viele sein kann Praktische Anwendungen), um eine Qualitätsnäherung zu erzeugen. Sie können sogar noch weniger verwenden. Ich habe versucht, praktisch Code etwas (in Java). Wie gesagt, Ihr Ziel ist nicht erreichbar. Sie können nur den Durchschnitt aus einer Anzahl von zuletzt gespeicherten Werten zählen. Wenn Sie nicht genau sein müssen, können Sie die älteren Werte approximieren. Ich habe versucht, es durch die Erinnerung an die letzten 5 Werte genau und ältere Werte nur SUMmed durch 5 Werte, die Erinnerung an die letzten 5 SUMs. Dann ist die Komplexität O (2n) zum Speichern der letzten nnn Werte. Dies ist eine sehr grobe Annäherung. Sie können die Arraygrößen lastValues ​​und lasAggregatedSums beliebig ändern. Sehen Sie dieses Ascii-Kunstbild, das versucht, ein Diagramm der letzten Werte anzuzeigen, das zeigt, dass die ersten Spalten (ältere Daten) als aggregierter Wert (nicht einzeln) gespeichert werden und nur die frühesten 5 Werte einzeln gespeichert werden. Herausforderung 1. Mein Beispiel zählt nicht Gewichte, aber ich denke, es sollte kein Problem für Sie, Gewichte für die lastAggregatedSums angemessen hinzufügen - das einzige Problem ist, dass, wenn Sie niedrigere Gewichte für ältere Werte wollen, wäre es schwieriger, weil das Array dreht, so ist Es ist nicht einfach zu wissen, welches Gewicht für welche Array-Mitglied. Vielleicht können Sie den Algorithmus ändern, um immer verschieben Werte im Array anstatt zu drehen Dann Hinzufügen von Gewichten sollte kein Problem sein. Herausforderung 2. Die Arrays werden mit 0 Werten initialisiert, und diese Werte zählen bis zum Mittelwert von Anfang an, auch wenn wir nicht genug Werte erhalten. Wenn Sie den Algorithmus für lange Zeit laufen, werden Sie wahrscheinlich nicht stören, dass es das Lernen für einige Zeit am Anfang. Wenn Sie dies tun, können Sie eine Änderung -) beantwortet Antwort # 2 am: Januar 21, 2010, um 15:59 Uhr Ihre Antwort 2017 Stack Exchange, IncThis 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 aktuelle 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 durchschnittlich über den vorherigen N Abtastwerten liegt. Was ist das Durchschnittsalter der einzelnen Proben Es ist N2. 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. Die Lizenzbedingungen finden Sie in der LIZENZ-Datei.

No comments:

Post a Comment