簡體   English   中英

如何修改PerformanceAnalytics程序包中的提取函數以獲得價值

[英]How to modify drawdown functions in PerformanceAnalytics package for value

我正在為PnL數據系列而不是返回數據計算R中的平均跌幅,平均長度,恢復長度等。 這是這樣的數據幀

            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函數,它起作用了。 我如何獲得其他提款功能? 如果我直接運行AverageDrawdown(quantbook)函數,它將發出這樣的錯誤消息

Error in if (thisSign == priorSign) { : missing value where TRUE/FALSE needed  

我檢查了AverageDrawdown的文檔,如下所示:

findDrawdowns(R, geometric = TRUE, ...)

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

我的quantbook是一個數據框,但不適用於此功能。 還是您還有其他獲得相同功能的軟件包,請告知。

我已經修改了程序包的功能。 這是PnL情況下的一種解決方案(或您希望獲取值而不是返回值的任何其他情況),並希望您發現它有用。 參數x是一個dataframe row.names ,而xrow.namesdates因此您不必費心在不同的數據類型之間進行轉換(實際上我受了很多苦)。 使用函數findPnLDrawdown ,您可以執行許多其他函數來計算averageDrawDownaverageLengthrecovery等。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM