R,请检查我最长的Drawdown功能

时间:2010-11-23 12:12:45

标签: r xts zoo

我无法让performanceAnalytics与我的动物园系列合作,我决定编写自己的剧本。

如果你想计算最长的亏损,它应该得到cummax(股权) - 平等作为输入。它还给出了这些时期的最大亏损值。

更正后的版本如下。

拜托,你能查一下我的剧本吗?它没有按预期工作。一些maxDD为零。 我希望它对其他人有用。我在论坛上看到很多消息,人们都在寻找类似的东西。

我已经用里奇的建议纠正了它:

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

我还纠正了一个阻止我获得有序答案的问题,因为我正在编写索引(DD [])而不是索引(DD)[]

现在它似乎有效,但我不确定。

约书亚: 一开始我的数据是带有chron索引的动物园 现在我用posixct索引将其转换为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
...

仍然不能与performanceAnalytics一起使用,不过我可以自己编程并进行任何计算。 Drawdown(myData)给出xts系列及其所有数据值NaN。 我一直在寻找findDrawdown代码,它与我的不同,因为它测量相对下降而不是绝对下降。

无论如何,我希望我的剧本对某人有用。

3 个答案:

答案 0 :(得分:3)

您可以查看tseries包中较旧的函数maxdrawdown。以下是其手册页中的示例:

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

答案 1 :(得分:1)

我对最大缩编知之甚少,但这里有一些关于你的代码的想法。


输入DD的形式并不完全清楚。您可能需要进行一些输入检查以确保它已正确形成。


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

除非你重载了这个函数,sign返回一个数字向量(包含-1s,0和1)。您的意思是sign(coredata(DD))吗?


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

您定义变量lens,但稍后再使用rr$length


rr$value == FALSE

改用!rr$value;它更清楚。


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

我不知道这对方法有多重要,但您可能希望允许用户输入有多少最长的运行用于函数,而不是将其硬编码为5。


当您与放置空格的位置一致时,代码更易于阅读。就个人而言,我更喜欢逗号后的空格和操作符之前和之后的空格。

答案 2 :(得分:1)

使用chron作为索引时,PerformanceAnalytics中的函数只会失败。我之前建议你不要依赖chron作为你的zoo / xts索引值。

该错误为您提供了一个提示:为什么它不起作用:“Rownames应该有标准的日期格式,例如'1985-03-15'”。 chron不使用标准日期格式,因此错误。

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