1

我无法让 performanceAnalytics 与我的动物园系列一起工作,因此我决定编写自己的脚本。

如果你想计算最长的回撤,它应该得到 cummax(equity)-equity 作为输入。它还给出了这些时期的最大回撤值。

修正版如下。

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

我已经用 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)
}

我还纠正了一个问题,该问题使我无法获得有序的答案,因为我写的是 index(DD[]) 而不是 index(DD)[]

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

对 Joshua:一开始我的数据是带有 chron 索引的 zoo 现在我已经将它转换为带有 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 代码,它与我的不同,因为它测量的是相对回撤而不是绝对回撤。

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

4

3 回答 3

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
于 2010-11-23T12:57:05.907 回答
1

我对最大回撤一无所知,但这里有一些关于您的代码的想法。


输入采用何种形式并不完全清楚DD。您可能需要进行一些输入检查以确保其格式正确。


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

除非你重载了这个函数,否则sign返回一个数字向量(包含 -1s、0s 和 1s)。你的意思是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。


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

于 2010-11-23T16:39:22.773 回答
1

PerformanceAnalytics 中的函数仅在使用 chron 作为索引时才会失败。我之前向你建议过,你不应该依赖 chron 作为你的 zoo/xts 索引值。

该错误提示您为什么它不起作用:“行名应该具有标准日期格式,例如'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))
于 2010-11-24T13:28:12.167 回答