Saturday 18 November 2017

Berechnen Exponentiell Gleitend Durchschnittlich Java


EMA 8211 Wie man es berechnen Berechnung des exponentiellen Moving Average - ein Tutorial Exponetial Moving Average (kurz EMA) ist eines der am häufigsten verwendeten Indikatoren in der technischen Analyse heute. Aber wie berechnen Sie es für sich selbst, mit einem Papier und einem Stift oder 8211 bevorzugte 8211 ein Tabellenkalkulationsprogramm Ihrer Wahl. Erfahren Sie in dieser Erklärung der EMA-Berechnung. Die Berechnung des exponentiellen Moving Average (EMA) erfolgt selbstverständlich automatisch durch die meisten handels - und technischen Analysesoftware da draußen. Hier ist, wie man es manuell zu berechnen, was auch das Verständnis auf, wie es funktioniert In diesem Beispiel werden wir die EMA für den Preis einer Aktie berechnen. Wir wollen eine 22-tägige EMA, die für eine lange EMA ein gemeinsamer Zeitrahmen ist. Die Formel für die Berechnung der EMA lautet wie folgt: EMA Preis (t) k 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üge die Schlusskurse für die ersten 22 Tage zusammen und teile sie mit 22. 3) Du bist jetzt bereit, den ersten EMA-Tag zu beginnen, indem ich die folgenden Tage (Tag 23) Schlusskurs multipliziert hast Von k. Dann multiplizieren Sie die vorherigen Tage gleitenden Durchschnitt von (1-k) und fügen Sie die beiden. 4) Führen Sie Schritt 3 über und über für jeden Tag, der folgt, um die gesamte Palette von EMA zu bekommen. Dies kann natürlich in Excel oder eine andere Tabellenkalkulation Software, um den Prozess der Berechnung EMA halbautomatischen gesetzt werden. Um Ihnen eine algorithmische Sicht auf, wie dies erreicht werden kann, siehe unten. Public float CalculateEMA (float todaysPrice, float numberOfDays, float EMAYesterday) float k 2 (numberOfDays 1) Rückkehr todaysPreice k EMAYesterday (1 8211 k) Diese Methode würde typischerweise aus einer Schleife durch Ihre Daten aufgerufen werden, so etwas wie folgt aussehen: foreach (DailyRecord Sdr in DataRecords) rufen Sie die EMA-Berechnung an ema CalculateEMA (sdr. Close, numberOfDays, yesterdayEMA) setzen Sie das berechnete ema in ein Array memaSeries. Items. Add (sdr. TradingDate, ema) stellen Sie sicher, dass gestern mit dem EMA gefüllt wird, das wir dieses Mal benutzt haben Um yesterdayEMA ema Beachten Sie, dass dies Psuedo-Code ist. Sie müssten in der Regel den gestern SCHLIESSEN-Wert als gesternEMA senden, bis der gestern von der heutigen EMA berechnet wird. Das passiert nur, nachdem die Schleife mehr Tage gelaufen ist als die Anzahl der Tage, an denen du deine EMA berechnet hast. Für eine 22-tägige EMA, seine nur auf die 23 Zeit in der Schleife und danach, dass die gestern EMA ema gültig ist. Dies ist keine große Sache, da Sie Daten von mindestens 100 Handelstagen für eine 22 Tage EMA benötigen, um gültig zu sein. Related PostsI im Wesentlichen haben eine Reihe von Werten wie folgt: Das oben genannte Array ist vereinfacht, 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 Spitze vor einem Zeitpunkt zu finden zu verarbeiten. Meine Logik scheitert, weil in meinem Beispiel oben, 0.36 ist die reale Spitze, aber mein Algorithmus würde nach hinten schauen und sehen die letzte Zahl 0,25 als die Spitze, als theres eine Abnahme auf 0,24 vor ihm. Das Ziel ist, diese Werte zu nehmen und einen Algorithmus an sie anzuwenden, der sie ein bisschen glättet, so dass ich mehr lineare Werte habe. (Dh: Id wie meine Ergebnisse zu curvy, nicht Jaggedy) Ive wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden. Wie kann ich das tun? Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, ich mache viel besser mit Code. Wie verarbeite ich Werte in meinem Array, indem du eine exponentielle gleitende durchschnittliche Berechnung anwende, um sie herauszufordern, um den 8. Februar 12 um 20:27 zu bitten, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Du musst einen Zustand halten und du brauchst einen Tuning-Parameter. Dies fordert eine kleine Klasse (vorausgesetzt, du bist mit Java 5 oder höher): Instantiieren Sie mit dem Zerfallsparameter, den Sie wollen (kann die Abstimmung zwischen 0 und 1) und dann mit durchschnittlichen () zu filtern. Beim Lesen einer Seite auf einige mathematische Wiederholung, alles, was Sie wirklich wissen müssen, wenn es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben. (Sie haben auch ein paar andere Notationen, was nicht hilft.) Allerdings ist die EMA ziemlich einfach, da man sich nur an einen alten Wert erinnern muss, keine komplizierten Zustand Arrays erforderlich. Antwortete Feb 8 12 um 20:42 TKKocheran: Ziemlich viel. Isn39t es schön, wenn es einfach sein kann (wenn man mit einer neuen Sequenz beginnt, bekomme du einen neuen Mittelwert.) Beachten Sie, dass die ersten paar Begriffe in der gemittelten Sequenz ein bisschen wegen der Brenneffekte umgehen werden, aber man bekommt diese mit anderen gleitenden Durchschnitten auch. Allerdings ist ein guter Vorteil, dass man die gleitende durchschnittliche Logik in den Mittelalter einpacken und experimentieren kann, ohne den Rest deines Programms zu stark zu stören. Ndash Donal Fellows Feb 9 12 at 0:06 Ich habe eine harte Zeit, Ihre Fragen zu verstehen, aber ich werde versuchen, trotzdem zu antworten. 1) Wenn dein Algorithmus 0,25 statt 0,36 gefunden hat, dann ist es falsch Es ist falsch, weil es eine monotone Zunahme oder Abnahme annimmt (das geht immer nach oben oder immer nach unten). Es sei denn, du durchschnittst alle deine Daten, deine Datenpunkte - wie du sie präsentierst - sind nichtlinear. Wenn Sie wirklich wollen, um den maximalen Wert zwischen zwei Punkten in der Zeit zu finden, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie die max dieser Subarray. 2) Nun ist das Konzept der gleitenden Durchschnitte sehr einfach: Stellen Sie sich vor, dass ich die folgende Liste habe: 1.4, 1.5, 1.4, 1.5, 1.5. Ich kann es glatt machen, 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 hätte es mal drei oder vier machen können, oder n. Beachten Sie, wie die Daten viel glatter sind. Ein guter Weg, um gleitende Durchschnitte bei der Arbeit zu sehen, ist, zu Google Finance zu gehen, eine Aktie auszuwählen (Tesla Motors ziemlich flüchtig (TSLA) auszuprobieren) und klicken Sie auf die Technik am unteren Rand des Diagramms. Wählen Sie Moving Average mit einem bestimmten Zeitraum und Exponential gleitenden Durchschnitt, um ihre Unterschiede zu vergleichen. Exponentieller gleitender Durchschnitt ist nur eine weitere Ausarbeitung von diesem, aber gewichtet die älteren Daten weniger als die neuen Daten ist dies ein Weg, um die Glättung nach hinten voranzutreiben. Bitte lesen Sie den Wikipedia-Eintrag. Also, das ist mehr ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu winzig. Viel Glück. Wenn du Schwierigkeiten mit der Mathematik hast, könntest du mit einem einfachen gleitenden Durchschnitt anstatt exponentiell gehen. Also die Ausgabe, die du bekommst, wäre die letzten x Begriffe geteilt durch x. Ungetesteter Pseudocode: Beachten Sie, dass Sie die Start - und Endteile der Daten behandeln müssen, da Sie deutlich die letzten 5 Begriffe haben, wenn Sie auf Ihrem 2. Datenpunkt sind. Auch gibt es effizientere Möglichkeiten, diesen gleitenden Durchschnitt zu berechnen (Summsumme - älteste neueste), aber das ist es, das Konzept zu bekommen, was passiert. Antwortete am 8. Februar 12 um 20: 41Was ist AvgOldValue jetzt (nein, es ist nicht in deinem Code definiert) Bitte don39t anwenden schlampige Quotch-Bearbeitungen auf den gebuchten Code, der nur noch mehr Fehler einbringt. Posten Sie den echten Code, den Sie verwenden. Don39t erstellen Sie eine spezielle Version, die Sie abgeleitet haben, um hier zu posten. Gib uns das Richtige Auf diese Weise bekommst du eine echte Bewertung. Ndash I39ll Kommentare hinzufügen morgen Aug 31 16 at 23:08 Ihre Variablennamen sind alle sub-par. Warum die unnötigen Abkürzungen (f. e. Avg) Warum die ungeraden Präfixe (f. e. lValue) Hier ist meine einfache und ultimative Spitze, wenn es um Namen geht: Sagen Sie nach dem, was sie tun oder was sie enthalten. Und meine letzte Regel: Du darfst niemals einen Buchstaben Variablennamen verwenden, mit der einzigen Ausnahme von Dimenstionen. Das ist ein Paradebeispiel für einen nicht hilfreichen Kommentar. Insgesamt sehe ich nicht, warum deine Klasse statisch ist. Es scheint, dass es wie eine Instanzklasse verwendet wird, aber du willst nicht die Referenz umgeben, du hast einfach ein Singleton hier erstellt. Erwägen Sie, eine Instanzklasse zu erstellen und dann die Referenzinstanz an die Threads weiterzugeben, die diese Instanz teilen. Java Gleitender Durchschnitt Methode Wenn Sie nach einer EMA suchen, die für Streaming-Daten optimiert ist, die aus einer Datei oder einem Quoting-Service stammen, wird die folgende Beispielklasse durchgeführt Sie gut, im Gegensatz zu der Verwendung von Brute-Force-Berechnungen. Dieser Ansatz ist besonders nützlich, wenn Sie Daten in Echtzeit verarbeiten. EMAs, ein spezieller Fall von gewichteten gleitenden Durchschnitten, haben den Vorteil, dass die relative Gewichtung für jede aufeinanderfolgende Periode um einen konstanten Faktor f 2 (N1) abnimmt, wobei N die Anzahl der Perioden ist, über die die EMA angewendet werden soll. Angesichts dieser Tatsache können Sie die aktuelle EMA (dh für die aktuelle Periode) mit der folgenden iterativen Formel berechnen: eman fprice (1-f) eman-1 Die folgende Beispielklasse implementiert diese iterative Natur von EMA und minimiert die rechnerischen Anforderungen an brute - Kraftmethoden oder Nachverarbeitungsmethoden. Private int numPeriods 0 private int totalPeriods 0 private double runningEMA 0.0 private double factor 0.0 public EMA (int numPeriods) this. numPeriods numPeriods factor 2.0 (numPeriods 1.0) Rücksetzen von Berechnungen zur Erzeugung von EMA für den angegebenen Zeitraum. Public void reset (int numPeriods) Gibt EMA für den Zeitraum zurück, der während des Konstruktors definiert ist. Wenn verarbeitete Perioden kleiner als der EMA-Bereich sind, wird Null zurückgegeben. Public double calculate (double price) runningEMA factorprice (1-Faktor) runningEMA if (totalPeriods lt numPeriods) Von wo du die Preisdaten kommst und was du mit den EMA-Ergebnissen machst, liegt bei dir. Zum Beispiel, wenn Sie die Preisdaten in einem Array hatten und eine EMA in ein anderes Array berechnen möchten, wird das folgende Snippet funktionieren: doppelte Preise. Aus den Berechnungen, der Datei oder dem Zitierdienst doppelte Ema neue Doppelpreise. Länge EMA ema neue EMA (50) 50 Periode EMA für (int idx0 iltprices. length idx) emaidx ema (pricesidx) Viel Glück und beste Wünsche für Ihr Projekt.

No comments:

Post a Comment