2010-11-23 47 views
1

Je ne peux pas obtenir performanceAnalytics pour travailler avec ma série de zoo et j'ai décidé d'écrire mon propre script.R, s'il vous plaît vérifier ma plus longue Drawdowns fonction

Il est supposé obtenir l'égalité cummax (équité) en entrée si vous voulez calculer des Drawdowns de plus longs. Il donne également la valeur de prélèvement maximale sur ces périodes.

version corrigée est ci-dessous.

S'il vous plaît, Pourriez-vous vérifier mon script. Cela ne fonctionne pas comme prévu. Certains maxDD sont zéro. J'espère que cela peut être utile à d'autres personnes. J'ai vu beaucoup de messages sur des forums où les gens recherchent quelque chose comme ça.

Je l'ai corrigé des suggestions Richie:

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) 
} 

J'ai aussi corrigé un problème qui m'a empêché d'obtenir une réponse ordonnée parce que je index ecrivais (DD []) au lieu de l'indice (DD []

Maintenant, il semble fonctionner mais je ne suis pas sûr.

à Josué: Au début, mes données était zoo avec l'index de Chron Maintenant, je l'ai transformé à XTS avec un indice de posixct,

"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 
... 

ne fonctionne toujours pas avec performanceAnalytics, bien que je peux représenter graphiquement et faites des calculs par moi-même. Drawdown (myData) donne une série xts avec toutes ses valeurs de données NaN. J'ai regardé le code findDrawdown et c'est différent du mien car il mesure les abaissements relatifs au lieu des abaissements absolus.

Quoi qu'il en soit, j'espère que mon script pourrait être utile à quelqu'un.

+1

Le paquet PerformanceAnalytics est utilisé par de nombreux professionnels du monde entier, donc je vous encourage vivement à enquêter sur ce qui ne va pas avec vos données qui l'empêche de travailler avec PerformanceAnalytics ... plutôt que de réinventer la roue et de demander d'autres pour réparer votre travail. –

+5

@Joshua, Harsh. Arrêtez de lire les messages de Dirk, je pense que ça vous arrive: P –

+0

Avec performanceAnalytics, j'obtiens "Les données ne peuvent pas être converties en séries chronologiques" si j'utilise mes données comme zoo ou xts, chron ou POSIXct. J'ai été googling et beaucoup de gens a le même problème. En fait, performanceAnalytics ne fonctionne pas pour moi même avec ses propres exemples. – skan

Répondre

3

Vous pouvez consulter la plus ancienne fonction maxdrawdown du package tseries. Voici un exemple de sa page de manuel:

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

Bonjour, le problème est que celui-ci me donne juste un tirage sans dates. J'ai essayé de convertir sa sortie en dates mais ce n'est pas la même chose que la mienne. – skan

1

Je ne sais rien sur les abaissements maximum, mais voici quelques réflexions sur votre code.


La forme de l'entrée DD n'est pas entièrement claire. Vous voulez probablement vérifier les entrées pour vous assurer qu'elles sont correctement formées.


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

Sauf si vous avez surchargé cette fonction, sign retourne un vecteur numérique (contenant -1s, 0 et 1). Vouliez-vous dire sign(coredata(DD))?


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

Vous définissez la variable de lens mais puis revenir à l'utilisation rr$length plus tard.


rr$value == FALSE 

Utilisez !rr$value à la place; c'est plus clair.


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

Je ne sais pas comment le centre est de la méthode, mais vous pourriez vouloir permettre à l'utilisateur d'entrer le nombre des plus longues pistes sont utilisées dans la fonction plutôt que hardcoding à être 5


Le code est plus facile à lire lorsque vous êtes en accord avec l'emplacement des espaces. Personnellement, je préfère un espace après une virgule et des espaces avant et après les opérateurs.

+0

Bonjour. Merci pour vos suggestions. J'ai modifié le code sur le message principal. – skan

+0

Mon entrée est DD <- cummax (équité) -equity, donc toujours égale ou supérieure à zéro. le signe (DD) sera 0 ou 1. – skan

1

Les fonctions de PerformanceAnalytics échouent uniquement lors de l'utilisation de chron comme index. Je vous ai déjà suggéré que vous ne devriez pas compter sur chron pour vos valeurs d'index zoo/xts. L'erreur vous donne un indice sur le fait que cela ne fonctionne pas: "Les noms de fichiers doivent avoir des formats de date standard, tels que '1985-03-15'". chron n'utilise pas les formats de date standard, d'où l'erreur.

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

Je reçois: Erreur dans if (thisSign == beforeSign) {: valeur manquante où TRUE/FALSE est nécessaire. Mes données sont juste datetime et la valeur du drawdown – skan

+0

@ user425895: vous avez des valeurs manquantes dans votre série de retour. Remarquez comment j'ai appelé 'na.omit' lors de la création de' r'. –

+0

En relation avec: http://stackoverflow.com/questions/3567025/drawdown-duration – Shane