Thursday, 12 January 2017

Berechnen 40 Tage Gleitender Durchschnitt

Moving Average Indicator Die gleitenden Mittelwerte liefern ein objektives Maß für die Trendrichtung, indem die Preisdaten geglättet werden. In der Regel berechnet mit Schlusskursen, kann der gleitende Durchschnitt auch mit Median verwendet werden. typisch. Gewichteten Abschluss. Und hohe, niedrige oder offene Preise sowie andere Indikatoren. Kürzere bewegliche Durchschnitte sind empfindlicher und identifizieren neue Trends früher, geben aber auch mehr falsche Alarme. Längere bewegte Durchschnitte sind zuverlässiger, aber weniger reagierend, nur Abholung der großen Trends. Verwenden Sie einen gleitenden Durchschnitt, der die Hälfte der Länge des Zyklus, den Sie verfolgen. Wenn die Peak-to-Peak-Zykluslänge ungefähr 30 Tage beträgt, dann ist ein 15 Tage gleitender Durchschnitt geeignet. Wenn 20 Tage, dann ein 10 Tage gleitender Durchschnitt geeignet ist. Einige Händler werden jedoch 14 und 9 Tage gleitende Durchschnitte für die oben genannten Zyklen in der Hoffnung der Erzeugung von Signalen etwas vor dem Markt verwenden. Andere favorisieren die Fibonacci-Zahlen von 5, 8, 13 und 21. 100 bis 200 Tage (20 bis 40 Wochen) gleitende Durchschnittswerte sind für längere Zyklen 20 bis 65 Tage (4 bis 13 Wochen) gleitende Mittelwerte sind für Zwischenzyklen und 5 beliebt Bis 20 Tage für kurze Zyklen. Das einfachste gleitende Mittelsystem erzeugt Signale, wenn der Kurs den gleitenden Durchschnitt überquert: Gehen Sie lange, wenn der Kurs über dem gleitenden Durchschnitt von unten über den Kurs geht. Gehen Sie kurz, wenn der Kurs unter den gleitenden Durchschnitt von oben geht. Das System ist anfällig für whipsaws in ranging-Märkte, mit Preis-Kreuzung hin und her über den gleitenden Durchschnitt, wodurch eine große Anzahl von falschen Signalen. Aus diesem Grund verwenden gleitende Durchschnittssysteme normalerweise Filter zur Verringerung von Peitschenhieben. Komplexere Systeme verwenden mehr als einen gleitenden Durchschnitt. Zwei Moving Averages verwendet einen schnelleren gleitenden Durchschnitt als Ersatz für Schlusskurs. Drei Moving Averages beschäftigen einen dritten gleitenden Durchschnitt, um festzustellen, wann der Preis reicht. Multiple Moving Averages verwenden eine Serie von sechs schnell bewegten Durchschnitten und sechs langsam bewegten Durchschnitten, um einander zu bestätigen. Displaced Moving Averages sind nützlich für Trendfolgen, wodurch die Anzahl der Whipsaws reduziert wird. Keltner-Kanäle verwenden Banden, die in einem Vielfachen des durchschnittlichen wahren Bereichs gezeichnet sind, um gleitende Durchschnittsübergänge zu filtern. Die populäre MACD (Moving Average Convergence Divergence) - Anzeige ist eine Variation der beiden Moving-Average-System, aufgetragen als ein Oszillator, der den langsam bewegten Durchschnitt von dem schnell bewegten Durchschnitt subtrahiert. Es gibt mehrere verschiedene Arten von gleitenden Durchschnitten, jeweils mit ihren eigenen Besonderheiten. Einfache gleitende Mittelwerte sind am einfachsten zu konstruieren, aber auch am anfälligsten für Verzerrungen. Gewichtete gleitende Durchschnitte sind schwer zu konstruieren, aber zuverlässig. Exponentielle gleitende Durchschnitte erreichen die Vorteile der Gewichtung kombiniert mit der Leichtigkeit der Konstruktion. Wilder gleitende Durchschnitte werden hauptsächlich in Indikatoren verwendet, die von J. Welles Wilder entwickelt wurden. Im Wesentlichen die gleiche Formel wie exponentielle gleitende Durchschnitte, verwenden sie unterschiedliche Gewichtungen mdash, für die Benutzer zu berücksichtigen müssen. Indikatorbedienfeld zeigt, wie Sie Bewegungsdurchschnitte einrichten. Die Voreinstellung ist ein 21 Tage exponentieller gleitender Durchschnitt. Ich habe eine Tabelle, die die Informationen über Benutzeranrufe in einem Call-Center speichert. Die Tabelle hat eine Callid, das Datum, an dem der Anruf gemacht wurde, das aktuelle Datum und die Uhrzeit des Anrufs, den Anruftyp und eine mit dem Anruf verbundene Punktzahl. Meine Anforderung ist es, einen 40 Tage gleitenden Durchschnitt der Punktzahl in Bezug auf den Anruftag zu berechnen. Die 40 Tage sollten ab dem Tag des Anrufs vom Vortag beginnen. Wenn es in den letzten 40 Tagen keinen Anruf gibt, sollte es Zeilen für das Anrufdatum enthalten, für die der gleitende Durchschnitt berechnet wird. Unten ist Beispieldaten: So sollte die Ausgabe sein: Schema und Testdaten unterhalb Link: SQL Fiddle Ich kann ROWS in einer AVG-Fensterdefinition nicht verwenden, da testaes Tausende von Zeilen für einen bestimmten Tag hat. Diese Frage sollte die tatsächliche Tabelle Definition mit Datentypen und Einschränkungen enthalten. Auch die Anforderung berechnen einen 40 Tage gleitenden Durchschnitt der Partitur in Bezug auf den Aufruf Tag ist nicht im Ergebnis wider. Wo ist der Anruftag gegangen Wollen Sie einen gleitenden Durchschnitt für die gesamte Tabelle oder nur für einen gegebenen Zeitabschnitt berechnen? Bitte klären Sie. Ndash Erwin Brandstetter Jun 10 16 at 2:51 Es ist nicht wirklich klar, aus der Frage, was die Rolle der calltypeid Spalte ist. Ich werde es ignorieren, bis Sie klären. Ohne Fensterfunktionen Hier ist eine einfache Variante, die überhaupt keine Fensterfunktionen verwendet. Stellen Sie sicher, dass es einen Index auf (calldtkey, aesraw) gibt. CTEDates gibt eine Liste aller Daten in der Tabelle zurück und berechnet den Durchschnitt für jeden Tag. Dieser Durchschnitt wird für den ersten Tag benötigt. Der Server scannt den ganzen Index irgendwie, also ist die Berechnung eines solchen Durchschnitts billig. Dann, für jeden einzelnen Tag verwende ich eine Selbst-beitreten, um den Durchschnitt für 40 vorherige Tage zu berechnen. Damit wird NULL für den ersten Tag zurückgegeben, der in der Hauptabfrage mit averagecurrentday ersetzt wird. Sie müssen nicht CTE hier verwenden, es macht die Abfrage einfacher zu lesen. Mit dem empfohlenen Index sollte diese Lösung nicht schlecht sein. Es gibt eine ähnliche Frage, aber für SQL Server (Datumsbereich Rolling Summe mit Fenster-Funktionen). Postgres scheint RANGE mit einem Fenster von angegebener Größe zu unterstützen, während SQL Server in diesem Moment nicht. Also, Lösung für Postgres ist wahrscheinlich ein wenig einfacher. Der Schlüsselteil wäre: Um den gleitenden Durchschnitt mit diesen Fensterfunktionen zu berechnen, müssen Sie wahrscheinlich die Lücken in den Daten zuerst füllen, damit die Tabelle mindestens eine Zeile für jeden Tag hat (mit NULL-Werten für aesraw in diesen Dummyzeilen). Wie Erwin Brandstetter in seiner Antwort richtig bemerkt hat. Im Moment (wie von Postgres 9.5) die RANGE-Klausel in Postgres hat noch Einschränkungen ähnlich SQL Server. Docs sagen: Der Wert PRECEDING und der Wert FOLLOWING sind derzeit nur im ROWS-Modus erlaubt. Also, diese Methode mit dem RANGE oben würde nicht für Sie arbeiten, auch wenn Sie Postgres 9.5 verwendet. Verwenden von Fensterfunktionen Sie können die in der Frage für SQL Server oben beschriebenen Methoden verwenden. Zum Beispiel gruppieren Sie Ihre Daten in tägliche Summen, fügen Sie Zeilen für fehlende Tage, berechnen die bewegten SUM und COUNT mit OVER mit ROWS und dann berechnen gleitenden Durchschnitt. Etwas in dieser Richtung: Das Ergebnis ist das gleiche wie in der ersten Variante. Siehe SQL Fiddle. Auch dies könnte mit Inlined Sub-Abfragen ohne CTEs geschrieben werden. Es lohnt sich, auf die realen Daten die Leistung der verschiedenen Varianten zu überprüfen. Die große Prämie macht die derzeit akzeptierte Antwort vorbildlich, aber ich bin nicht ganz glücklich mit einigen Details. Daher fügte ich diese Antwort. Tabellendefinition Sie sollten eine aktuelle Tabellendefinition bereitgestellt haben, um dies zu vereinfachen. Nach den Beispieldaten ist calldttm ein Typ-Zeitstempel mit Zeitzone (timestamptz). Die Spalte calldtkey ist nicht vollständig funktionsabhängig, da das passende Datum von der Zeitzone abhängt. Aber wenn Sie definieren, dass (nicht nur ein Offset, hüten Sie sich von DST), kann das Datum leicht und zuverlässig aus einem timestamptz abgeleitet werden und sollte nicht redundant gespeichert werden. Um es richtig zu machen, verwenden Sie einen Ausdruck wie: Sie können eine MATERIALISIERTE ANSICHT mit der abgeleiteten Datumspalte für Benutzerfreundlichkeit hinzufügen. Für die Zwecke dieser Frage bleibe ich an Ihrem gegebenen Tisch. Frage und Antwort beide zählen 41 Tage anstelle von 40 wie pro Anforderung. Untere und obere Schranke enthalten sind, was zu einem (eher gemeinsamen) Off-by-one-Fehler. Folglich bekomme ich verschiedene Ergebnisse in zwei Reihen unten. Datum. Intervall. Zeitstempel Das Subtrahieren eines Intervalls von einem Datum erzeugt einen Zeitstempel (wie in calldtkey - INTERVAL 41 Tag). Für diese Abfrage ist es effizienter, eine Ganzzahl zu subtrahieren. Ein anderes Datum erzeugen (wie calldtkey - 41). Nicht möglich mit einer RANGE-Klausel Vladimir schlug (jetzt fixiert) eine Lösung mit der RANGE-Klausel in der Rahmendefinition der Fensterfunktionen in Postgres 9.5 vor. Tatsächlich hat sich in dieser Hinsicht zwischen Postgres 9.4 und 9.5 nichts geändert, nicht einmal der Text im Handbuch. Rahmendefinition von Fensterfunktionen erlaubt nur RANGE UNBOUNDED PRECEDING und RANGE UNBOUNDED FOLLOWING - nicht mit Werten. Natürlich können Sie einen CTE verwenden, um die tägliche Summenzählung zu berechnen. Aber dein Tisch. Speichert die Informationen über Benutzer-Aufrufe in einem Call-Center Diese Art von Informationen nicht später ändern. So berechnen Sie täglich Aggregate einmal in einer materialisierten Ansicht und bauen auf, dass. Der aktuelle Tag fehlt immer, aber das ist ein Feature. Die Ergebnisse sind nicht korrekt, bevor der Tag vorbei ist. Der MV muss einmal pro Tag aufgefrischt werden, bevor Sie Ihre Abfrage ausführen oder der letzte Tag fehlt. Ein Index für die zugrundeliegende Tabelle ist hierfür nicht notwendig, da die gesamte Tabelle trotzdem gelesen wird. Sie können eine intelligentere materialisierte Ansicht manuell erstellen und nur inkrementell neue Tage hinzufügen, anstatt alles mit Standard-MVs neu zu erstellen. Aber das geht über den Rahmen der Frage hinaus. Ich schlage stark einen Index auf dem MV vor, zwar: Ich hielt nur dayum an und dayct, das für Index-nur Scans hofft. Wenn Sie nicht sehen, die in Ihre Abfragen, brauchen Sie nicht die Spalten in den Index. Wenn Sie dies oft ausführen, würde ich wickeln Sie die ganze Shebang in eine MV, um wiederholte Berechnungen zu vermeiden. Eine Lösung mit Fensterfunktionen und eine Rahmenklausel ROWS BETWEEN. Wäre auch möglich. Aber Ihre Beispieldaten schlagen vor, dass Sie nicht Werte für die meisten der Tage im Bereich haben (viel mehr Lücken als Inseln), also erwarte ich nicht, daß es schneller ist. Ähnliche Artikel:


No comments:

Post a Comment