Friday, October 21, 2016

Gleitender Durchschnitt Pandas Dataframe

Pandas Spaltenoperationen (grundlegende mathematische Operationen und gleitende Durchschnitte) In diesem Pandas mit Python Tutorial Video mit Beispielcode, decken wir einige der schnellen und grundlegenden Operationen, die wir auf unseren Daten durchführen können. Angenommen, Sie haben einen Datensatz, dem Sie einen gleitenden Durchschnitt hinzufügen möchten, oder vielleicht möchten Sie einige mathematische Berechnungen ausführen, die auf einigen Datenbits in anderen Spalten basieren und das Ergebnis zu einer neuen Spalte hinzufügen. Mal sehen, wie wir das machen können: All das sollte verstanden werden, da es bereits bis zu diesem Punkt abgedeckt ist. Nun können wir eine neue Spalte mit der Bezeichnung H-L erstellen, wobei die Daten in der Spalte das Ergebnis des hohen Preises abzüglich des niedrigen Preises sind. Hier, ähnlich wie bei einem Wörterbuch, definieren wir ein neues Objekt in unseren Pandas-Daten und nennen es H-L. Daraus ergibt sich der Wert dieses H-L-Objekts (df. High - df. Low). Es ist noch nicht aufgewachsen, aber das ist eigentlich ganz interessant, dass wir das können, aber es könnte auch verwirrend sein. Wir könnten auch sagen, dfH-L dfHigh-dfLow, aber da Pandas so stark objektbasiert ist, konnten sie auch rein referenzieren wie ein Objekt Es liegt an dir, wie du es machen willst. Ich ziehe es vor, es wie ein Objekt zu behandeln, da das ist, was es ist. Nach weve laufen, können wir sehen, indem Sie ausdrucken, Kopf (), dass weve eine schöne neue Spalte mit unseren neuen Daten Das ist ordentlich, aber was ist mit Bezugnahme auf ältere Daten in anderen Spalten können wir es tun Ich möchte einen gleitenden Durchschnitt Sure wir können. Gleitende Durchschnitte sind tatsächlich in Pandas, genannt Rolling Mean gebaut. Oben, definiert Weve eine weitere Spalte, ähnlich wie wir können ein Wörterbuch, und sagte, dass die Spalte gleich df. rollingmean () des engen Preises ist. Unser zweiter Parameter ist hier der Zeitrahmen für diesen gleitenden Durchschnitt. Dann drucken wir nur ein Stück der Daten, vom 200. Element auf das 210.. Wir können df. head () hier nicht wirklich machen. Wir könnten, aber die Daten für die 100MA würde nicht berechnet werden, bis wir 100 Stück Daten zu berechnen. Eine weitere interessante eingebaute Funktion mit Pandas ist diff (): Mit der diff () - Funktion konnten Sie die Differenz für eine Spalte berechnen oder vom vorherigen Wert abweichen. So gibt es einige grundlegende Operationen und eine Einführung in einige Daten Manipulation und Analyse mit Pandas. Ich denke, Sie sehen wahrscheinlich inzwischen, wie beeindruckend dieses Modul ist. Analyse der Moving Average Crossover-Strategie Backtest Rückkehr mit Pandas So ist die tägliche Renditeverteilung weit von normal und zeigt immer so etwas positive Schräge und hohe Kurtosis (nb Schiefe der normalen Verteilung ist 0 , Und Kurtosis der Normalverteilung ist 3). I8217m gehen an dieser Stelle zu gehen, um ein wenig tiefer graben und produzieren einige wichtige Leistungsindikatoren (KPIs), die Sie gemeinsam finden würde, zusammen mit der Analyse aller Handelsstrategie Rückkehr gehen. Diese aren8217t bedeutete, um erschöpfend zu sein, aber I8217ll versuchen, auf die meisten der Hauptbereiche zu schlagen. Ich plane, Folgendes zu produzieren: 1) Annualisierte Rendite 2) Letzte 12 Monate Rendite 3) Volatilität 4) Sharpe Ratio 5) Maximale Drawdown 6) Calmar Ratio (Annualisierte Rendite / Maximum Drawdown) 7) Volatilität / Maximum Drawdown 8) Best Monats-Performance 9) Die schlechteste Monats-Performance 10) der gewinnbringenden Monatsmärkte Nicht rentable Monate 11) Anzahl der rentablen Monate / Anzahl der nicht rentablen Monate 12) Durchschnittlicher monatlicher Gewinn 13) Durchschnittlicher monatlicher Verlust 14) Durchschnittlicher monatlicher Gewinn / Durchschnittlicher monatlicher Verlust Bevor ich fortfahre Ich bin dabei, schnell ein neues frisches DataFrame aufzubauen, das unsere Strategie-Rückgabedaten auf einer monatlichen Basis statt einer täglichen Basis 8211 halten wird, die einige Berechnungen später einfacher machen und uns erlauben, eine monatliche Rendite-Tabelle zu erzeugen, die durch 8220re - Sampling8221 die ursprüngliche DataFrame Spalte der täglichen Strategie kehrt und Aufbau von dort aus. Durchschnittlicher monatlicher Gewinn 3,56 Durchschnittlicher monatlicher Verlust -3,33 Durchschnittlicher monatlicher Gewinn / durchschnittlicher monatlicher Verlust 1.0683 Und endlich8230gerade, zum von zu beenden und ein wenig mehr Pandas DataFrame Funktionalität zu verwenden, gehe ich, eine Tabelle der monatlichen Rückkehr zu verursachen. Der erste Schritt besteht darin, eine Pivot-Tabelle zu erstellen und es erneut zu erstellen, um ein sogenanntes 8220pandas. tseries. resample. DatetimeIndexResampler8221-Objekt zu erstellen. Damit wir es ein wenig mühelos manipulieren können, werde ich dieses Objekt in eine 8220DataFrame8221 mit der 8220.aggregate () 8221-Funktion umwandeln. Wir können nun den letzten Schliff ziehen, indem wir die Indexdaten umwandeln, um nur das Jahr anstatt das vollständige Datum anzuzeigen und dann die Spaltenmonatsheader (derzeit im numerischen Format) durch das richtige 8220MMM8221-Format zu ersetzen. Zuerst müssen wir einen der Tabellenspaltenindexstufen schnell fallen lassen, der momentan das Wort 8220Strategy8221 8211 ist, das uns mit einer Tabelle mit nur einem einstufigen Spaltenindex verlassen wird, der den Ganzzahlmonatsdarstellungen entspricht. Visuell ändert sich die Tabelle: Jetzt müssen wir nur den Datumsindex ändern, um in einem jährlichen Format (JJJJ) und die verbleibenden Spaltenüberschriften das monatliche Format (MMM) anzuzeigen. Wir sind jetzt links mit einer monatlichen Rendite-Tabelle, die so aussieht: Brilliant Nun, ich denke, dass8217s genug für jetzt, da dieser Beitrag beginnt, ein wenig lang zu bekommen. Ich habe einen Gedanken über die nächsten Tage über ein mögliches Thema für meine nächste Post und arbeiten daran. Vielen Dank für folgende entlang Primary SidebarBacktesting ein Moving Average Crossover in Python mit Pandas Von Michael Halls-Moore am 21. Januar 2014 Im vorherigen Artikel auf Research Backtesting-Umgebungen in Python Mit Pandas haben wir eine objektorientierte forschungsbasierte Backtesting-Umgebung erstellt und getestet Auf eine zufällige Prognosestrategie. 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 seit fünf Jahren in der quantitativen Finanzbranche tätig, vorwiegend als Quant-Entwickler und später als Quant-Trader-Consulting für Hedge Fundsputational Tools. Analog hat DataFrame eine Methode cov zur Berechnung Paarweise Kovarianzen unter den Serien im DataFrame, auch ohne NA / Nullwerte. Angenommen, daß die fehlenden Daten zufällig fehlen, ergibt sich eine Abschätzung für die Kovarianzmatrix, die unbestimmt ist. Für viele Anwendungen ist diese Schätzung jedoch nicht akzeptabel, da die geschätzte Kovarianzmatrix nicht als positiv halbdefinit garantiert ist. Dies könnte zu geschätzten Korrelationen mit Absolutwerten führen, die größer als eins und / oder eine nicht-invertierbare Kovarianzmatrix sind. Siehe Schätzung von Kovarianzmatrizen für weitere Details. DataFrame. cov unterstützt auch ein optionales Schlüsselwort minperiods, das die erforderliche Mindestanzahl von Beobachtungen für jedes Spaltenpaar angibt, um ein gültiges Ergebnis zu haben. Die Gewichte, die in dem Fenster verwendet werden, werden durch das wintype Schlüsselwort spezifiziert. Die Liste der anerkannten Arten sind: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (muss beta) Gaußscher (benötigt std) generalgaussian (braucht Leistung, Breite) slepian (braucht Breite). Beachten Sie, dass das Boxcar-Fenster dem Mittelwert () entspricht. Für einige Fensterfunktionen müssen zusätzliche Parameter angegeben werden: Für. sum () mit einem Wintype. Erfolgt keine Normalisierung der Gewichte für das Fenster. Das Übergeben von benutzerdefinierten Gewichten von 1, 1, 1 ergibt ein anderes Ergebnis als Durchgehen von Gewichten von 2, 2, 2. zum Beispiel. Beim Übergeben eines Wintype anstelle der expliziten Spezifizierung der Gewichte sind die Gewichte bereits normalisiert, so dass das größte Gewicht 1 ist. Im Gegensatz dazu ist die Natur der & agr; () - Rechnung so, dass die Gewichte in Bezug aufeinander normalisiert werden. Gewichte von 1, 1, 1 und 2, 2, 2 ergeben das gleiche Ergebnis. Zeitbewusstes Rollen Neu in Version 0.19.0. Neu in Version 0.19.0 sind die Möglichkeit, einen Offset (oder Cabrio) in eine. rolling () - Methode zu überführen und haben es produzieren Fenster variabler Größe auf der Grundlage der übergebenen Zeitfenster. Zu jedem Zeitpunkt gehören dazu alle vorhergehenden Werte innerhalb der angegebenen Zeit delta. Dies kann insbesondere für einen nicht-regelmäßigen Zeitfrequenzindex nützlich sein. Dies ist ein regelmäßiger Frequenzindex. Mit einem Integer-Fenster-Parameter arbeitet, um über die Fenster-Frequenz rollen. Das Angeben eines Versatzes ermöglicht eine intuitivere Spezifikation der Rollfrequenz. Mit einem nicht-regulären, aber immer noch monotonen Index, rollt mit einem Integer-Fenster keine besondere Berechnung. Die Zeitspezifikation erzeugt variable Fenster für diese spärlichen Daten. Darüber hinaus erlauben wir nun einen optionalen Parameter, um eine Spalte (und nicht die Vorgabe des Index) in einem DataFrame anzugeben. Time-aware Rolling vs. Resampling Die Verwendung von. rolling () mit einem zeitbasierten Index ist vergleichbar mit dem Resampling. Sie betreiben und führen reduktive Operationen an zeitindizierten Pandabildungen durch. Bei Verwendung von. rolling () mit einem Offset. Der Versatz ist ein Zeit-Dreieck. Nehmen Sie ein nach hinten schauendes Fenster und aggregieren Sie alle Werte in diesem Fenster (einschließlich des Endpunkts, aber nicht des Startpunkts). Dies ist der neue Wert an diesem Punkt im Ergebnis. Dies sind Fenster mit variabler Größe im Zeitraum für jeden Punkt der Eingabe. Sie erhalten ein gleich großes Ergebnis wie die Eingabe. Bei Verwendung von. resample () mit einem Offset. Konstruieren Sie einen neuen Index, der die Frequenz des Offsets ist. Für jede Frequenz bin, Aggregat Punkte aus dem Eingang innerhalb eines Rückwärts-in-Zeit-Fenster, die in diesem bin fallen. Das Ergebnis dieser Aggregation ist die Ausgabe für diesen Frequenzpunkt. Die Fenster sind feste Größe im Frequenzraum. Ihr Ergebnis hat die Form einer regelmäßigen Frequenz zwischen dem minimalen und dem maximalen Wert des ursprünglichen Eingabeobjekts. Zusammenfassen. Rolling () ist eine zeitbasierte Fensteroperation, während. resample () eine frequenzbasierte Fensteroperation ist. Zentrieren von Windows Die Etiketten werden standardmäßig auf den rechten Rand des Fensters gesetzt, aber ein zentrales Schlüsselwort ist verfügbar, so dass die Beschriftungen in der Mitte festgelegt werden können. Binäre Fensterfunktionen cov () und corr () können die Bewegungsfensterstatistiken über zwei Serien oder eine beliebige Kombination von DataFrame / Series oder DataFrame / DataFrame berechnen. Hier ist das Verhalten in jedem Fall: zwei Serien. Berechnen Sie die Statistik für die Paarung. Datenreihe. Berechnen Sie die Statistik für jede Spalte des DataFrame mit der übergebenen Reihe, sodass ein DataFrame zurückgegeben wird. DataFrame / DataFrame. Berechnen Sie standardmäßig die Statistik für passende Spaltennamen und geben Sie ein DataFrame zurück. Wenn das Schlüsselwortargument pairwiseTrue übergeben wird, wird die Statistik für jedes Paar von Spalten berechnet, wobei ein Panel zurückgegeben wird, dessen Elemente die betreffenden Daten sind (siehe nächster Abschnitt). Computing rollen 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 interessiert man sich auch für Bewegt-Fenster-Kovarianz und Korrelationsmatrizen. Dies kann getan werden, indem das paarweise Schlüsselwortargument übergeben wird, was im Fall von DataFrame-Eingaben zu einem Panel führt, dessen Elemente die betreffenden Daten sind. Im Falle eines einzelnen 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-Abschnitt für die Vorbehalte in Verbindung mit dieser Methode der Berechnung von Kovarianz und Korrelation Matrizen. Abgesehen davon, dass sie keinen Fensterparameter haben, haben diese Funktionen dieselben Schnittstellen wie ihre. rolling-Pendants. Wie oben, sind die Parameter, die sie alle akzeptieren: minperiods. Schwelle von Nicht-Null-Datenpunkten erfordern. Standardwerte für die Berechnung der Statistik. Es werden keine NaNs ausgegeben, sobald minperiods Nicht-Null-Datenpunkte gesehen wurden. Center. Boolean, ob die Beschriftungen in der Mitte gesetzt werden sollen (default ist False) Die Ausgabe der Methoden. rolling und. expanding gibt kein NaN zurück, wenn mindestens minperiods Nicht-Nullwerte im aktuellen Fenster vorhanden sind. Dies unterscheidet sich von cumsum. Cumprod Cummax Und cummin. Die NaN in dem Ausgang zurückgeben, wo immer ein NaN in dem Eingang angetroffen wird. Eine expandierende Fensterstatistik ist stabiler (und weniger reagierend) als ihr Rollfenster-Gegenstück, da die zunehmende Fenstergröße die relative Auswirkung eines einzelnen Datenpunkts verringert. Als Beispiel ist hier die mittlere () Ausgabe für den vorherigen Zeitreihendatensatz: Exponentiell gewichtete Fenster Ein verwandter Satz von Funktionen sind exponentiell gewichtete Versionen von mehreren der obigen Statistiken. Eine ähnliche Schnittstelle zu. rolling und. expanding wird über die. ewm-Methode aufgerufen, um ein EWM-Objekt zu empfangen. Es werden mehrere expansive EW (exponentiell gewichtete) Methoden bereitgestellt: Ich habe eine Zeitreihe mit Aktienkursdaten. Ich möchte für jede Zeile den Money Flow Index (MFI) berechnen. Angesichts der Tatsache, dass die MFI, verwendet die früheren ca. 14 Zeilen zur Berechnung der aktuellen MFI, was wäre der beste Ansatz, dies zu tun Nachstehend wird der aktuelle MFI (www. investopedia / terms / m / mfi. asp) für ein gegebenes DataFrame, aber ich möchte diese für jeden implementieren Zeile in den Datenrahmen I gelungen, dies mit der Anwendung-Funktion arbeiten, aber diese Funktion nur für 1 Argument, während ich würde mehr als 1 Argument, um die oben genannten berechnen müssen. Erbeten am 22 August um 19:11 Uhr


No comments:

Post a Comment