Berechne eine compoundierte Return-Serie in Python

8

Alles Gute, ich habe zwei Datenreihen: tägliche Rohaktienrenditen (positive oder negative Floats) und Handelssignale (Kauf = 1, Verkauf = -1, kein Handel = 0).

Die Rohpreiserträge sind einfach das Protokoll des heutigen Preises geteilt durch den gestrigen Preis:

%Vor%

Ein Beispiel:

%Vor%

Die Handelssignalserie sieht so aus:

%Vor%

Um die täglichen Erträge basierend auf den Handelssignalen zu erhalten:

%Vor%

Diese täglichen Renditen könnten wie folgt aussehen:

%Vor%

Ich muss die Serie daily_returns verwenden, um eine Compound-Serie zu berechnen. Da es jedoch 0 Werte in der daily_returns-Reihe gibt, muss ich die letzte von Null verschiedene Compound-Rückgabe "durch die Zeit" auf die nächste von Null verschiedene Compound-Rendite übertragen.

Zum Beispiel berechne ich die zusammengesetzten Renditen so (bemerke, dass ich "rückwärts" durch die Zeit gehe):

%Vor%

und die resultierende Liste:

%Vor%

Mein Ziel ist es, die letzte Rückkehr, die nicht Null ist, auf die kumulierten Renditen zu übertragen. Das heißt, da die Rückkehr bei Index i von der Rückkehr bei Index i + 1 abhängt, sollte die Rückkehr bei Index i + 1 nicht null sein. Jedes Mal, wenn das Listenverständnis in der daily_return-Reihe auf Null trifft, wird es im Wesentlichen neu gestartet.

    
Jason Strimpel 01.04.2011, 14:50
quelle

3 Antworten

7

Es gibt ein fantastisches Modul namens Pandas , das von einem Typen bei AQR (einem Hedgefonds) geschrieben wurde, der sich bei solchen Berechnungen auszeichnet ... was Sie brauchen, ist eine Möglichkeit, mit "fehlenden Daten" umzugehen ... Wie oben erwähnt, verwenden die Grundlagen die nan (keine Anzahl) Fähigkeiten von scipy oder numpy; Aber selbst diese Bibliotheken machen finanzielle Berechnungen nicht viel einfacher ... Wenn Sie Pandas verwenden, können Sie die Daten, die Sie nicht als nan betrachten möchten, markieren und dann bei zukünftigen Berechnungen ablehnen normale Operationen mit anderen Daten.

Ich habe Pandas für etwa acht Monate auf meiner Handelsplattform verwendet ... Ich wünschte, ich hätte früher damit angefangen.

Wes (der Autor) hielt einen Vortrag auf der pyCon 2010 über die Fähigkeiten des Moduls ... siehe Folien und Video auf der pyCon 2010 Webseite . In diesem Video zeigt er, wie man tägliche Renditen erhält, 1000 lineare Regressionen auf einer Matrix von Renditen (in einem Bruchteil einer Sekunde), Zeitstempel / Graph-Daten ... alles, was mit diesem Modul gemacht wird. In Kombination mit Psyco ist dies ein Biest eines Finanzanalysewerkzeugs.

Die andere große Sache, die es handhabt, sind Querschnittsdaten ... so können Sie tägliche nahe Preise, ihre rollenden Mittel, usw. ergreifen ... dann timestamp jede Berechnung und alles erhalten diese in etwas, das einem Python-Wörterbuch ähnlich ist (siehe die pandas.DataFrame -Klasse) ... dann greifen Sie auf die Datenscheiben so einfach zu:

%Vor%

Siehe pandas rolling moments doc für weitere Informationen zur Berechnung des rollenden stdev (es handelt sich um einen Einzeiler).

Wes hat alles getan, um das Modul mit Cython zu beschleunigen, obwohl ich zugeben werde, dass ich erwäge, meinen Server (einen älteren Xeon) aufgrund meiner Analyseanforderungen zu aktualisieren.

BEARBEITEN FÜR STRIMPs FRAGE: Nachdem Sie Ihren Code konvertiert haben, um Pandas-Datenstrukturen zu verwenden, ist es mir immer noch unklar, wie Sie Ihre Daten in einem Pandas-Datenrahmen und die Anforderungen der Compounding-Funktion für die Behandlung fehlender Daten indizieren (oder die Bedingungen für eine 0.0 Rückkehr ... oder wenn du NaN in Pandas benutzt ..). Ich werde demonstrieren, meine Datenindizierung zu verwenden ... ein Tag wurde zufällig ausgewählt ... df ist ein Datenrahmen mit ES-Futures-Anführungszeichen darin ... indiziert pro Sekunde ... fehlende Anführungszeichen werden mit numpy.nan ausgefüllt. Dataframe-Indizes sind datetime -Objekte, versetzt durch die Zeitzonenobjekte des pytz -Moduls.

%Vor%

Um ein einfaches Beispiel zu geben, wie man eine Spalte mit kontinuierlichen Renditen (in pandas.TimeSeries ) berechnet, die das Zitat vor 10 Minuten referenzieren (und fehlende Häkchen ausfüllen), würde ich Folgendes tun:

%Vor%

In diesem Fall ist kein Lambda erforderlich, sondern die Wertespalte wird vor 600 Sekunden geteilt. Dieser .shift(600) -Teil ist, weil meine Daten pro Sekunde indiziert sind.

HTH, \ mike

    
Mike Pennington 01.04.2011, 16:26
quelle
3

Der kumulative Rückgabeteil dieser Frage wird in Wes McKinneys ausgezeichnetem Buch "Python for Data Analysis" auf Seite 339 behandelt und verwendet cumprod () von Pandas, um eine referenzierte / indexierte kumulative Rendite aus berechneten Preisänderungen zu erstellen.

Beispiel aus Buch:

%Vor%     
Carl 27.08.2015 01:54
quelle
1

Stellen Sie sich vor, ich hätte eine DataMatrix mit Schlusskursen, einem Indikatorwert und einem Handelssignal wie folgt:

%Vor%

Ich benutze das Signal, um eine DataMatrix von Returns auf der Basis des Handelssignals zu erstellen:

%Vor%

Was ich getan habe, ist folgendes:

%Vor%

Aus irgendeinem Grund hatte ich wirklich Probleme mit diesem ...

Ich bin dabei, alle meine Preisserien in PyTables umzuwandeln. Sieht so vielversprechend aus.

    
Jason Strimpel 05.04.2011 01:36
quelle