Saturday 4 November 2017

Gleitender Durchschnitt Python


Wir haben vorgestellt, wie man mit python Moving-Averages erstellt. Dieses Tutorial wird eine Fortsetzung dieses Themas sein. Ein gleitender Durchschnitt im Rahmen von Statistiken, auch Rolling / Run Average genannt, ist eine Art von endlicher Impulsantwort. In unserem vorherigen Tutorial haben wir die Werte der Arrays x und y: Let8217s plot x gegen den gleitenden Durchschnitt von y aufgetragen, den wir yMA nennen wollen: Erstens, let8217s gleichen die Länge beider Arrays aus: Und dies im Kontext: Das Ergebnis Diagramm: Um zu verstehen, dies, let8217s plot zwei verschiedene Beziehungen: x vs y und x vs MAy: Der gleitende Durchschnitt hier ist das grüne Diagramm, das bei 3 beginnt: Share this: So verwandte Post navigation Lassen Sie eine Antwort Antworten abbrechen Sehr nützlich Ich möchte den letzten Teil auf großen Datensätzen lesen Hope wird es bald kommen8230 d Blogger wie folgt: Backtesting ein Moving Average Crossover in Python mit Pandas Von Michael Halls-Moore am 21. Januar 2014 Im vorigen Artikel auf Research Backtesting Environments In Python Mit Pandas haben wir eine objektorientierte forschungsbasierte Backtesting-Umgebung erstellt und auf einer zufälligen Prognosestrategie getestet. In diesem Artikel werden wir nutzen die Maschinen, die wir eingeführt, um die Forschung über eine tatsächliche Strategie, nämlich die Moving Average Crossover auf AAPL. Moving Average Crossover-Strategie Die Moving Average Crossover-Technik ist eine äußerst bekannte simples Impulsstrategie. Es wird oft als die Hello World Beispiel für quantitative Handel. Die Strategie, wie hier skizziert, ist lang-nur. Zwei getrennte einfache gleitende Durchschnittsfilter werden mit variierenden Rückblickperioden einer bestimmten Zeitreihe erzeugt. Beim Kauf des Assets treten Signale auf, wenn der kürzere Lookback-Bewegungsdurchschnitt den längeren Lookback-Bewegungsdurchschnitt übersteigt. Wenn der längere Durchschnitt anschließend den kürzeren Durchschnitt übersteigt, wird der Vermögenswert zurückgekauft. Die Strategie funktioniert gut, wenn eine Zeitreihe einen starken Trend eintritt und dann langsam den Trend rückgängig macht. Für dieses Beispiel habe ich Apple, Inc. (AAPL) als Zeitreihe mit einem kurzen Rückblick von 100 Tagen und einem langen Rückblick von 400 Tagen gewählt. Dies ist das Beispiel der zipline algorithmischen Handelsbibliothek. Wenn wir also unseren eigenen Backtester implementieren wollen, müssen wir sicherstellen, dass er die Ergebnisse in Zipline, als ein grundlegendes Mittel der Validierung entspricht. Implementierung Bitte folgen Sie dem vorherigen Tutorial. Die beschreibt, wie die anfängliche Objekthierarchie für den Backtester konstruiert wird, andernfalls funktioniert der nachfolgende Code nicht. Für diese spezielle Implementierung habe ich die folgenden Bibliotheken verwendet: Die Implementierung von macross. py erfordert backtest. py aus dem vorherigen Tutorial. Der erste Schritt ist, die notwendigen Module und Objekte zu importieren: Wie im vorherigen Tutorial werden wir die abstrakte Basisklasse Strategy unterteilen, um MovingAverageCrossStrategy zu produzieren. Die alle Details enthält, wie die Signale erzeugt werden, wenn die sich bewegenden Mittelwerte von AAPL einander kreuzen. Das Objekt benötigt ein kurzes Fenster und ein langes Fenster. Die Werte wurden auf Standardwerte von 100 Tagen bzw. 400 Tagen gesetzt, wobei es sich um dieselben Parameter handelt, die im Hauptbeispiel der Zipline verwendet werden. Die gleitenden Mittelwerte werden durch die Verwendung der Pandas-Rollmechanik auf den BarsClose-Schlusskurs der AAPL-Aktie erstellt. Sobald die einzelnen Bewegungsdurchschnitte konstruiert worden sind, wird die Signalserie dadurch erzeugt, daß die Säule gleich 1,0 gesetzt wird, wenn der kurzlebige Durchschnitt größer ist als der lang fortschreitende Durchschnitt oder 0,0 sonst. Daraus können Positionsaufträge generiert werden, um Handelssignale darzustellen. Das MarketOnClosePortfolio wird von Portfolio subklassen. Die in backtest. py gefunden wird. Es ist fast identisch mit der im vorherigen Tutorial beschriebenen Implementierung, mit der Ausnahme, dass die Trades nun auf einer Close-to-Close-Basis statt einer Open-to-Open-Basis durchgeführt werden. Einzelheiten darüber, wie das Portfolio-Objekt definiert ist, finden Sie im vorherigen Tutorial. Ive ließ den Code in für Vollständigkeit und dieses Tutorium in sich geschlossen halten: Nun, da die MovingAverageCrossStrategy und MarketOnClosePortfolio Klassen definiert worden sind, wird eine Hauptfunktion aufgerufen, um alle Funktionalität zusammen zu binden. Darüber hinaus wird die Performance der Strategie durch eine Kurve der Eigenkapitalkurve untersucht. Das Pandas DataReader-Objekt lädt OHLCV-Preise für AAPL-Aktien für den Zeitraum vom 1. Januar 1990 bis zum 1. Januar 2002 herunter, wobei an diesem Punkt die Signale DataFrame erzeugt werden, um die Langzeitsignale zu erzeugen. Anschließend wird das Portfolio mit einer Stammkapitalzuführung von 100.000 USD erstellt und die Erträge auf der Eigenkapitalkurve berechnet. Der letzte Schritt ist die Verwendung von matplotlib, um eine zweidimensionale Plot der beiden AAPL Preise, überlagert mit den gleitenden Durchschnitten und kaufen / verkaufen Signale, sowie die Equity-Kurve mit den gleichen Kauf / Verkauf Signale. Der Plot-Code wird aus dem Zipline-Implementierungsbeispiel genommen (und modifiziert). Die grafische Ausgabe des Codes ist wie folgt. Ich benutzte den IPython-Einfüge-Befehl, um diesen direkt in die IPython-Konsole zu legen, während in Ubuntu, so dass die grafische Ausgabe in Sicht blieb. Die rosafarbenen upticks stellen Kauf der Vorlage dar, während die schwarzen downticks Vertretung verkaufen es zurück: Wie gesehen werden kann, verliert die Strategie Geld über dem Zeitraum mit fünf Hin - und Rücktransaktionen. Dies ist nicht überraschend angesichts des Verhaltens der AAPL in der Periode, die auf einem leichten Abwärtstrend war, gefolgt von einem deutlichen Aufschwung, der 1998 begann. Die Rückblickperiode der gleitenden Durchschnittssignale ist ziemlich groß und dieses beeinflußte den Profit des abschließenden Geschäfts , Die sonst die Strategie rentabel gemacht haben könnte. In nachfolgenden Artikeln werden wir ein anspruchsvolleres Verfahren zur Leistungsanalyse erstellen sowie die Optimierung der Rückblickperioden der einzelnen gleitenden Durchschnittssignale beschreiben. Michael Halls-Moore Mike ist der Begründer von QuantStart und war in den letzten fünf Jahren in der quantitativen Finanzbranche tätig, vorwiegend als Quant-Entwickler und später als Quant-Trader-Consulting für Hedgefonds. In meinem letzten Satz wollte ich zeigen Warum es Gleitkomma-Fehler hilft. Wenn zwei Werte annähernd dieselbe Größenordnung sind, dann verliert das Addieren weniger Genauigkeit, als wenn Sie eine sehr große Zahl zu einem sehr kleinen hinzugefügt haben. Der Code kombiniert quadratweise benachbarte Quotwerte in einer Weise, daß gerade Zwischensummen immer in der Grße ausreichend nahe sein sollten, um den Gleitkommafehler zu minimieren. Nichts ist narrensicher, aber diese Methode hat ein paar sehr schlecht umgesetzte Projekte in der Produktion gespart. Ndash Mayur Patel Dez 15 14 am 17:22 Alleo: Statt einer Addition pro Wert, you39ll tun zwei. Der Beweis ist der gleiche wie das Bit-Flipping-Problem. Allerdings ist der Punkt dieser Antwort nicht notwendigerweise Leistung, sondern Präzision. Die Speicherauslastung für die Mittelung von 64-Bit-Werten würde 64 Elemente im Cache nicht überschreiten, daher ist sie auch im Arbeitsspeicher freundlich. Ndash Mayur Patel UPD: effizientere Lösungen wurden von Alleo und jasaarim vorgeschlagen. Sie können np. convolve dafür verwenden: Das Argument mode gibt an, wie die Kanten behandelt werden sollen. Ich wählte den gültigen Modus hier, weil ich denke, das ist, wie die meisten Leute erwarten, laufen zu arbeiten, aber Sie können andere Prioritäten haben. Hier ist ein Diagramm, das den Unterschied zwischen den Modi veranschaulicht: Sie können einen laufenden Mittelwert mit berechnen: Glücklicherweise enthält numpy eine Faltungsfunktion, die wir verwenden können, um die Dinge zu beschleunigen. Der laufende Mittelwert entspricht dem Falten von x mit einem Vektor, der N lang ist, wobei alle Elemente gleich 1 / N sind. Die numpy-Implementierung von convolve beinhaltet den Start-Transient, also müssen Sie die ersten N-1 Punkte entfernen: Auf meiner Maschine ist die schnelle Version 20-30 mal schneller, abhängig von der Länge des Eingabevektors und der Größe des Mittelungsfensters . Beachten Sie, dass Convolve enthält einen gleichen Modus, der scheint, wie es die vorübergehende Frage ansprechen sollte, aber es teilt es zwischen Anfang und Ende. Es entfernt den Übergang vom Ende, und der Anfang doesn39t haben eine. Nun, ich denke, es ist eine Frage der Prioritäten, ich don39t brauchen die gleiche Anzahl von Ergebnissen auf Kosten der eine Steigung in Richtung Null, die isn39t gibt es in den Daten. BTW, hier ist ein Befehl, um den Unterschied zwischen den Modi: Modi (39full39, 39same39, 39valid39) Diagramm (convolve (one ((200,)), diejenigen ((50,)) 4750, Modem) für m in Modi zu zeigen Achse (-10, 251, -.1, 1.1) Legende (Modi, loc39Lower center39) (mit pyplot und numpy importiert). Ich bin immer von Signalverarbeitung geärgert, die Ausgangssignale von anderer Form zurückgeben als die Eingangssignale, wenn beide Eingänge und Ausgänge von gleicher Natur sind (z. B. beide Zeitsignale). Es bricht die Korrespondenz mit der zugehörigen unabhängigen Variablen (z. B. Zeit, Frequenz), die Plotten oder Vergleichen nicht direkt macht. Wenn Sie das Gefühl teilen, können Sie die letzten Zeilen der vorgeschlagenen Funktion als ynp. convolve (w / w. sum (), s, mode39same39) zurückgeben ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Lapis ja, aber lassen Sie uns sagen, Sie verwenden Cumsum-Methode auf die erste Tick und speichern Sie Ihre rollende durchschnittliche Array für das nächste Häkchen. Jeder Tick danach müssen Sie nur die neuesten gleitenden Mittelwert an Ihre rollende Array im Speicher anhängen. Mit dieser Methode können Sie nicht neu berechnen Dinge, die Sie bereits berechnet haben: Am ersten ticken Sie cumsum danach fügen Sie nur das quotmean der letzten Periode elementsquot, die 2x schneller für alle nachfolgenden Zecken ist. Ndash litepresence 10. Juni um 12: 29numpy. average Achse, auf der durchschnittlich ein. Wenn Keine. Wird eine Mittelung über das abgeflachte Array durchgeführt. Gewichte. Arraylike, optional Ein Array von Gewichten in Verbindung mit den Werten in einer. Jeder Wert in a trägt zum Durchschnitt nach seinem zugehörigen Gewicht bei. Die Gewichtsanordnung kann entweder 1-D (in diesem Fall ihre Länge die Größe von a entlang der gegebenen Achse sein) oder von der gleichen Form wie a sein. Wenn weightsNone. Dann wird angenommen, daß alle Daten in a ein Gewicht gleich Eins haben. ist zurückgekommen . Bool, optional Der Standardwert ist False. Wenn wahr . Wird das Tupel (durchschnittliche Summengewichte) zurückgegeben, ansonsten wird nur der Durchschnitt zurückgegeben. Wenn weightsNone. Die Summe der Gewichtungen entspricht der Anzahl der Elemente, über die der Durchschnitt genommen wird. Durchschnittlich, sumofweights. Arraytype oder double Gibt den Durchschnitt entlang der angegebenen Achse zurück. Wenn die Rückgabe True ist. Ein Tupel mit dem Durchschnitt als das erste Element und die Summe der Gewichte als zweites Element zurück. Der Rückgabetyp ist Float, wenn a vom Integer-Typ ist, andernfalls ist er vom gleichen Typ wie a. Sumofweights ist vom gleichen Typ wie Durchschnitt. Forecasting und Python Teil 1 8211 Moving Averages Ich möchte eine Serie, die verschiedene Prognosemethoden nimmt und zeigt sie mit Python zu treten. Um die 8216ball rollen8217 Ich möchte mit gleitenden Durchschnitten beginnen und idealer Abschluss der Serie auf die Prognose mit ARIMA-Modelle (AutoRegressive Integrated Moving Average). Mein Ziel ist, diesen Inhalt 8216light8217 auf Theorie und Mathematik zu haben und stattdessen auf Anwendung im Code zu konzentrieren. Ich schreibe diese spät in der Nacht, so fühlen Sie sich frei, ping mich, wenn ich irgendwelche Fehler haben. Ich verweise oft auf die vorhergesagte Y als Y Hut, wenn Sie sich nicht bewusst sind, in der Gleichung das Hut-Symbol befindet sich über dem vorhergesagten Y. Prognose mit Moving Average Moving Durchschnitte sollten ein großartiger Ort, um jedes Lehrbuch, das ich mit dem Bewegen beginnen Mittel, um das Fundament zu legen. Die Formeln sind einfach und macht Spaß. Gleichung 1: Bewegungsdurchschnittsgleichung Das gleitende Mittelwertmodell berechnet den Mittelwert jeder Beobachtung in den Perioden k. In meinem Code und Ergebnisse werde ich mit einem 12-Periode gleitenden Durchschnitt, also k12. Y Hut (t1) ist der Prognosewert für die nächste Periode und Y (t) ist der Istwert zu Periode t. Eine Periode kann Stunden, Tage, Wochen, Monate, Jahr, etc. sein. Da das Modell das gleiche unabhängig ist, werde ich nicht eine Einheit angeben. Yvalues ​​ist eine Teilmenge aller tatsächlich in den Code eingebrachten Y-Werte. Setzen Sie meine 8216k8217 (Perioden) gleich 12, wie ich einen 12-Periode gleitenden Durchschnitt berechnen werde. Der Code iteriert über die Beobachtungen (n), berechnet den Mittelwert für jeden 12 Periodenbereich (k12) und weist die Berechnung der yhat-Liste zu. Falls Sie bemerkt haben, ist yfull meine vollständige Liste der Y-Werte, wobei yvalues ​​eine Teilmenge ist, die durch k kompensiert wurde. Mehr dazu unten in der 8216Offsetting Y Subset List8217 Abschnitt. Plot Ist - und Prognose Prognose 1. 12 Periode gleitenden Durchschnitt Messprognosefehler ich meine Prognose, aber ist es gut visuell die Prognose recht gut die tatsächlichen Werte folgt, aber wie kann ich die Qualität dieser Prognose zu messen und dann vergleichen sie gegen Prognosen Abgeleitet mit verschiedenen Methoden. Eine Möglichkeit, eine Prognose zu messen, ist durch die Messfehler (auch bekannt als Residuen, Y tatsächliche 8211 Y Hut) Ich habe gewählt, um die folgenden Methoden umfassen Prognosefehler in dieser Diskussion zu messen. Mean Squared Error (MSE), der die Mittelwerte der quadratischen Fehler misst (Differenz von Y und Y Hut). MSE ist in den gleichen Einheiten angegeben wie die Werte (Y) geschätzt wird, so könnte man sagen, dass eine Prognose 821610.000 units8217 ausgeschaltet ist. Dieser Fehler kann als klein angesehen werden, wenn die tatsächlichen Werte in den Milliarden von Einheiten liegen. Der Fehler konnte als groß angesehen werden, wenn die tatsächlichen Werte nur in den 108217s von Tausenden reichen. Ein häufiges Problem bei der MSE ist, dass es stark Gewichte große Ausreißern die Fehlermessung aufzublasen. Der Root Mean Squared Error nimmt die Quadratwurzel des MSE auf. RMSE repräsentiert die Standardabweichung der Residuen. Die mittlere absolute Prozentsatz Error (MAPE) ist ein alternatives Verfahren, das den Fehler als Prozentsatz berichtet werden. Anstatt die Prognose sagen von 8216x units8217 ausgeschaltet ist, könnten wir eine Prognose sagen weg ist von 4. Ich häufig mehr als eine Methode verwenden, wenn Prognosen zu vergleichen, da jeder mit Einschränkungen verbunden, die irgendwann in Fehlmessungen durch eine oder zwei Methoden zur Folge haben kann. Gleichung 2 Ampere 3: MSE und MAPE Gleichung 3: RMSE Prognose 1: Fehlermessungen MSE: 630,649.39 RMSE: 794,13 MAPE: 10.22 Saldierung Y Subset Liste Es ist interessant, dass die oben genannten Prognose (Prognose 1) nicht 8216fit8217 die tatsächlichen Werte effektiver 8211 Es ist eine einfache Datenreihe, ich würde erwarten, dass die Residuen kleiner werden. Um die Y-Hut Werte für den Zeitraum 12 gleitenden Durchschnitt Modell berechnen, verwende ich eine Formel, die Zeit (t) 12 Perioden voraus (siehe Gleichung 1 oben) bewegt. Dies war, wie ich ursprünglich gelehrt wurde und haben Beispiele für in Lehrbüchern auf meinem Büro Regal. Dieser Code erstellt yfull aus der geladenen Daten-Datei dann erstellt eine Teilmenge Liste ab 12 Perioden in. Warum8230, weil wir die ersten 12 Periode verwenden, um unsere gleitende durchschnittliche Prognose zu starten. Die Prognosewerte, jedoch nicht 8216fit8217 die tatsächlichen Werte so viel wie ich möchte. Sie sind entweder unter Vorhersage oder über Vorhersage. Eine andere Methode für die gleitende durchschnittliche Prognose schlagen vor, dass die Prognose an der Mitte von 8216k8217 beginnt. Prognose 1: Daten unter Verwendung des Mittelwerts von 8216k8217 Prognose 2: 12 Periodenbewegungsdurchschnitt Prognose 2: Fehlermessungen MSE: 7.350.78 RMSE: 85.74 MAPE: 0.86 Der Vergleich der Prognosefehlermessungen von Prognose 1 mit Prognose 2 zeigt, dass die zweite Methode besser geeignet ist Unsere Daten. Allerdings gibt es eine Menge von Inhalten auf Centered Moving Averages, die detailliert geben, wie die Mittelwerte für gerade / ungerade Perioden zu berechnen. Ich bin nicht die Quelle, die ich bin lediglich zu zeigen, wie die Verringerung der Verzögerung der Mittelwerte besser richtet unsere Y Hüte auf die tatsächlichen und verbessert die Fehler-Maßnahmen. Der Code ist fast identisch, mit Ausnahme der Untermenge-Liste (yvalues) erstellt 6 Perioden in und stoppt 6 Perioden kurz. Die Mittelung der Daten ab dem Mittelpunkt reduzierte die Menge der Über - / Untervorhersage, wie sie in der Prognose 1 durchgeführt wurde. Prognose 2: Daten, wenn der Mitteldurchschnitt weniger geeignet ist Die durchschnittliche durchschnittliche Prognose fängt an, wenn die Datenreihe eine zyklische Komponente oder Saisonalität aufweist. Unten ist die gleiche 12-Periode gleitenden Durchschnitt Python-Code gegen eine zyklische Datenreihe. Prognose 3: 12 Periodenbewegungsdurchschnitte Prognose 3: Fehlermessungen MSE: 5.386.003.002,91 RMSE: 73.389,39 MAPE: 48.79 Die Kurve und die berechneten Fehlermessungen belegen, dass sich die gleitenden Durchschnittswerte nicht gut für diese Serie eignen. Ich werde diese gleiche Serie mit anderen Prognose-Modelle verwenden, um Techniken, die Pick-up-Zyklen in den Daten zu demonstrieren.

No comments:

Post a Comment