Monday 10 April 2017

Berechnen Sie Exponentiell Gleitenden Durchschnitt Java

Ihre innere für iteriert alle Array so thats, warum Sie immer den gleichen Durchschnitt (die für die gesamte Array), sollten Sie iterieren von 0 auf die aktuelle Zahl der äußeren für statt. Ihr gleitender Durchschnitt wird aktualisiert, basierend auf j Ihrer inneren für das bedeutet, dass es vorherige Werte überschreibt jede neue Schleife, sollte dies innerhalb der äußeren für statt der inneren mit i als Index sein. Sie teilen sumj, um Mittelwerte zu berechnen, jede neue innere Schleife j Sie teilen durch 0 die erste Summe. Ich glaube, Sie wollten j1 verwenden, Index ist nicht das gleiche wie aktuelle Länge Tipps zur Fehlerbehebung: Vermeiden Sie die Verwendung von Variablen zu Loop-Arrays, sollten Sie array. length stattdessen verwenden. Für eine Frage der Reproduktion Ihres Problems könnten Sie uns das isolierte Problem anstelle des aktuellen Codes. Dh: Stellen Sie sich vor, wenn der Fehler in Ihren Eingaben ist, wie könnten wir glauben, dass Sie wirklich verwendet sie beantwortet werden Sie sind Looping über alle Daten jedes Mal. Sie sollten für (int j (igtaverageLengthi-averageLength2: 0) jlt iaverageLength2 ampamp jltnumDataPoints j) (oder etwas ähnliches) für Ihren innersten Durchschnitt haben. Auch MovingAverageisumj sollte modifiziert werden, um den Fall zu behandeln, wenn j 0 ist. Insbesondere sollte es wahrscheinlich movingAverageisumaverageLength sein und es sollte auf den movingAveragei-Slot außerhalb der Mittelungsschleife angewendet werden. Antwortete Oct 4 13 am 20:42 Nächstes Mal, nehmen Sie die Kommentare über die Zuweisung aus der Frage, bevor Sie es. Aber da Sie scheinen ziemlich neu in diesem, darüber nachzudenken, wie würden Sie durch die Daten gehen, und machen es tun. Sie sollten sicherstellen, dass jede Schleife an dem richtigen Punkt stoppt, und denken Sie daran, dass wenn Sie stoppen würden, wenn es keine Zahlen mehr gibt (wie wenn Sie die innere Schleife machen und nur 3 weitere Zahlen anstelle von 4 erhalten können) Muss das Programm auch stoppen. Stellen Sie sicher, dass Ihr Code für diese Überprüfung ist. Antwortete ohne weitere Details, benötigen Sie wahrscheinlich einen ungewichteten gleitenden Durchschnitt. An einem beliebigen Punkt Ai im Eingabefeld A der Länge N (mit 0ltiltN) ist das einfach der Mittelwert der vorherigen K Einträge des Arrays, bis zu und einschließlich Ai. Wenn es arent K solche Werte, dann die durchschnittlichen (i1) Werte von A0 bis Ai. Einschließlich. Ein wenig Gedanke zeigt Ihnen, dass Sie nicht alle K-Werte addieren müssen jedes Mal. Halten Sie einfach die Summe, und beim Bewegen zum nächsten Punkt (dies ist ein gleitender Durchschnitt), subtrahieren Sie den Wert, der ersetzt wird, und fügen Sie den neuen Wert hinzu, der es ersetzt. (Bei den ersten K-1 Punkten fügen Sie einfach den neuen Wert zur Summe hinzu und erhöhen Sie den Zähler um 1.) Der gleitende Durchschnitt ist an jedem Punkt der aktuelle Summe dividiert durch den aktuellen Zählwert. In einem gleitenden Durchschnitt, müssen Sie eine Art von Fenstergröße haben. Ihre Fenstergröße ist averageLength, so wird es etwa so aussehen: Die for-Schleife startet bei den aktuellen Daten und geht zurück AverageLength Datenpunkte und fügt sie hinzu. Sie haben nur einen gleitenden Durchschnitt, wenn Sie haben, wenn Sie genügend Datenpunkte haben und der Durchschnitt wird die Summe geteilt durch die durchschnittliche Länge haben. Hinweis: Nicht getestet nur Sudo-Code, aber dies ist die Idee. Antwort # 2 am: Mai 23, 2010, 07:10:01 am »Ihre Antwort 2017 Stack Exchange, IncI im Wesentlichen eine Reihe von Werten wie folgt: Das obige Array ist vereinfacht, Im sammeln 1 Wert pro Millisekunde in meinem realen Code und ich muss die Ausgabe auf einem Algorithmus zu verarbeiten Ich schrieb, um die nächste Spitze vor einem Zeitpunkt zu finden. 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: Mai 23, 2010, 07:10:19 pm »Wie Sie es berechnen Kalkulation Exponential Moving Average - ein Tutorial Exponential Moving Average (kurz: EMA) ist einer der am meisten verwendeten Indikatoren in der technischen Analyse heute. Aber wie berechnen Sie es für sich selbst, mit einem Papier und einem Stift oder 8211 bevorzugt 8211 ein Tabellenkalkulationsprogramm Ihrer Wahl. Läßt Sie herausfinden, in dieser Erklärung der EMA Berechnung. Die Berechnung von Exponential Moving Average (EMA) wird natürlich automatisch von den meisten Trading-und technische Analyse-Software da draußen heute. Hier ist, wie man es manuell berechnen, die auch das Verständnis auf, wie es funktioniert. In diesem Beispiel berechnen wir die EMA für den Preis einer Aktie. Wir wollen eine 22 Tage EMA, die eine gemeinsame Zeitrahmen für eine lange EMA ist. Die Formel für die Berechnung der EMA ist wie folgt: EMA (y) (1 8211 k) t heute, y gestern, N Anzahl der Tage in EMA, k 2 (N1) Verwenden Sie die folgenden Schritte, um eine 22 zu berechnen Tag EMA: 1) Beginnen Sie mit der Berechnung von k für den angegebenen Zeitrahmen. 2 (22 1) 0,0869 2) Fügen Sie die Schlusskurse für die ersten 22 Tage zusammen und teilen sie durch 22. 3) Sie sind nun bereit, den ersten EMA-Tag zu erhalten, indem Sie die folgenden Tage (Tag 23) Schlusskurs multipliziert Durch k. Dann multiplizieren Sie die vorherigen Tage gleitenden Durchschnitt durch (1-k) und fügen Sie die beiden. 4) Machen Sie Schritt 3 über und über für jeden Tag, der folgt, um das gesamte Spektrum der EMA zu erhalten. Dies kann natürlich in Excel oder einige andere Kalkulationstabellen-Software, um den Prozess der Berechnung von EMA halbautomatischen gesetzt werden. Um Ihnen einen algorithmischen Überblick zu geben, wie dies erreicht werden kann, siehe unten. Public float CalculateEMA (Float todaysPrice, float numberOfDays, float EMAYesterday) float k 2 (numberOfDays 1) Rückkehr todaysPrice k EMAYesterday (1 8211 k) Diese Methode wird typischerweise aus einer Schleife durch Ihre Daten aufgerufen und sieht so aus: foreach (DailyRecord Sdr in DataRecords) rufen Sie die EMA-Berechnung ema CalculateEMA (sdr. Close, numberOfDays, yesterdayEMA) setzen die berechnete ema in einem Array memaSeries. Items. Add (sdr. TradingDate, ema) stellen Sie sicher, dass yesterdayEMA mit der EMA wir diese Zeit verwendet gefüllt Um yesterdayEMA ema Beachten Sie, dass dies psuedo-Code ist. Normalerweise müssen Sie den gestern CLOSE-Wert als yesterdayEMA senden, bis der yesterdayEMA von der heutigen EMA berechnet wird. Das geschieht nur, nachdem die Schleife mehr Tage als die Zahl von Tagen durchgeführt hat, die Sie Ihr EMA für berechnet haben. Für ein 22 Tage EMA, seine nur auf die 23 Zeit in der Schleife und danach die yesterdayEMA ema gültig ist. Dies ist keine große Sache, da Sie Daten von mindestens 100 Börsentagen für eine 22 Tage EMA gültig sein müssen. zusammenhängende Posts


No comments:

Post a Comment