首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修改PerformanceAnalytics包中的降压函数以获取值

如何修改PerformanceAnalytics包中的降压函数以获取值
EN

Stack Overflow用户
提问于 2015-06-26 04:28:42
回答 1查看 630关注 0票数 1

我正在计算PnL数据系列的平均下降、平均长度、恢复长度等,而不是返回数据。这是像这样的数据帧

代码语言:javascript
运行
复制
            PNL
2008-11-03  3941434
2008-11-04  4494446
2008-11-05  2829608
2008-11-06  2272070
2008-11-07 -2734941
2008-11-10 -2513580

我使用了fTrading包中的maxDrawDown函数,它起作用了。我怎样才能得到其他的drawdown函数呢?如果我直接运行AverageDrawdown(quantbook)函数,它会给出这样的错误消息

代码语言:javascript
运行
复制
Error in if (thisSign == priorSign) { : missing value where TRUE/FALSE needed  

我查看了AverageDrawdown的文档,如下所示:

代码语言:javascript
运行
复制
findDrawdowns(R, geometric = TRUE, ...)

R    an xts, vector, matrix, data frame, timeSeries or zoo object of asset returns

我的quantbook是一个数据框,但对此函数不起作用。或者您是否有任何其他包来获得相同的功能,请告知。

EN

回答 1

Stack Overflow用户

发布于 2015-06-27 00:30:40

我已经修改了包的函数。这里有一个在PnL情况下的解决方案(或者任何其他你想要得到值而不是返回的情况),希望你会发现它是有用的。参数x是一个dataframe,而xrow.namesdates,所以您不必费心在不同的数据类型之间进行转换(这实际上让我吃了很多苦头)。使用函数findPnLDrawdown,您可以执行许多其他函数来计算averageDrawDownaverageLengthrecovery等。

代码语言:javascript
运行
复制
PnLDrawdown <- function(x) {
  ts = as.vector(x[,1])
  cumsum = cumsum(c(0, ts))
  cmaxx = cumsum - cummax(cumsum)
  cmaxx = cmaxx[-1]
  cmaxx = as.matrix(cmaxx)
  row.names(cmaxx) = row.names(x)
  cmaxx = timeSeries(cmaxx)
  cmaxx
}


findPnLDrawdown <- function(R) {
  drawdowns = PnLDrawdown(R)
  draw = c()
  begin = c()
  end = c()
  length = c(0)
  trough = c(0)
  index = 1
  if (drawdowns[1] >= 0) {
    priorSign = 1
  } else {
    priorSign = 0
  }
  from = 1
  sofar = as.numeric(drawdowns[1])
  to = 1
  dmin = 1
  for (i in 1:length(drawdowns)) {
    thisSign =ifelse(drawdowns[i] < 0, 0, 1)
    if (thisSign == priorSign) {
      if (as.numeric(drawdowns[i]) < as.numeric(sofar)) {
        sofar = drawdowns[i]
        dmin = i
      }
      to = i+ 1
    }
    else {
      draw[index] = sofar
      begin[index] = from
      trough[index] = dmin
      end[index] = to
      from = i
      sofar = drawdowns[i]
      to = i + 1
      dmin = i
      index = index + 1
      priorSign = thisSign
    }
  }
  draw[index] = sofar
  begin[index] = from
  trough[index] = dmin
  end[index] = to
  list(pnl = draw, from = begin, trough = trough, to = end, 
       length = (end - begin + 1),
       peaktotrough = (trough - begin + 1),
       recovery = (end - trough))
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31060184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档