Sunday 26 November 2017

Exponential Moving Average In Sql


Ich versuche, einen exponentiellen gleitenden Durchschnitt (EMA) auf postgres zu implementieren, aber da ich die Dokumentation zu überprüfen und darüber nachzudenken, desto mehr versuche ich die mehr verwirrt bin ich. 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 Mark Bannister Jan 16 12 at 9:27Moving Durchschnitt in T-SQL Eine gemeinsame Berechnung in Trend-Analyse ist die bewegte (oder rollende) Durchschnitt. Ein gleitender Durchschnitt ist der Durchschnitt der letzten 10 Zeilen. Der gleitende Durchschnitt zeigt eine glattere Kurve als die tatsächlichen Werte, mehr also mit einer längeren Periode für den gleitenden Durchschnitt, was es zu einem guten Werkzeug für die Trendanalyse macht. Dieser Blogpfosten zeigt, wie man den gleitenden Durchschnitt in T-SQL berechnet. Abhängig von der Version von SQL Server werden unterschiedliche Methoden verwendet. Die nachstehende Tabelle zeigt den Glättungseffekt (rote Linie) mit einem 200 Tage gleitenden Durchschnitt. Die Aktienkurse sind die blaue Linie. Der langfristige Trend ist deutlich sichtbar. T-SQL Moving Avergage 200 Tage Die folgende Demonstration benötigt die TAdb-Datenbank, die mit dem hier befindlichen Skript erstellt werden kann. Im nächsten Beispiel wird ein gleitender Durchschnitt für die letzten 20 Tage berechnet. Abhängig von der Version von SQL Server gibt es eine andere Methode, um die Berechnung durchzuführen. Und, wie wir später sehen werden, haben die neueren Versionen von SQL Server Funktionen, die eine viel effektivere Berechnung ermöglichen. SQL Server 2012 und höher Moving Average Diese Version verwendet eine aggregierte Fensterfunktion. Was ist neu in SQL 2012 ist die Möglichkeit, die Größe des Fensters zu beschränken, indem Sie angeben, wie viele Zeilen vor dem Fenster enthalten sollten: Zeilen vorangegangen ist 19, weil wir die aktuelle Zeile auch in die Berechnung enthalten. Wie Sie sehen können, ist die Berechnung der gleitenden Durchschnitt in SQL Server 2012 ziemlich einfach. Die Abbildung unten zeigt das Fensterprinzip. Die aktuelle Zeile ist mit gelb markiert. Das Fenster ist blau markiert. Der gleitende Durchschnitt ist einfach der Durchschnitt von QuoteClose in den blauen Linien: T-SQL Moving Average Fenster. Die Ergebnisse der Berechnungen in älteren Versionen von SQL Server sind identisch, so dass sie nicht erneut angezeigt werden. SQL Server 2005 8211 2008R2 Moving Average Diese Version verwendet einen gemeinsamen Tabellenausdruck. Der CTE wird referenziert, um die letzten 20 Zeilen für jede Zeile zu erhalten: Moving Average vor SQL Server 2005 Die pre 2005-Version wird eine linke äußere Verknüpfung zu der gleichen Tabelle verwenden, um die letzten 20 Zeilen zu erhalten. Die äußere Tabelle kann gesagt werden, um das Fenster, das wir wollen, um einen Durchschnitt zu berechnen: Performance-Vergleich Wenn wir die drei verschiedenen Methoden gleichzeitig und überprüfen Sie die resultierende Ausführung Plan, gibt es einen dramatischen Unterschied in der Leistung zwischen den Methoden: Vergleich von drei Verschiedene Methoden, um den gleitenden Durchschnitt zu berechnen Wie Sie sehen können, macht die Verbesserung der Fensterfunktion in SQL 2012 einen großen Unterschied in der Leistung. Wie bereits am Anfang dieses Beitrags erwähnt, werden gleitende Durchschnittswerte als Trends verwendet. Ein gemeinsamer Ansatz besteht darin, Bewegungsdurchschnitte verschiedener Längen zu kombinieren, um Veränderungen in der kurz-, mittel - und langfristigen Entwicklung zu erkennen. Von besonderem Interesse sind die Übergänge der Trendlinien. Zum Beispiel, wenn sich der kurze Trend über den langen oder mittleren Trend bewegt, kann dieser als Kaufsignal in der technischen Analyse interpretiert werden. Und wenn sich der kurze Trend unter einer längeren Trendlinie bewegt, kann dies als Verkaufssignal interpretiert werden. Die folgende Tabelle zeigt Quotes, Ma20, Ma50 und Ma200. T-SQL Ma20, Ma50, Ma200 kaufen und verkaufen Signale. Dieser Blog-Beitrag ist Teil einer Serie über technische Analyse, TA, in SQL Server. Siehe die anderen Beiträge hier. Geschrieben von Tomas LindExponentieller gleitender Durchschnitt in T-SQL Exponentielle gleitende Durchschnittswerte sind ähnlich gewichteten gleitenden Durchschnittswerten, da sie den Veränderungen vor langer Zeit weniger Gewicht zuweisen und den jüngsten Änderungen mehr Gewicht verleihen. Die gewichteten gleitenden Mittelwerte sind linear, aber exponentielle gleitende Mittelwerte sind exponentiell. Das heißt, das Gewicht kann als Kurve ausgedrückt werden: Es gibt eine große Möglichkeit, exponentielle gleitende Mittelwerte in T-SQL zu berechnen, indem Sie ein undokumentiertes Feature über Variablen und laufende Summen in SQL Server verwenden. In diesem Blogpfosten werde ich zeigen, wie man diese Methode verwendet, um exponentiellen gleitenden Durchschnitt in T-SQL zu berechnen, aber ich werde auch eine Methode vorstellen, die Standardfunktionen in SQL Server verwendet. Leider bedeutet das, mit einer Schleife. In den Beispielen werde ich einen 9 Tage exponentiellen gleitenden Durchschnitt berechnen. Die Beispiele verwenden die Datenbank TAdb. Ein Skript zur Erstellung von TAdb finden Sie hier. Exponential Moving Average (EMA): Laufende Totals-Methode Die Theorie hinter den laufenden Total Features in Updates wird ausführlich von Jeff Moden in seinem Artikel Solving the Running Total und Ordinal Rang Probleme beschrieben. Weitere Ressourcen, die diese Methode zur Berechnung von EMA beschreiben, sind der Blogpfosten, der die gleitenden Durchschnitte mit T-SQL von Gabriel Priester berechnet und dem Forumsbeitrag Exponential Moving Average Challenge. Beide auf SQL Server Central. Grundsätzlich können Sie in T-SQL sowohl Variablen als auch Spalten in einer update - Anweisung aktualisieren. Die Updates werden Zeile für Zeile intern von SQL Server ausgeführt. Dieses Zeilen-für-Zeile-Verhalten macht die Berechnung einer laufenden Summe möglich. Dieses Beispiel zeigt, wie es funktioniert: Beachten Sie, dass 8220ColumnRunningTotal8221 eine laufende Summe von 8220ColumnToSum8221 ist. Mit dieser Methode können wir EMA9 mit diesem T-SQL berechnen: Die Berechnung von EMA ist recht einfach. Wir verwenden die aktuelle Zeile und die vorherige, aber mit mehr Gewicht auf die aktuelle Zeile. Das Gewicht wird nach der Formel 2 (19) berechnet, wobei 822098221 der Parameter für die Länge der EMA ist. Zur Berechnung von EMA9 für Zeile 10 oben ist die Berechnung: In diesem Fall erhält die aktuelle Zeile 20 des Gewichts (2 (19) 0,2) und die vorherige Zeile erhält 80 des Gewichts (1-2 (19) 0,8). Sie finden diese Berechnung in der Anweisung oben in der CASE-Anweisung: Exponential Moving Average (EMA): Looping-Methode Soweit ich weiß, mit Ausnahme der laufenden Summenmethode oben skizziert, gibt es keine Möglichkeit, EMA mit einer setbasierten SQL-Anweisung zu berechnen . Daher verwendet die T-SQL unten eine while-Schleife, um EMA9 zu berechnen: Die Ergebnisse sind die gleichen wie in den laufenden Summen Beispiel oben. Leistung Wie erwartet, ist die set based running sumals-Version viel schneller als die Loop-Version. Auf meiner Maschine lag die setbasierte Lösung bei ca. 300 ms, verglichen mit ca. 1200 bei der Loop-Version. Die Schleifenversion entspricht jedoch mehr den SQL-Standards. Also die Wahl zwischen den Methoden hängt von what8217s am wichtigsten für Sie, Leistung oder Standards. Der exponentielle gleitende Durchschnitt kann in der Trendanalyse verwendet werden, wie bei den anderen Arten von gleitenden Durchschnitten, Simple Moving Average (SMA) und Weighted Moving Average (WMA). Es gibt auch andere Berechnungen in der technischen Analyse, die die EMA, MACD zum Beispiel verwendet. Dieser Blog-Beitrag ist Teil einer Serie über technische Analyse, TA, in SQL Server. Siehe die anderen Beiträge hier. Geschrieben von Tomas Lind Tomas Lind - Consulting als SQL Server DBA und Datenbankentwickler bei High Coast Database Solutions AB.

No comments:

Post a Comment