Python Pandas Exponentiell Gleitender Durchschnitt

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 werden wir von der Maschine Gebrauch machen, 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 Hallo-Welt-Beispiel für den quantitativen Handel betrachtet. Die hier beschriebene Strategie ist nur langwierig. Zwei separate, einfach gleitende Durchschnittsfilter werden mit unterschiedlichen Lookback-Perioden einer bestimmten Zeitreihe erstellt. Signale zum Kauf des Vermögenswertes treten auf, wenn der kürzere Rückblick gleitende Durchschnitt den längeren Rückblick gleitenden Durchschnitt überschreitet. Wenn der längere Durchschnitt später den kürzeren Durchschnitt übersteigt, wird der Vermögenswert zurückverkauft. Die Strategie funktioniert gut, wenn eine Zeitreihe einen starken Trend einbringt und dann langsam den Trend rückgängig macht. Für dieses Beispiel habe ich Apple, Inc. (AAPL) als Zeitreihe gewählt, mit einem kurzen Rückblick von 100 Tagen und einem langen Rückblick von 400 Tagen. Dies ist das Beispiel der zipline algorithmischen Handelsbibliothek. Wenn wir also unseren eigenen Backtester umsetzen wollen, müssen wir sicherstellen, dass er mit den Ergebnissen in der Zipline übereinstimmt. Implementierung Achten Sie darauf, dem vorherigen Tutorial zu folgen. Die beschreibt, wie die anfängliche Objekthierarchie für den Backtester aufgebaut wird, andernfalls wird der unten stehende Code nicht funktionieren. 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 besteht darin, die notwendigen Module und Objekte zu importieren: Wie im vorherigen Tutorial werden wir die Strategy abstract Basisklasse unterteilen, um MovingAverageCrossStrategy zu produzieren. Die alle Details enthält, wie man die Signale erzeugt, wenn die gleitenden Mittelwerte von AAPL einander kreuzen. Das Objekt erfordert ein kurzes Fenster und ein langes Fenster, auf dem es zu bedienen ist. Die Werte wurden auf Vorgaben von 100 Tagen bzw. 400 Tagen gesetzt, wobei die gleichen Parameter im Hauptbeispiel der Zipline verwendet wurden. Die gleitenden Durchschnitte werden durch die Verwendung der Pandas Rollingmean-Funktion auf den Bars erstellt. Schließen Sie den Preis der AAPL-Aktie. Sobald die einzelnen sich bewegenden Mittelwerte konstruiert worden sind, wird die Signalreihe erzeugt, indem die Kolonne gleich 1,0 eingestellt wird, wenn der kurze gleitende Durchschnitt größer ist als der lange gleitende Durchschnitt oder 0,0 ansonsten. Daraus können die Positionen Aufträge erzeugt werden, um Handelssignale darzustellen. Das MarketOnClosePortfolio ist aus dem Portfolio untergeordnet. Die in backtest. py gefunden wird. Es ist fast identisch mit der im vorigen 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. Weitere Informationen darüber, wie das Portfolio-Objekt definiert ist, finden Sie im vorherigen Tutorial. Ive verließ den Code in Vollständigkeit und behalte dieses Tutorial in sich geschlossen: Jetzt, da die MovingAverageCrossStrategy und MarketOnClosePortfolio Klassen definiert wurden, wird eine Hauptfunktion aufgerufen, um alle Funktionalität zusammen zu binden. Darüber hinaus wird die Performance der Strategie über eine Kurve der Eigenkapitalkurve untersucht. Das Pandas DataReader-Objekt lädt OHLCV-Preise von AAPL-Aktien für den Zeitraum vom 1. Januar 1990 bis zum 1. Januar 2002 zu, an welchem ​​Punkt die Signale DataFrame erstellt werden, um die Langzeitsignale zu erzeugen. Anschließend wird das Portfolio mit einer Anfangskapitalbasis von 100.000 USD erwirtschaftet und die Renditen werden auf der Eigenkapitalkurve berechnet. Der letzte Schritt ist es, matplotlib zu verwenden, um ein zweidimensionales Diagramm von beiden AAPL-Preisen zu zeichnen, überlagert mit den gleitenden Durchschnitten und Buysell-Signalen sowie die Eigenkapitalkurve mit den gleichen Buysell-Signalen. Der Plottencode wird aus dem Zipline-Implementierungsbeispiel genommen (und modifiziert). Die grafische Ausgabe des Codes ist wie folgt. Ich habe von der IPython-Paste-Befehl Gebrauch gemacht, um diese direkt in die IPython-Konsole zu setzen, während in Ubuntu, so dass die grafische Ausgabe im Blick blieb. Die rosa upticks stellen den Kauf der Aktie dar, während die schwarzen Abschlüsse den Verkauf wieder verkaufen: Wie man sieht, verliert die Strategie im Laufe der Zeit Geld mit fünf Hin - und Rückfahrten. Dies ist nicht verwunderlich angesichts des Verhaltens von AAPL über den Zeitraum, der auf einem leichten Abwärtstrend war, gefolgt von einem erheblichen Aufschwung, der 1998 begann. Die Rückblickperiode der gleitenden Durchschnittssignale ist ziemlich groß und dies hat den Gewinn des Endhandels beeinflusst , Die sonst die Strategie rentabel gemacht haben könnte. In den folgenden Artikeln werden wir ein anspruchsvolleres Mittel zur Leistungsanalyse schaffen und beschreiben, wie man die Lookback-Perioden der einzelnen gleitenden Mittelsignale optimiert. Just Getting Started mit quantitativen TradingSmoothing mit exponentiell gewichteten Moving Averages Ein gleitender Durchschnitt nimmt eine laute Zeitreihe und ersetzt jeden Wert mit dem Mittelwert einer Nachbarschaft um den angegebenen Wert. Diese Nachbarschaft kann aus rein historischen Daten bestehen, oder sie kann sich auf den gegebenen Wert konzentrieren. Darüber hinaus können die Werte in der Nachbarschaft mit verschiedenen Sätzen von Gewichten gewichtet werden. Hier ist ein Beispiel für einen gleich gewichteten Dreipunkt gleitenden Durchschnitt, mit historischen Daten, Hier repräsentiert das geglättete Signal und stellt die lauten Zeitreihen dar. Im Gegensatz zu einfachen gleitenden Durchschnitten passt ein exponentiell gewichteter gleitender Durchschnitt (EWMA) einen Wert entsprechend einer exponentiell gewichteten Summe aller bisherigen Werte an. Dies ist die Grundidee, das ist schön, weil du dich nicht darum kümmern musst, ein Dreipunktfenster zu haben, gegen ein Fünfpunktfenster oder Sorge um die Angemessenheit deines Gewichtungsschemas. Mit dem EWMA wurden die vorherigen Störungen, 8221 und 8220 vergessen, 8221 durch den Begriff in der letzten Gleichung, während bei einem Fenster oder einer Nachbarschaft mit diskreten Grenzen eine Störung vergessen wird, sobald sie aus dem Fenster herauskommt. Mittelung der 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, die ich stieß, gegangen. Erst später erfuhr ich, dass die EWMA-Funktion wirklich nur für stationäre Daten geeignet ist, d. H. Daten ohne Trends oder Saisonalität. Insbesondere widersteht die EWMA-Funktion den Trends weg von der aktuellen Bedeutung, dass es8217s bereits 8220seen8221 ist. Also, wenn du eine laute Hut-Funktion hast, die von 0 auf 1 und dann wieder auf 0 geht, dann gibt die EWMA-Funktion auf der Hügel-Seite niedrige Werte und hohe Werte auf der Down-Hills-Seite zurück. Eine Möglichkeit, 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 mitteln. Hier werden wir die EWMA-Funktion des Pandas-Moduls nutzen. Holt-Winters Zweite Ordnung EWMA Und hier ist ein Python-Code, der die Holt-Winters zweiter Ordnung auf eine andere laute Hutfunktion implementiert, wie zuvor. Post-Navigation Neue BeiträgeComputer-Tools Analog hat DataFrame eine Methode cov, um paarweise Kovarianzen unter den Serien im DataFrame zu berechnen, wobei auch NAnull-Werte ausgeschlossen sind. Unter der Annahme, dass die fehlenden Daten zufällig fehlen, ergibt sich eine Schätzung für die Kovarianzmatrix, die unvoreingenommen ist. Für viele Anwendungen ist diese Schätzung jedoch nicht akzeptabel, da die geschätzte Kovarianzmatrix nicht als positiv halb-definitiv garantiert ist. Dies könnte zu geschätzten Korrelationen mit absoluten Werten führen, die größer als eins sind und eine nicht invertierbare Kovarianzmatrix. Siehe Schätzung der Kovarianzmatrizen für weitere Details. DataFrame. cov unterstützt auch ein optionales Minperiod-Keyword, das die erforderliche Mindestanzahl von Beobachtungen für jedes Spaltenpaar angibt, um ein gültiges Ergebnis zu erhalten. Die im Fenster verwendeten Gewichte werden durch das Schlüsselwort wintype angegeben. Die Liste der anerkannten Typen sind: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (benötigt beta) gaussian (benötigt std) generalgaussian (benötigt Macht, Breite) slepian (braucht Breite). Beachten Sie, dass das Kastenfenster dem Mittelwert entspricht (). Für einige Fensterfunktionen müssen zusätzliche Parameter angegeben werden: Für. sum () mit einem Wintype. Es gibt keine Normalisierung an den Gewichten für das Fenster. Wenn man benutzerdefinierte Gewichte von 1, 1, 1 erhält, ergibt sich ein anderes Ergebnis als die Gewichte von 2, 2, 2. zum Beispiel. Beim Überschreiten eines Wintyps anstatt explizit die Gewichte zu spezifizieren, sind die Gewichte bereits normalisiert, so dass das größte Gewicht 1 ist. Im Gegensatz dazu ist die Art der. mean () - Berechnung so, dass die Gewichte in Bezug aufeinander normalisiert werden. Gewichte von 1, 1, 1 und 2, 2, 2 ergeben das gleiche Ergebnis. Time-aware Rolling Neu in Version 0.19.0. Neu in der Version 0.19.0 sind die Möglichkeit, einen Offset (oder Cabrio) an eine. rolling () - Methode zu übergeben und es auf der Grundlage des übergebenen Zeitfensters variable Fenster zu erzeugen. Für jeden Zeitpunkt sind alle vorangegangenen Werte innerhalb der angegebenen Zeit delta enthalten. Dies kann besonders nützlich für einen nicht regelmäßigen Zeitfrequenzindex sein. Dies ist ein regelmäßiger Frequenzindex. Die Verwendung eines Integer-Fensterparameters funktioniert, um die Fensterfrequenz zu rollen. Die Angabe eines Offsets ermöglicht eine intuitivere Spezifikation der Rollfrequenz. Mit einem nicht regelmäßigen, aber immer noch monotonen Index, das Rollen mit einem ganzzahligen Fenster gibt keine spezielle Berechnung. Die Verwendung der Zeit-Spezifikation erzeugt variable Fenster für diese spärlichen Daten. Darüber hinaus erlauben wir nun einen optionalen Parameter, um eine Spalte (und nicht die Standardeinstellung des Index) in einem DataFrame anzugeben. Time-aware Rolling vs. Resampling Mit. rolling () mit einem zeitbasierten Index ähnelt dem Resampling. Sie betreiben und führen reduktive Operationen auf zeitindizierten Pandasobjekten durch. Bei Verwendung von. rolling () mit einem Offset. Der Versatz ist ein Zeit-Dreieck. Nehmen Sie ein Rückwärts-in-Zeit-Fenster und aggregieren alle Werte in diesem Fenster (einschließlich der Endpunkt, aber nicht der Startpunkt). Dies ist der neue Wert zu diesem Zeitpunkt im Ergebnis. Dies sind variable Fenster im Zeitraum für jeden Punkt der Eingabe. Sie erhalten ein gleiches Ergebnis wie die Eingabe. Bei Verwendung von. resample () mit einem Offset. Konstruieren Sie einen neuen Index, der die Häufigkeit des Offsets ist. Für jeden Frequenz-Bin, Aggregat Punkte aus der Eingabe in einem Rückwärts-in-Zeit-Fenster, die in diesem bin. Das Ergebnis dieser Aggregation ist die Ausgabe für diesen Frequenzpunkt. Die Fenster sind im Größenbereich feste Größe. Ihr Ergebnis hat die Form einer regelmäßigen Frequenz zwischen dem Min und dem Maximum des ursprünglichen Eingabeobjekts. Zusammenfassen. Rolling () ist eine zeitbasierte Fensterbedienung, während. resample () eine frequenzbasierte Fensteroperation ist. Zentrieren von Windows Standardmäßig sind die Etiketten am rechten Rand des Fensters eingestellt, aber ein zentrales Schlüsselwort steht zur Verfügung, so dass die Etiketten in der Mitte eingestellt werden können. Binäre Fensterfunktionen cov () und corr () können bewegte Fensterstatistiken über zwei Serien oder eine beliebige Kombination von DataFrameSeries oder DataFrameDataFrame berechnen. Hier ist das Verhalten in jedem Fall: zwei Serien. Berechnen Sie die Statistik für die Paarung. DataFrameSeries. Berechnen Sie die Statistik für jede Spalte des DataFrame mit der übergebenen Serie und geben so ein DataFrame zurück. DataFrameDataFrame. Standardmäßig berechnen Sie die Statistik für passende Spaltennamen und geben ein DataFrame zurück. Wenn das Keyword-Argument paarweiseTrue übergeben wird, berechnet man die Statistik für jedes Spaltenpaar und gibt ein Panel zurück, dessen Elemente die betreffenden Termine sind (siehe nächster Abschnitt). Computing Rolling Paarweise Kovarianzen und Korrelationen In der Finanzdatenanalyse und anderen Bereichen it8217s gemeinsam, um Kovarianz und Korrelationsmatrizen für eine Sammlung von Zeitreihen zu berechnen. Oft ist man auch an Moving-Fenster-Kovarianz - und Korrelationsmatrizen interessiert. Dies kann getan werden, indem man das paarweise Schlüsselwort-Argument übergibt, das im Fall von DataFrame-Eingaben ein Panel liefert, dessen Elemente die Daten sind. Im Falle eines einzigen DataFrame-Arguments kann das paarweise Argument sogar weggelassen werden: Fehlende Werte werden ignoriert und jeder Eintrag wird mit den paarweise vollständigen Beobachtungen berechnet. Bitte beachten Sie die Kovarianz-Sektion für Einschränkungen, die mit dieser Methode zur Berechnung von Kovarianz - und Korrelationsmatrizen verbunden sind. Abgesehen davon, dass kein Fensterparameter vorhanden ist, haben diese Funktionen die gleichen Schnittstellen wie ihre. rolling-Pendants. Wie oben sind die Parameter, die sie alle akzeptieren: minperiods. Schwelle von Nicht-Null-Datenpunkten zu erfordern. Standardmäßig benötigt, um die Statistik zu berechnen. Es werden keine NaNs ausgegeben, sobald Minimalperioden Nicht-Null-Datenpunkte gesehen wurden. Center. Boolean, ob die Etiketten in der Mitte gesetzt werden sollen (Standard ist False) Die Ausgabe der. rolling - und. expanding-Methoden gibt kein NaN zurück, wenn es im aktuellen Fenster mindestens Minimalperioden gibt. Das unterscheidet sich von cumsum. Cumprod Cummax Und cummin Die NaN in der Ausgabe zurückgeben, wo ein NaN in der Eingabe angetroffen wird. Eine expandierende Fensterstatistik wird stabiler (und weniger reaktionsfähig) als sein Rollfenster, da die zunehmende Fenstergröße die relative Auswirkung eines einzelnen Datenpunktes verringert. Als Beispiel hierbei handelt es sich um die mittlere () Ausgabe für den vorherigen Zeitreihen-Datensatz: Exponentiell gewichtetes Fenster Ein verwandter Satz von Funktionen sind exponentiell gewichtete Versionen mehrerer der obigen Statistiken. Eine ähnliche Schnittstelle zu. rolling und. expanding wird durch die. ewm-Methode aufgerufen, um ein EWM-Objekt zu empfangen. Es werden eine Reihe von erweiterten EW (exponentiell gewichtete) Methoden zur Verfügung gestellt: Danke für die Buchung der EMA. Und ja, TAlib sollte wirklich verfügbar sein. Es gibt einige davon, was eigentlich sehr vielversprechend aussieht (githubquantopianziplinepull100). Ich werde versuchen, dies bald zu ziehen, um es einem größeren Publikum zur Verfügung zu stellen. Das Material auf dieser Website dient nur zu Informationszwecken und stellt weder ein Verkaufsangebot, eine Kaufanforderung noch eine Empfehlung oder eine Empfehlung für eine Sicherheit oder Strategie dar, noch stellt sie ein Angebot zur Bereitstellung von Anlageberatungsleistungen durch Quantopian dar. Darüber hinaus bietet das Material in Bezug auf die Eignung von Wertpapieren oder spezifischen Investitionen keine Stellungnahme. Quantopian übernimmt keinerlei Gewähr für die Richtigkeit und Vollständigkeit der in der Website geäußerten Ansichten. Die Ansichten sind freibleibend und können aus verschiedenen Gründen unzuverlässig geworden sein, einschließlich Änderungen der Marktbedingungen oder der wirtschaftlichen Umstände. Alle Investitionen beinhalten Risiken, einschließlich Verlust des Kapitals. Sie sollten sich vor einem Investitionsentscheid bei einem Anlageberater anmelden. Es tut. Aber das Beste aus der Arbeit, um herauszufinden, der beste Weg ist bereits getan. Wir müssen es nur noch abschließen. Danach ist es nur noch ein paar copyamppaste, um die ganze TAlib-Bibliothek zu verpacken. Es gibt viele gute Dinge in den Werken, um bestimmte Kurzschlüsse zu adressieren. Es ist eine Frage der Ressourcen zum größten Teil. Das Material auf dieser Website dient nur zu Informationszwecken und stellt weder ein Verkaufsangebot, eine Kaufanforderung noch eine Empfehlung oder eine Empfehlung für eine Sicherheit oder Strategie dar, noch stellt sie ein Angebot zur Bereitstellung von Anlageberatungsleistungen durch Quantopian dar. Darüber hinaus bietet das Material in Bezug auf die Eignung von Wertpapieren oder spezifischen Investitionen keine Stellungnahme. Quantopian übernimmt keinerlei Gewähr für die Richtigkeit und Vollständigkeit der in der Website geäußerten Ansichten. Die Ansichten sind freibleibend und können aus verschiedenen Gründen unzuverlässig geworden sein, einschließlich Änderungen der Marktbedingungen oder der wirtschaftlichen Umstände. Alle Investitionen beinhalten Risiken, einschließlich Verlust des Kapitals. Sie sollten sich vor einem Investitionsentscheid bei einem Anlageberater anmelden.


Comments