Berechnen Exponential Moving Average In Sql
SQL kommt nicht mit vielen analytischen Funktionen, und wenn ein Benutzer analytische Berechnungen in der Datenbank durchführen möchte, muss man eine große Anzahl von gespeicherten Prozeduren oder Funktionen schreiben. Dies ist eine einfache Möglichkeit, einen exponentiellen gleitenden Durchschnitt zu erstellen, der für eine Anzahl von Zwecken verwendet werden kann. Diese Umsetzung konzentriert sich auf Marktdaten. Exponential Moving Averages - Was ist das eine exponentielle gleitende Durchschnitte, die allgemein als EMA oder manchmal der EWMA, Exponentially Moving Average Weighted ist ein gleitender Durchschnitt, wobei die Gewichte der jüngsten Datenpunkt sind wichtiger als entfernter Datenpunkt. In einem einfachen gleitenden Durchschnitt haben alle Beobachtungen das gleiche Gewicht. EMA sind in Finanzanwendungen beliebt, in denen festgestellt werden kann, dass Risk Metrics einen Satz von EMA verwendet, um Value-at-Risk zu berechnen. Es ist auch ziemlich häufig in Anwendungen der technischen Analyse, da es als weniger hinken als gewöhnliche gleitende Durchschnitte wahrgenommen wird. Verglichen mit dem einfachen gleitenden Durchschnitt (SMA) hat eine EMA auch einen Parameter. Während das SMA das Rückblickfenster als einzigen Parameter hat, besitzt ein EMA einen Glättungsfaktor als Hauptparameter. Der Glättungsfaktor kann leicht in einen Halbwertfaktor umgewandelt werden, der sich auf die Anzahl der Tage bezieht. Die Formel für EMA ist besonders effizient für Berechnungen, da sie mit dem früheren EMA-Wert und den neuen Informationen vervollständigt werden kann. Hierbei handelt es sich um Finanzdaten, bei denen wir die EMA auf einer Reihe von Schlusskursen berechnen. Wo ist der heutige Preis, ist Zeit und ist der Zerfallsfaktor. Kleiner oder gleich 1 ist und die EMA normalerweise nicht für einen Zeitraum von weniger als 2 definiert ist. In den meisten Fällen wird der Startwert auf den aktuellen Preis auf gesetzt. Beispielimplementierung unter Verwendung von Cursors Unten ist ein Codebeispiel, das für die Implementierung der EMA in T-SQL verwendet wird, wobei SQL Server 2008 verwendet wird, aber es sollte auch mit früheren Versionen von SQL Server kompatibel sein. Beachten Sie, dass die Funktion vom Längenparameter, der der Halbwertszeit entspricht, abhängt. Dies wird im Glättungsfaktor in der ersten Zeile umgewandelt. Während die Implementierung Cursor verwendet, könnte man auch implementieren dies ist ein sauberer Weg mit inneren Joins. Für große Datensätze sind diese jedoch sowohl zeitaufwendig als auch speicherintensiv. Glättung (2 (Länge 1)) SET Signalname Signalname Umwandlung (varchar (15), konvertieren (int. Länge)) SET-Cursor CURSOR FOR SELECT A. Datum. A. Schließen FROM dbo. Marktdaten A WHERE A. Marktmarkt und A. Datum zwischen Startdatum und Enddatum ORDER BY A. Datum OPEN-Cursor FETCH NEXT Vom Cursor INTO date. Schliessen WHILE FETCHSTATUS 0 BEGIN Wenn expaverage null ist SET expaverage close ELSE SET expaverage expaverage smoothing (close - expaverage) INSERT INTO Ergebnis (Datum schließen Sie das Signal) SELECT date. schließen. Expaverage Signalname FETCH NEXT Vom Cursor INTO Datum. Close ENDWir hatten die Herausforderung, die 20 (Handelstage) Exponential Moving Average (EMA) in unserem Datenmodell in PowerPivot einzusetzen. Hier ist die EMA Formel und Beispieltabelle: stockchartsschooldoku. phpidchartschool: technicalindicators: movingaverages die Formel hier Pasted für Bequemlichkeit: SMA (Simple Moving Average): 10 Periode Summe 10 Multiplier: 2 (Zeitraum 43 1)) EMA: x Multiplikator 43 EMA (Vorheriger tag). Beispieltabelle stockchartsschooldatamediachartschooltechnicalindicatorsandoverlaysmovingaveragescs-movavg. xls In unserem Modell haben die Faktentabelle diese Spalten: Symbol Datum Eröffnung Hoch Tief Schluss Volumen Und in der Kalender-Tabelle weve identifiziert die Handelstage (CalendarTradingDayNumber) als 1, so können wir sie wieder verlassen. Wir wollen die EMA berechnet Feld in einer Pivot-Tabelle wie dieser Filter Kontext: ein Datum ausgewählt auf CalendarFullDate Row Kontext: FactTableSymbol Werte: FactTableClose FactTableEMA 20D gtgt Bisher bekamen wir diese berechneten Felder fehlt: Ema Multiplier 2 (Periode 43 1) Durchschnitt 20D SCHLIEßEN IF (Summe der CLOSEBLANK (), BLANK (), (CALCULATE (MITTELWERT (FactTableCLOSE), FILTER (ALL (Kalender), CalendarTradingDayNumberltMAX (CalendarTradingDayNumber) ampamp CalendarTradingDayNumbergtMAX (CalendarTradingDayNumber) - Periode)))) Aber es die EMA Formel sieht aus wie enthält Eine Selbstreferenz aus früheren Werten, und sie beginnt auch mit einem SMA (Average 20D CLOSE) Wert. Wie können wir es tun Vielen Dank im Voraus. Ich schätze Ihre Unterstützung sehr. Samstag, 19. Juli 2014 09:42 PMIm versucht, einen exponentiellen gleitenden Durchschnitt (EMA) auf postgres zu implementieren, aber da ich die Dokumentation überprüfe und darüber nachdenke, desto mehr versuche ich, je mehr ich verwirrt bin. Die Formel für EMA (x) ist: Es scheint für einen Aggregator perfekt zu sein, wobei das Ergebnis des zuletzt berechneten Elements genau das ist, was hier zu tun ist. Allerdings erzeugt ein Aggregator ein einziges Ergebnis (wie reduzieren oder falten) und hier benötigen wir eine Liste (eine Spalte) der Ergebnisse (als Karte). Ich habe überprüft, wie Verfahren und Funktionen funktionieren, aber AFAIK sie produzieren eine einzige Ausgabe, nicht eine Spalte. Ich habe viele Verfahren und Funktionen gesehen, aber ich kann nicht wirklich herausfinden, wie diese Interaktion mit relationalen Algebra, vor allem, wenn so etwas wie eine EMA. Ich habe nicht viel Glück auf der Suche nach der Internets so weit. Aber die Definition für eine EMA ist ganz einfach, ich hoffe, dass es möglich ist, diese Definition in etwas zu übersetzen, das in postgres funktioniert und einfach und effizient ist, denn der Umzug nach NoSQL wird in meinem Kontext übertrieben. Ist dies die Berechnung der Aggregation, die das Ergebnis in jeder Zeile für jede Unterliste der Eingabedaten erzeugt, da es aussieht wie es mit dem Aggregator bis Zeile n, das Ergebnis zurückgeben und dann auf Zeile 0, um die Aggregation bis Zeile n1 berechnen Nochmals. Gibt es eine Möglichkeit, die Akkumulation oder eine statische Variable (wie in C), so dass diese einmal berechnet werden muss Danke. Ndash Trylks Jan 20 12 at 11:59 Nein, it39s mit dem akkumulierten Wert. Wenn Sie die Abfrage mit dem Befehl quotraise infoquot unkommentiert ausführen, können Sie sehen, dass die Funktion nur einmal für jede Zeilenausgabe aufgerufen wird. Postgresql gibt den Statuswert für jede Zeile aus (wenn ein finalfunc definiert wurde, der aufgerufen werden würde, um den Zustand in einen Ausgangswert umzuwandeln). ndash araqnid 20. Januar 12 um 12:04 ErwinBrandstetter: Ich habe die meisten Änderungen rückgängig gemacht - im Fall des Formats des ersten (Anker) Teil der Abfrage, EMA (x1) eindeutig mit einer einzigen Zeile dargestellt werden - dies Corespnds zu der einzigen Zeile, die es in der Frage definiert. Im Fall des rekursiven Teils der Abfrage habe ich in der Join-Bedingung mn-1 verwendet, um die Äquivalenz der Beziehung zu EMA (xn-1) in der Frage anzuzeigen, auch wenn dies weniger performant ist, wenn die Performance eine ist Problem kann die OP die Join-Bedingung ändern, wie Sie vorgeschlagen haben. Ndash Kennzeichen Bannister Jan 16 12 at 9:27
Comments
Post a Comment