Berechnen Sie das maximale Draw Down mit einer vektorisierten Lösung in Python

9

Maximaler Drawdown ist eine allgemeine Risikomessgröße, die in der quantitativen Finanzierung zur Bewertung der größten verwendet wird negative Rückkehr, die erlebt wurde.

Vor kurzem wurde ich ungeduldig mit der Zeit, Max Drawdown mit meinem geloopten Ansatz zu berechnen.

%Vor%

Ich bin mit der allgemeinen Vorstellung vertraut, dass eine vektorisierte Lösung besser wäre.

Die Fragen sind:

  • kann ich dieses Problem vektorisieren?
  • Wie sieht diese Lösung aus?
  • Wie nützlich ist es?

Bearbeiten

Ich habe Alexanders Antwort in die folgende Funktion geändert:

%Vor%     
piRSquared 20.04.2016, 17:04
quelle

3 Antworten

13
Es wird angenommen, dass

df_returns ein Datenrahmen von Retouren ist, wobei jede Spalte eine separate Strategie / Manager / Sicherheit ist und jede Zeile ein neues Datum (z. B. monatlich oder täglich) ist.

%Vor%     
Alexander 20.04.2016, 17:13
quelle
4

Ich hatte zuerst vorgeschlagen, .expanding() window zu verwenden, aber das ist offensichtlich nicht notwendig mit den eingebauten .cumprod() und .cummax() , um den maximalen Drawdown bis zu einem bestimmten Punkt zu berechnen:

%Vor%

%Vor%     
Stefan 20.04.2016 17:36
quelle
1

Wenn wir eine Zeitreihe von Renditen angeben, müssen wir die Gesamtrendite für jede Kombination aus Startpunkt und Endpunkt berechnen.

Der erste Trick besteht darin, eine Zeitreihe von Renditen in eine Reihe von Renditeindizes umzuwandeln. Bei einer Reihe von Renditeindizes kann ich den Ertrag über eine beliebige Unterperiode mit dem Renditeindex am Anfang ri_0 und am Ende ri_1 berechnen. Die Berechnung ist: ri_1 / ri_0 - 1.

Der zweite Trick besteht darin, eine zweite Reihe von Inversen von Rückkehrindizes zu erzeugen. Wenn r meine Reihe von Rückkehrindizes ist, dann ist 1 / r meine Serie von Inversen.

Der dritte Trick ist das Matrixprodukt von r * (1 / r) .Transpose.

r ist eine n x 1-Matrix. (1 / r) .Transposes ist eine 1 x n-Matrix. Das resultierende Produkt enthält jede Kombination von ri_j / ri_k. Subtrahieren Sie 1 und ich habe tatsächlich die Rückkehr.

Der vierte Trick besteht darin, sicherzustellen, dass ich meinen Nenner so einstelle, dass er Perioden vor denen darstellt, die durch den Zähler dargestellt werden.

Unten ist meine vektorisierte Funktion.

%Vor%

Wie funktioniert das?

für die vektorisierte Lösung lief ich 10 Iterationen über die Zeitreihen [10, 50, 100, 150, 200]. Die benötigte Zeit ist unten:

%Vor%

Derselbe Test für die geloopte Lösung ist unten:

%Vor%

Bearbeiten

Alexanders Antwort liefert überlegene Ergebnisse. Gleicher Test mit modifiziertem Code

%Vor%

Ich habe seinen Code in die folgende Funktion geändert:

%Vor%     
piRSquared 20.04.2016 17:04
quelle