Saturday 25 November 2017

Moving Average Python Pandas


Backtesting ein Moving Average Crossover in Python mit Pandas. Im vorherigen Artikel über Research Backtesting Umgebungen In Python Mit Pandas haben wir eine objektorientierte forschungsorientierte Backtesting-Umgebung erstellt und sie auf einer zufälligen Prognosestrategie getestet. In diesem Artikel nutzen wir die Maschinen, die wir eingeführt haben, um die Forschung über eine tatsächliche Strategie durchzuführen, nämlich die Moving Average Crossover auf AAPL. Moving Average Crossover-Strategie. Die Moving Average Crossover-Technik ist eine äußerst bekannte vereinfachte Impulsstrategie Es wird oft als das Hello World-Beispiel für den quantitativen Handel betrachtet. Die Strategie, wie hier beschrieben, ist lang-nur Zwei getrennte einfache gleitende durchschnittliche Filter werden mit unterschiedlichen Lookback-Perioden einer bestimmten Zeitreihe erzeugt Signale, um das Asset zu erwerben, wenn der kürzere Lookback gleitenden Durchschnitt den längeren Rückblick gleitenden Durchschnitt überschreitet Wenn der längere Durchschnittlich nachträglich den kürzeren Durchschnitt übersteigt, wird der Vermögenswert zurück verkauft Die Strategie funktioniert gut, wenn eine Zeitreihe in einen Zeitraum von starkem Trend eintritt und dann langsam den Trend rückgängig macht. Für dieses Beispiel habe ich Apple, Inc AAPL als Zeitreihe gewählt Ein kurzer Rückblick von 100 Tagen und ein langer Rückblick von 400 Tagen Dies ist das Beispiel, das von der zipline algorithmischen Handelsbibliothek zur Verfügung gestellt wird. Wenn wir also unseren eigenen Backtester implementieren wollen, müssen wir sicherstellen, dass er mit den Ergebnissen in Zipline übereinstimmt Validierung. Stellen Sie sicher, dass die vorherige Tutorial hier, die beschreibt, wie die anfängliche Objekthierarchie für den Backtester konstruiert wird, sonst wird der unten stehende Code nicht funktionieren Für diese spezielle Implementierung habe ich die folgenden Bibliotheken verwendet. Die Implementierung von erfordert aus dem vorherigen Tutorial Die Der erste Schritt besteht darin, die notwendigen Module und Objekte zu importieren. Im vorherigen Tutorial werden wir die Strategy abstract Basisklasse unterteilen, um MovingAverageCrossStrategy zu produzieren, die alle Details enthält, wie man die Signale generiert, wenn die gleitenden Mittelwerte von AAPL überkreuzen Andere. Das Objekt erfordert ein kurzes Fenster und ein langes Fenster, auf dem zu betreiben Die Werte wurden auf Standardwerte von 100 Tagen und 400 Tagen gesetzt, die die gleichen Parameter sind, die im Hauptbeispiel der Zipline verwendet werden. Die gleitenden Mittelwerte werden durch die Verwendung der Pandas Rollingmean-Funktion auf den Stäben Schließen Sie den Schlusskurs der AAPL-Aktie Sobald die einzelnen gleitenden Mittelwerte konstruiert wurden, wird die Signalreihe erzeugt, indem die Colum gleich 1 0 gesetzt wird, wenn der kurze gleitende Durchschnitt größer ist als der lange gleitende Durchschnitt oder 0 0 sonst können die Positionen Aufträge generiert werden, um Trading-Signale darzustellen. Das MarketOnClosePortfolio wird von Portfolio untergeordnet, das in gefunden wird. Es ist fast identisch mit der im vorherigen Tutorial beschriebenen Implementierung, mit der Ausnahme, dass die Trades nun auf einem Close-to-Close-Basis, anstatt eine Open-to-Open-Basis Für Details darüber, wie das Portfolio-Objekt definiert ist, sehen Sie das vorherige Tutorial Ich habe den Code in Vollständigkeit verlassen und dieses Tutorial selbst behalten MovingAverageCrossStrategy und MarketOnClosePortfolio Klassen wurden definiert, eine Hauptfunktion wird aufgerufen, um alle Funktionalität zusammen zu binden Zusätzlich wird die Performance der Strategie über eine Kurve der Eigenkapitalkurve untersucht. Das Pandas DataReader Objekt lädt OHLCV Preise von AAPL Lager für Die Periode 1. Januar 1990 bis 1. Januar 2002, an welcher Stelle die Signale DataFrame erstellt werden, um die Langzeitsignale zu erzeugen. Anschließend wird das Portfolio mit einer Anfangskapitalbasis von 100.000 USD generiert und die Renditen werden auf der Eigenkapitalkurve berechnet. Der letzte Schritt Ist es, matplotlib zu verwenden, um eine zweidimensionale Handlung von beiden AAPL-Preisen zu zeichnen, überlagert mit den gleitenden Durchschnitten und Kaufsignalen sowie die Eigenkapitalkurve mit den gleichen Kaufsignalen. Der Plottercode wird aus dem Zipline-Implementierungsbeispiel genommen und modifiziert. Die grafische Ausgabe des Codes ist wie folgt Ich habe Gebrauch von der IPython Paste Befehl, um diese direkt in die IPython-Konsole, während in Ubuntu, so dass die grafische Ausgabe blieb in Sicht Die rosa upticks repräsentieren den Kauf der Aktie, während die schwarzen Abschlüsse Vertreten Verkauf es zurück. AAPL Moving Average Crossover Performance von 1990-01-01 bis 2002-01-01.As kann gesehen werden, die Strategie verliert Geld über den Zeitraum, mit fünf Round-Trip-Trades Dies ist nicht überraschend angesichts der Verhalten von AAPL Über dem Zeitraum, der auf einem leichten Abwärtstrend lag, gefolgt von einem erheblichen Aufschwung, der 1998 beginnt. Die Rückblickperiode der bewegten Durchschnittssignale ist ziemlich groß und dies hat den Gewinn des Endhandels beeinflusst, der sonst die Strategie rentabel gemacht hat. In den nachfolgenden Artikeln werden wir ein anspruchsvolleres Mittel zur Leistungsanalyse schaffen und beschreiben, wie man die Lookback-Perioden der einzelnen gleitenden Mittelsignale optimiert. Mit dem quantitativen Trading. Schießen mit exponentiell gewichteten Moving Averages wird ein gleitender Durchschnitt erreicht Geräuschvolle Zeitreihen und ersetzt jeden Wert mit dem Mittelwert einer Nachbarschaft um den gegebenen Wert. Diese Nachbarschaft kann aus rein historischen Daten bestehen, oder sie kann sich um den gegebenen Wert konzentrieren. Außerdem können die Werte in der Nachbarschaft mit verschiedenen Sätzen gewichtet werden Gewichte Hier ist ein Beispiel für einen gleich gewichteten Dreipunkt gleitenden Durchschnitt, mit historischen Daten. Hierbei handelt es sich um das geglättete Signal und stellt die verrauschte Zeitreihe dar. Im Gegensatz zu einfachen gleitenden Durchschnitten passt ein exponentiell gewichteter gleitender Durchschnitt EWMA einen Wert nach einem Exponentiell gewichtete Summe aller bisherigen Werte Dies ist die grundlegende idea. This ist nett, weil man sich nicht darum kümmern muss, ein Dreipunktfenster zu haben, im Vergleich zu einem Fünfpunktfenster oder Sorgen um die Angemessenheit deines Gewichtungsschemas mit dem EWMA, vorher Störungen erinnerten sich und wurden langsam durch den Begriff in der letzten Gleichung vergessen, während bei einem Fenster oder einer Nachbarschaft mit diskreten Grenzen eine Störung vergessen wird, sobald sie aus dem Fenster herauskommt. Die EWMA, um Trends zu finden. Nach dem Lesen über EWMAs In einem Datenanalyse-Buch war ich glücklich mit diesem Tool auf jede einzelne Glättungsanwendung gegangen, auf die ich stieß. Es war erst später, dass ich erfuhr, dass die EWMA-Funktion wirklich nur für stationäre Daten geeignet ist, dh Daten ohne Trends oder Saisonalität Besonders die EWMA-Funktion widersteht Trends weg von der aktuellen Bedeutung, die es schon gesehen hat Also, wenn du eine laute Hut-Funktion hast, die von 0 auf 1 und dann wieder auf 0 geht, dann gibt die EWMA-Funktion wieder niedrige Werte an Up-Hill-Seite und hohe Werte auf der Abfahrtsseite Ein Weg, um dies zu umgehen, ist, das Signal in beide Richtungen zu glätten, nach vorne zu marschieren und dann rückwärts zu marschieren und dann die beiden zu verkleinern Hier werden wir die EWMA-Funktion nutzen Durch das Pandas-Modul. Holt-Winters Zweite Ordnung EWMA. Die Holt-Winters zweiter Ordnung Methode versucht, den geschätzten Trend in die geglätteten Daten zu integrieren, mit einem Begriff, der die Spur des ursprünglichen Signals verfolgt. Das geglättete Signal wird in die geschrieben Term. Und hier ist ein Python-Code implementiert die Holt-Winters zweite Ordnung Methode auf eine andere laute Hut-Funktion, wie vorher. Post Navigation. Recent Postsputational Tools. Analogously hat DataFrame eine Methode cov, um paarweise Kovarianzen unter den Serien in der DataFrame zu berechnen, Auch unter Ausschluss von NA-Nullwerten. Wenn man die fehlenden Daten zufällig fehlt, ergibt sich eine Schätzung für die Kovarianzmatrix, die jedoch für viele Anwendungen geeignet ist. Diese Schätzung kann jedoch nicht akzeptabel sein, da die geschätzte Kovarianzmatrix nicht als positiv semi - Definitiv Dies könnte zu geschätzten Korrelationen mit absoluten Werten führen, die größer als eins sind, und oder eine nicht-invertierbare Kovarianzmatrix Siehe Schätzung der Kovarianzmatrizen für weitere Details. Unterstützt auch ein optionales minperiods-Schlüsselwort, das die erforderliche minimale Anzahl von Beobachtungen für jedes Spaltenpaar spezifiziert, um ein gültiges Ergebnis zu haben. Die im Fenster verwendeten Gewichte werden durch das wintype-Schlüsselwort angegeben. Die Liste der erkannten Typen ist. Kaiser benötigt beta. gaussian Braucht std. generalgaussian braucht Macht, width. slepian braucht width. Hinweis, dass das Boxcar-Fenster äquivalent zu mean. Für einige Fenster-Funktionen sind zusätzliche Parameter angegeben werden. Für mit einem Wintype gibt es keine Normalisierung an den Gewichten für das Fenster Passing getan Gewohnheiten Gewichte von 1, 1, 1 ergibt ein anderes Ergebnis als das Übergeben von Gewichten von 2, 2, 2 zum Beispiel Wenn man einen Wintype anstatt explizit die Gewichte spezifiziert, sind die Gewichte bereits normalisiert, so dass das größte Gewicht 1. Im Gegensatz ist , Die Art der Berechnung ist so, dass die Gewichte in Bezug auf einander normalisiert werden. Gewichte von 1, 1, 1 und 2, 2, 2 ergeben das gleiche Ergebnis. Zeitbewusstes Rolling. New in Version 0 19 0.Neu in Version 0 19 0 sind die Möglichkeit, einen Offset oder eine Cabriolet an eine Methode weiterzugeben und sie auf der Grundlage des verstrichenen Zeitfensters variable Fenster zu erstellen. Für jeden Zeitpunkt sind alle vorangehenden Werte enthalten, die innerhalb der angegebenen Zeit delta. This auftreten Nützlich für einen nicht regelmäßigen Zeitfrequenzindex. Dies ist ein regelmäßiger Frequenzindex Mit einem Integer-Fenster-Parameter arbeitet, um entlang der Fensterfrequenz zu rollen. Spezifizieren eines Offsets ermöglicht eine intuitivere Spezifikation der rollenden Frequenz. Using eine nicht-regelmäßige, aber immer noch Monoton-Index, Rolling mit einem Integer-Fenster gibt keine spezielle Berechnung. Using die Zeit-Spezifikation generiert variable Fenster für diese spärlichen Daten. Weiterhin erlauben wir nun einen optionalen Parameter, um eine Spalte anstelle der Standardeinstellung des Index in a anzugeben DataFrame. Time-aware Rolling vs Resampling. Using mit einem zeitbasierten Index ist ganz ähnlich wie Resampling Sie beide betreiben und führen reduktive Operationen auf zeitindizierte Pandas Objekte. Wenn mit einem Offset verwenden Der Offset ist ein Zeit-Delta Nehmen Sie einen Rücklauf - In-Zeit-Fenster und aggregieren alle Werte in diesem Fenster einschließlich der Endpunkt, aber nicht der Startpunkt Dies ist der neue Wert an diesem Punkt im Ergebnis Dies sind variable Größe Fenster im Zeit-Raum für jeden Punkt der Eingabe Sie erhalten ein gleiches Ergebnis wie die Eingabe. Wenn die Verwendung mit einem Offset Konstruieren Sie einen neuen Index, der die Frequenz des Offsets ist Für jeden Frequenz-Bin, aggregieren Punkte aus dem Eingang in einem rückwärts-in-Zeit suchen Fenster Die in diesen Behälter fallen Das Ergebnis dieser Aggregation ist die Ausgabe für diesen Frequenzpunkt Die Fenster sind feste Größengröße im Frequenzraum Ihr Ergebnis hat die Form einer regelmäßigen Frequenz zwischen dem Min und dem Maximum des ursprünglichen Eingabeobjekts Zusammenfassen von Rolling ist eine zeitbasierte Fensterbedienung, während eine frequenzbasierte Fensterbedienung ist. Centering Windows. By Standard werden die Etiketten auf den rechten Rand des Fensters gesetzt, aber ein zentrales Keyword steht zur Verfügung, so dass die Labels an der Center. Binary Window Functions. cov und corr können bewegliche Fensterstatistiken über zwei Series oder eine beliebige Kombination von DataFrame Series oder DataFrame DataFrame berechnen Hier ist das Verhalten in jedem Fall. Wo Series berechnen die Statistik für die pairing. DataFrame Series berechnen die Statistiken für jeden Spalte des DataFrame mit der übergebenen Serie und damit die Rückgabe eines DataFrame. DataFrame DataFrame standardmäßig die Statistik für die Übereinstimmung von Spaltennamen, die Rückgabe eines DataFrame Wenn das Keyword-Argument paarweise True übergeben wird, berechnet dann die Statistik für jedes Spaltenpaar und gibt ein Panel zurück Deren Gegenstände die fraglichen Termine sind, sehen die nächsten abschnittsweise rollenden paarweise Kovarianzen und Korrelationen. In der Finanzdatenanalyse und anderen Bereichen ist es üblich, Kovarianz - und Korrelationsmatrizen für eine Sammlung von Zeitreihen zu berechnen. Oft ist auch an der Verschiebungsfenster-Kovarianz interessiert Korrelationsmatrizen Dies kann getan werden, indem man das paarweise Schlüsselwort-Argument übergibt, das im Fall von DataFrame-Eingaben ein Panel liefert, dessen Items die fraglichen Termine sind. Im Falle eines einzelnen DataFrame-Arguments kann das paarweise Argument sogar weggelassen werden Ignoriert und jeder Eintrag wird unter Verwendung der paarweise vollständigen Beobachtungen berechnet. Bitte beachten Sie den Kovarianzabschnitt für Vorbehalte, die mit dieser Methode zur Berechnung von Kovarianz - und Korrelationsmatrizen assoziiert sind. Neben dem Nicht-Fenster-Parameter haben diese Funktionen die gleichen Schnittstellen wie ihre Gegenstücke Parameter, die sie alle akzeptieren. minperioden Schwellenwert von Nicht-Null-Datenpunkten, um Standardwerte zu benötigen, die erforderlich sind, um die Statistik zu berechnen. Keine NaNs werden ausgegeben, sobald minperiods Nicht-Null-Datenpunkte gesehen worden sind. center boolean, ob die Etiketten in der Mitte gesetzt werden sollen Default ist false. Die Ausgabe der und Methoden gibt keine NaN zurück, wenn es mindestens Minimalperioden Nicht-Null-Werte im aktuellen Fenster gibt. Dies unterscheidet sich von cumsum cumprod cummax und cummin, die NaN in der Ausgabe zurückgeben, wo immer eine NaN in der Input. Weiter-Fenster-Statistik ist stabiler und weniger reaktionsfähig als sein Roll-Fenster-Pendant, da die zunehmende Fenstergröße den relativen Einfluss eines einzelnen Datenpunktes verringert. Beispielsweise ist hier die mittlere Ausgabe für den vorherigen Zeitreihen-Datensatz. Exponentiell gewichtet Windows. A verwandte Reihe von Funktionen sind exponentiell gewichtete Versionen von mehreren der oben genannten Statistiken Eine ähnliche Schnittstelle zu und wird durch die Methode, um ein EWM-Objekt zugegriffen wird eine Reihe von expandierenden EW exponentiell gewichteten Methoden zur Verfügung gestellt wird.

No comments:

Post a Comment