Monday 10 July 2017

Exponentieller Gewichteter Gleitender Durchschnitt Java

Ich habe im Wesentlichen ein Array von Werten wie folgt: Das obige Array ist oversimplified, Im sammeln 1 Wert pro Millisekunde in meinem realen Code und ich muss die Ausgabe auf einem Algorithmus, den ich schrieb, um die nächste Peak vor einem Zeitpunkt zu finden verarbeiten. Meine Logik schlägt fehl, weil in meinem Beispiel oben 0.36 die wahre Spitze ist, aber mein Algorithmus würde rückwärts schauen und sehen die sehr letzte Zahl 0.25 als die Spitze, als theres eine Abnahme zu 0.24 vor ihm. Das Ziel ist, diese Werte zu nehmen und einen Algorithmus auf sie, die glätten sie ein wenig, so dass ich mehr lineare Werte. (Dh: Id wie meine Ergebnisse curvy, nicht jaggedy) Ive wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden. Wie kann ich dies tun Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, gehe ich viel besser mit Code. Wie verarbeite ich Werte in meinem Array, die Anwendung einer exponentiellen gleitenden Durchschnittsberechnung, um sie herauszufordern, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Müssen Sie einige Zustand zu halten und Sie benötigen einen Tuning-Parameter. Dies erfordert eine kleine Klasse (vorausgesetzt, Sie verwenden Java 5 oder höher): Instantiate mit dem Decay-Parameter, die Sie wollen (kann Abstimmung sollte zwischen 0 und 1) und dann mit Average () zu filtern. Beim Lesen einer Seite auf einige mathematische Rekursion, alles, was Sie wirklich wissen müssen, wenn Sie es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben. (Theyve einige andere Anmerkungen außerdem, die nicht helfen.) Jedoch ist die EMA ziemlich einfach, da Sie nur an einen alten Wert erinnern müssen, der keine komplizierten Zustandarrays erfordert. Beantwortet Feb 8 12 at 20:42 TKKocheran: Ziemlich viel. Isn39t es schön, wenn die Dinge einfach sein können (Wenn Sie mit einer neuen Sequenz beginnen, erhalten Sie einen neuen Mittelwert.) Beachten Sie, dass die ersten paar Begriffe in der gemittelten Sequenz um ein bisschen durch Randeffekte springen, aber Sie erhalten diese mit anderen gleitenden Durchschnitten auch. Allerdings ist ein guter Vorteil, dass Sie die gleitende durchschnittliche Logik in die Mittelung einwickeln und experimentieren können, ohne den Rest des Programms zu viel zu stören. Ndash Donal Fellows Ich habe eine harte Zeit, Ihre Fragen zu verstehen, aber ich werde versuchen, trotzdem zu beantworten. 1) Wenn Ihr Algorithmus 0,25 statt 0,36 gefunden hat, dann ist es falsch. Es ist falsch, weil es eine monotone Zunahme oder Abnahme (das ist immer nach oben oder immer nach unten). Wenn Sie ALLE Ihre Daten nicht klassifizieren, sind Ihre Datenpunkte - wie Sie sie darstellen - nichtlinear. Wenn Sie wirklich den maximalen Wert zwischen zwei Zeitpunkten finden wollen, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie das Maximum dieses Unterarrays. 2) Nun ist das Konzept der gleitenden Durchschnitte sehr einfach: vorstellen, dass ich die folgende Liste haben: 1.4, 1.5, 1.4, 1.5, 1.5. Ich kann es glätten, indem ich den Durchschnitt von zwei Zahlen: 1.45, 1.45, 1.45, 1.5. Beachten Sie, dass die erste Zahl ist der Durchschnitt von 1,5 und 1,4 (zweite und erste Zahlen) die zweite (neue Liste) ist der Durchschnitt von 1,4 und 1,5 (dritte und zweite alte Liste) die dritte (neue Liste) der Durchschnitt von 1,5 und 1,4 (Vierte und dritte), und so weiter. Ich könnte es Zeitraum drei oder vier gemacht haben, oder n. Beachten Sie, wie die Daten viel glatter sind. Ein guter Weg, um zu sehen, gleitende Durchschnitte bei der Arbeit ist, gehen Sie zu Google Finance, wählen Sie eine Aktie (versuchen Tesla Motors ziemlich volatil (TSLA)) und klicken Sie auf Technische Daten am unteren Rand des Diagramms. Wählen Sie Moving Average mit einer bestimmten Periode und Exponential gleitenden Durchschnitt, um ihre Differenzen zu vergleichen. Exponentielle gleitende Durchschnitt ist nur eine weitere Ausarbeitung dieser, aber Gewichte die älteren Daten weniger als die neuen Daten ist dies ein Weg, um die Glättung nach hinten auszugleichen. Bitte lesen Sie den Wikipedia-Eintrag. Also, dies ist eher ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu klein. Viel Glück. Wenn Sie Probleme mit der Mathematik haben, könnten Sie mit einem einfachen gleitenden Durchschnitt statt exponentiell gehen. Also die Ausgabe erhalten Sie die letzten x-Terme durch x geteilt werden. Ungetestetes Pseudocode: Beachten Sie, dass Sie die Anfangs - und Endteile der Daten behandeln müssen, da deutlich, dass Sie die letzten 5 Ausdrücke nicht durchschnittlich sind, wenn Sie auf Ihrem 2. Datenpunkt sind. Außerdem gibt es effizientere Methoden, diesen gleitenden Durchschnitt (sum sum - älteste neueste) zu berechnen, aber dies ist, um das Konzept von dem, was passiert, zu bekommen. Antwort # 1 am: August 20, 2010, 09:10:19 pm »Ihre Antwort 2017 Stack Exchange, IncI müssen die letzten 7 Tage Arbeitsstunden in einer Flat-File-Leseschleife zu halten. Seine verwendet werden, um die Ermüdbarkeit von Arbeitsplänen zu messen. Im Moment habe ich etwas, das funktioniert, aber es scheint ziemlich ausführlich und Im nicht sicher, ob theres ein Muster, das mehr prägnant ist. Derzeit habe ich eine Java-Klasse mit einem statischen Array, um die letzten x-Tage-Daten halten, dann, wie ich durch die Datei zu lesen, hacke ich das erste Element und verschieben die anderen 6 (für eine Woche rollen insgesamt) zurück um eins. Die Verarbeitung dieses statischen Arrays erfolgt in seinem eigenen Verfahren, dh. Meine Frage: ist dies eine vernünftige Design-Ansatz, oder gibt es etwas blendend offensichtlich und einfach, diese Aufgabe zu tun Danke Jungs gefragt Aug 30 11 at 14:33 Vielen Dank Jungs: I39ve bekam die Nachricht: Verwenden Sie ein übergeordnetes Objekt und nutzen die Relevante Methoden oder einen Ringpuffer. Große Antworten, alle von ihnen. Wenn Sie darüber nachdenken, benötigen Sie immer Zugriff auf das gesamte Array, so können Sie loswerden, dass erste Eintrag - die ich warn39t 100 sicher von meiner eigenen. I39m erleichtert, dass ich hadn39t verpasste einige 1 Liner und war im Grunde auf eine vernünftige, wenn nicht effizient und knapp Track Dies ist, was ich liebe über diese Website: qualitativ hochwertige, relevante Antworten von Menschen, die ihre sht kennen. Ndash Pete855217 Aug 11, 2010, um 15:05 Uhr Warum initialisieren Sie runningTotal auf null Was ist der Typ, wo es deklariert Es wäre gut, wenn Sie einige Code-Beispiele, die tatsächlichen Java-Code ähneln setzen. Im Übrigen wäre meine Kritik die folgende: Ihre Funktion hat zu viel. Eine Funktion oder Methode sollte zusammenhängend sein. Entsprechend sollten sie eine Sache und eins nur tun. Schlimmer noch, was passiert in Ihrer for-Schleife, wenn x 5 Sie kopieren runningTotal6 in runningTotal5. Aber dann haben Sie zwei Kopien des gleichen Wertes an Position 5 und 6. In Ihrem Design, Ihre Funktion movesshuffles die Elemente in Ihrem Array berechnet die Gesamtausdruck Zeug auf Standard-Fehler liefert die Summe Es tut zu viel. Mein erster Vorschlag ist nicht zu bewegen Zeug um in der Array. Stattdessen implementieren Sie einen kreisförmigen Puffer und verwenden Sie es statt des Arrays. Es vereinfacht Ihren Entwurf. Mein zweiter Vorschlag ist, Dinge in Funktionen zusammenzufassen, die zusammenhängen: haben Sie eine Datenstruktur (ein kreisförmiger Puffer), der Ihnen erlaubt, es hinzuzufügen (und das den ältesten Eintrag sinkt, wenn es seine Kapazität erreicht hat) Interator haben eine Funktion, die die Summe auf dem Iterator berechnet (Sie dont care, wenn Sie die Summe aus einem Array, Liste oder kreisförmigen bufer.) Dont nennen es insgesamt. Nennen Sie es Summe, die ist, was Sie berechnen. Das ist, was Id tun :) That39s große info luis, aber denken Sie daran, diese Funktion ist ein kleiner Teil der Funktionalität der Klasse, und es wäre Overkill zu viel Code hinzufügen, um es perfekt. Sie sind technisch korrekt, und ich verstehe, dass mein Code zu viel 39 macht, aber gleichzeitig ist es manchmal besser, auf der Seite des kleineren, klareren Codes zu irren als für Perfektion zu gehen. Angesichts meiner Java-Fähigkeiten, auch die Herstellung der Pseudocode Sie beschreiben kompilieren würde ich blasen mein Budget auf diese (), aber danke für die klare Beschreibung. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, es geht nicht um Perfektion, sondern um etablierte industrielle Praktiken, die wir seit den letzten 3 Jahrzehnten kennen. Sauberer Code ist immer einer, der partitioniert ist. Wir haben jahrzehntelange Evidenz, die zeigen, dass dies der Weg ist, um in den allgemeinen Fall zu gehen (in Bezug auf Kosteneffizienz, Defektverkleinerung, Verständnis usw.). Es sei denn, es ist Wegwerf-Code für eine einmalige Art der Sache. Es ist niemals teuer, dies zu tun, wenn man auf diese Weise eine Problemanalyse startet. Codierung 101, brechen das Problem und der Code folgt, weder Overkill noch schwierig) ndash luis. espinal Ihre Aufgabe ist zu einfach und die Vorgehensweise Sie angenommen haben, ist sicherlich gut für den Job. Allerdings, wenn Sie ein besseres Design verwenden möchten, müssen Sie loszuwerden, dass alle die Anzahl der Bewegung Sie besser eine FIFO-Warteschlange und machen gute Verwendung von Push-und Pop-Methoden, die Art und Weise der Code reflektiert keine Datenbewegung, nur die beiden logischen Aktionen Von neuen Daten und entfernen Sie Daten, die älter als 7 Tage sind. Beantwortet Aug 30 11 um 14: 49Erwerben der exponentiell gewichteten Moving Average Volatilität ist die häufigste Maßnahme des Risikos, aber es kommt in mehreren Geschmacksrichtungen. In einem früheren Artikel haben wir gezeigt, wie man einfache historische Volatilität berechnet. (Um diesen Artikel zu lesen, lesen Sie unter Verwenden der Volatilität, um zukünftiges Risiko zu messen.) Wir verwendeten Googles tatsächlichen Aktienkursdaten, um die tägliche Volatilität basierend auf 30 Tagen der Bestandsdaten zu berechnen. In diesem Artikel werden wir auf einfache Volatilität zu verbessern und diskutieren den exponentiell gewichteten gleitenden Durchschnitt (EWMA). Historische Vs. Implied Volatility Erstens, lassen Sie diese Metrik in ein bisschen Perspektive. Es gibt zwei breite Ansätze: historische und implizite (oder implizite) Volatilität. Der historische Ansatz geht davon aus, dass Vergangenheit ist Prolog Wir messen Geschichte in der Hoffnung, dass es prädiktive ist. Die implizite Volatilität dagegen ignoriert die Geschichte, die sie für die Volatilität der Marktpreise löst. Es hofft, dass der Markt am besten weiß und dass der Marktpreis, auch wenn implizit, eine Konsensschätzung der Volatilität enthält. (Für verwandte Erkenntnisse siehe Die Verwendungen und Grenzen der Volatilität.) Wenn wir uns auf die drei historischen Ansätze (auf der linken Seite) konzentrieren, haben sie zwei Schritte gemeinsam: Berechnen Sie die Reihe der periodischen Renditen Berechnen die periodische Rendite. Das ist typischerweise eine Reihe von täglichen Renditen, bei denen jede Rendite in kontinuierlich zusammengesetzten Ausdrücken ausgedrückt wird. Für jeden Tag nehmen wir das natürliche Protokoll des Verhältnisses der Aktienkurse (d. H. Preis heute geteilt durch den Preis gestern und so weiter). Dies erzeugt eine Reihe von täglichen Renditen, von u i bis u i-m. Je nachdem wie viele Tage (m Tage) wir messen. Das bringt uns zum zweiten Schritt: Hier unterscheiden sich die drei Ansätze. Wir haben gezeigt, dass die einfache Varianz im Rahmen einiger akzeptabler Vereinfachungen der Mittelwert der quadratischen Renditen ist: Beachten Sie, dass diese Summe die periodischen Renditen zusammenfasst und dann diese Summe durch die Anzahl der Tage oder Beobachtungen (m). Also, seine wirklich nur ein Durchschnitt der quadrierten periodischen kehrt zurück. Setzen Sie einen anderen Weg, jede quadratische Rückkehr wird ein gleiches Gewicht gegeben. Also, wenn alpha (a) ein Gewichtungsfaktor (speziell eine 1m) ist, dann eine einfache Varianz sieht etwa so aus: Die EWMA verbessert auf einfache Varianz Die Schwäche dieser Ansatz ist, dass alle Renditen das gleiche Gewicht zu verdienen. Yesterdays (sehr jüngste) Rückkehr hat keinen Einfluss mehr auf die Varianz als die letzten Monate zurück. Dieses Problem wird durch Verwendung des exponentiell gewichteten gleitenden Mittelwerts (EWMA), bei dem neuere Renditen ein größeres Gewicht auf die Varianz aufweisen, festgelegt. Der exponentiell gewichtete gleitende Durchschnitt (EWMA) führt Lambda ein. Die als Glättungsparameter bezeichnet wird. Lambda muss kleiner als 1 sein. Unter dieser Bedingung wird anstelle der gleichen Gewichtungen jede quadratische Rendite durch einen Multiplikator wie folgt gewichtet: Beispielsweise neigt die RiskMetrics TM, eine Finanzrisikomanagementgesellschaft, dazu, eine Lambda von 0,94 oder 94 zu verwenden. In diesem Fall wird die erste ( (1 - 0,94) (94) 0 6. Die nächste quadrierte Rückkehr ist einfach ein Lambda-Vielfaches des vorherigen Gewichts in diesem Fall 6 multipliziert mit 94 5,64. Und das dritte vorherige Tagegewicht ist gleich (1-0,94) (0,94) 2 5,30. Das ist die Bedeutung von exponentiell in EWMA: jedes Gewicht ist ein konstanter Multiplikator (d. h. Lambda, der kleiner als eins sein muß) des vorherigen Gewichtes. Dies stellt eine Varianz sicher, die gewichtet oder zu neueren Daten voreingenommen ist. (Weitere Informationen finden Sie im Excel-Arbeitsblatt für die Googles-Volatilität.) Der Unterschied zwischen einfacher Volatilität und EWMA für Google wird unten angezeigt. Einfache Volatilität wiegt effektiv jede periodische Rendite von 0,196, wie in Spalte O gezeigt (wir hatten zwei Jahre täglich Tageskursdaten, das sind 509 tägliche Renditen und 1509 0,196). Aber beachten Sie, dass die Spalte P ein Gewicht von 6, dann 5,64, dann 5,3 und so weiter. Das ist der einzige Unterschied zwischen einfacher Varianz und EWMA. Denken Sie daran: Nachdem wir die Summe der ganzen Reihe (in Spalte Q) haben wir die Varianz, die das Quadrat der Standardabweichung ist. Wenn wir Volatilität wollen, müssen wir uns daran erinnern, die Quadratwurzel dieser Varianz zu nehmen. Was ist der Unterschied in der täglichen Volatilität zwischen der Varianz und der EWMA im Googles-Fall? Bedeutend: Die einfache Varianz gab uns eine tägliche Volatilität von 2,4, aber die EWMA gab eine tägliche Volatilität von nur 1,4 (Details siehe Tabelle). Offenbar ließ sich die Googles-Volatilität in jüngster Zeit verringern, so dass eine einfache Varianz künstlich hoch sein könnte. Die heutige Varianz ist eine Funktion der Pior Tage Variance Youll bemerken wir benötigt, um eine lange Reihe von exponentiell sinkenden Gewichte zu berechnen. Wir werden die Mathematik hier nicht durchführen, aber eine der besten Eigenschaften der EWMA ist, daß die gesamte Reihe zweckmäßigerweise auf eine rekursive Formel reduziert: Rekursiv bedeutet, daß heutige Varianzreferenzen (d. h. eine Funktion der früheren Tagesvarianz) ist. Sie können diese Formel auch in der Kalkulationstabelle zu finden, und es erzeugt genau das gleiche Ergebnis wie die Langzeitberechnung Es heißt: Die heutige Varianz (unter EWMA) ist gleichbedeutend mit der gestrigen Abweichung (gewichtet mit Lambda) plus der gestrigen Rückkehr (gewogen durch ein Minus-Lambda). Beachten Sie, wie wir sind nur das Hinzufügen von zwei Begriffe zusammen: gestern gewichtet Varianz und gestern gewichtet, quadriert zurück. Dennoch ist Lambda unser Glättungsparameter. Ein höheres Lambda (z. B. wie RiskMetrics 94) deutet auf einen langsameren Abfall in der Reihe hin - in relativer Hinsicht werden wir mehr Datenpunkte in der Reihe haben, und sie fallen langsamer ab. Auf der anderen Seite, wenn wir das Lambda reduzieren, deuten wir auf einen höheren Abfall hin: die Gewichte fallen schneller ab, und als direkte Folge des schnellen Zerfalls werden weniger Datenpunkte verwendet. (In der Kalkulationstabelle ist Lambda ein Eingang, so dass Sie mit seiner Empfindlichkeit experimentieren können). Zusammenfassung Volatilität ist die momentane Standardabweichung einer Aktie und die häufigste Risikomessung. Es ist auch die Quadratwurzel der Varianz. Wir können Varianz historisch oder implizit messen (implizite Volatilität). Bei der historischen Messung ist die einfachste Methode eine einfache Varianz. Aber die Schwäche mit einfacher Varianz ist alle Renditen bekommen das gleiche Gewicht. So stehen wir vor einem klassischen Kompromiss: Wir wollen immer mehr Daten, aber je mehr Daten wir haben, desto mehr wird unsere Berechnung durch weit entfernte (weniger relevante) Daten verdünnt. Der exponentiell gewichtete gleitende Durchschnitt (EWMA) verbessert die einfache Varianz durch Zuordnen von Gewichten zu den periodischen Renditen. Auf diese Weise können wir beide eine große Stichprobengröße, sondern auch mehr Gewicht auf neuere Renditen. (Um ein Film-Tutorial zu diesem Thema zu sehen, besuchen Sie die Bionic Turtle.)


No comments:

Post a Comment