2010-11-23 11 views
1

Ich kann nicht PerformanceAnalytics mit meiner Zoo-Serie arbeiten und ich habe beschlossen, mein eigenes Skript zu schreiben.R, bitte überprüfen Sie meine längste Drawdowns Funktion

Es soll cummax (Equity) -Qualität als Eingabe erhalten, wenn Sie die längsten Drawdowns berechnen möchten. Es gibt auch den maximalen Drawdown-Wert für diese Zeiträume.

korrigierte Version ist unten.

Bitte, Könnten Sie mein Skript überprüfen. Es funktioniert nicht wie erwartet. Einige maxDD sind Null. Ich hoffe, dass es für andere Menschen nützlich sein kann. Ich habe viele Nachrichten in Foren gesehen, wo Leute nach so etwas suchen.

Ich habe es mit Richie Vorschläge korrigiert:

findDD <- function(DD, n=5){ 
    rr <- rle(sign(coredata(DD))) 
    lens <- rr$length 
    lens[!rr$value] <- 0 
    ll <- head(order(lens, decreasing=TRUE),n) 
    sumas <- cumsum(c(1,rr$length)) # I need to access the original lenghts 
    maxDD <- sapply(ll,FUN = function(x) max(window(DD,start=index(DD)[sumas[x]],end=index(DD)[sumas[x+1]-1]))) 
    data.frame(start=index(DD)[sumas[ll]],end=index(DD)[sumas[ll+1]-1], length=(index(DD)[sumas[ll+1]-1]-index(DD)[sumas[ll]])+1, maxDD) 
} 

ich auch ein Problem behoben haben, die mich daran gehindert, eine geordnete Antwort zu bekommen, weil ich Index wurde writting (DD []) anstelle von Index (DD) []

Jetzt scheint es zu funktionieren, aber ich bin mir nicht sicher.

zu Joshua: An den meine Daten Anfang war Zoo mit chron Index Jetzt habe ich es transformiert mit posixct Index XTS,

"2010-01-11 18:00:00" 9338.37028375963 
"2010-01-11 18:15:00" 8086.45780960387 
"2010-01-11 18:30:00" 7762.75622449016 
"2010-01-11 18:45:00" 8358.3609798313 
"2010-01-11 19:00:00" 8598.69695502083 
"2010-01-11 19:15:00" 8568.56256494502 
"2010-01-11 19:30:00" 8488.4281748692 
... 

noch funktioniert nicht mit performanceAnalytics, obwohl ich grafisch darstellen kann es und machen Sie eigene Berechnungen. Drawdown (myData) gibt eine XTS-Serie mit allen Datenwerten NaN. Ich habe findDrawdown-Code gesucht und es unterscheidet sich von meinem, weil es relative Drawdowns anstelle von absoluten Drawdowns misst.

Wie auch immer, ich hoffe, dass mein Skript für jemanden nützlich sein könnte.

+1

Das PerformanceAnalytics Paket wird von vielen Profis auf der ganzen Welt verwendet, so würde ich Sie dringend ermutigen, zu untersuchen, was mit Ihren Daten sind falsch, dass sie von der Arbeit mit PerformanceAnalytics verhindert ... anstatt das Rad neu zu erfinden und zu fragen andere, um deine Arbeit zu reparieren. –

+5

@Joshua, harsch. Hör auf Dirks Beiträge zu lesen, ich denke es kommt zu dir: P –

+0

Mit performanceAnalytics bekomme ich "Die Daten können nicht in eine Zeitreihe umgewandelt werden", wenn ich meine Daten als zoo oder xts, chron oder POSIXct nutze. Ich habe gegoogelt und viele Leute haben das gleiche Problem. Tatsächlich funktioniert performanceAnalytics für mich nicht einmal mit eigenen Beispielen. – skan

Antwort

3

Sie könnten die ältere Funktion maxdrawdown aus dem tseries Paket ansehen. Hier ist ein Beispiel aus der Handbuchseite:

mxdrwdR> # Realistic example 
mxdrwdR> data(EuStockMarkets) 

mxdrwdR> dax <- log(EuStockMarkets[,"DAX"]) 

mxdrwdR> mdd <- maxdrawdown(dax) 

mxdrwdR> mdd 
$maxdrawdown 
[1] 0.25647 

$from 
[1] 236 

$to 
[1] 331 
+0

Hallo, das Problem ist, dass dieser mir nur einen Drawdown ohne Daten gibt. Ich habe versucht, seine Ausgabe in Daten zu konvertieren, aber es ist nicht das Gleiche wie meins. – skan

1

Ich weiß nichts über maximale Drawdowns, aber hier sind einige Gedanken zu Ihrem Code.


Es ist nicht ganz klar, welche Form des Eingang DD nimmt. Sie möchten wahrscheinlich eine Eingabeüberprüfung durchführen, um sicherzustellen, dass sie richtig gebildet ist.


rr <- rle(coredata(sign(DD))) 

Wenn Sie diese Funktion überlastet haben, sign einen numerischen Vektor zurückgibt (mit -1s, 0 und 1). Meinst Du sign(coredata(DD))?


lens[rr$value == FALSE] <- 0 

definieren Sie die Variable lens aber dann später mit rr$length zurückgehen.


rr$value == FALSE 

Verwenden !rr$value statt; es ist klarer.


ll <- head(order(rr$length, decreasing=TRUE),5) 

Ich weiß nicht, wie zentral diese das Verfahren ist, aber Sie können dem Benutzer zur Eingabe, wie viele der längsten Abfahrten in die Funktion zulassen wollen, anstatt hartzucodieren es 5 zu sein .


Code ist einfacher zu lesen, wenn Sie konsistent sind, wo Sie Leerzeichen einfügen. Persönlich bevorzuge ich ein Leerzeichen nach einem Komma und Leerzeichen vor und nach Operatoren.

+0

Hallo. Danke für deine Vorschläge. Ich habe den Code auf dem Hauptpost geändert. – skan

+0

Meine Eingabe ist DD <- cummax (equity) -Einheit, ist also immer gleich oder größer als Null. Vorzeichen (DD) wird 0 oder 1 sein. – skan

1

Die Funktionen in PerformanceAnalytics schlagen nur fehl, wenn chron als Index verwendet wird. Ich habe dir schon vorher vorgeschlagen, dass du dich nicht auf deinen Zoo/xts-Index verlassen solltest.

Der Fehler gibt Ihnen einen Hinweis, warum es nicht funktioniert: "Rownames sollten Standard-Datumsformate wie '1985-03-15'" haben. chron verwendet keine Standard-Datumsformate, daher der Fehler.

library(quantmod) 
library(PerformanceAnalytics) 
library(chron) 

getSymbols("SPY") 
r <- na.omit(ROC(Cl(SPY))) 
# xts object with 'Date' index 
str(SPY) 
table.Drawdowns(r) 
table.Drawdowns(as.zoo(r)) 
# convert index to chron 
index(r) <- as.chron(index(r)) 
table.Drawdowns(r)   # fails 
table.Drawdowns(as.zoo(r)) # fails 
# convert index to POSIXct 
index(r) <- as.POSIXct(index(r)) 
table.Drawdowns(r) 
table.Drawdowns(as.zoo(r)) 
+0

Ich bekomme: Fehler in if (thisSign == priorSign) {: fehlender Wert wo TRUE/FALSE notwendig ist. Meine Daten sind nur Datetime und der Wert des Drawdown – skan

+0

@ user425895: Sie haben fehlende Werte in Ihrer Return-Serie. Beachten Sie, wie ich "na.omit" beim Erstellen von "r" genannt habe. –

+0

Verwandt mit: http://stackoverflow.com/questions/3567025/drawdown-duration – Shane