Как изменить функции просадки в пакете PerformanceAnalytics для значения

Я рассчитываю среднюю просадку, среднюю длину, длину восстановления и т. д. в R для серии данных PnL, а не для данных возврата. Это такой фрейм данных

            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

Я использовал функцию maxDrawDown из пакета fTrading, и она сработала. Как я могу получить другие функции просадки? Если я напрямую запущу функцию 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 - это фрейм данных, но он не работает для этой функции. Или у вас есть какие-либо другие пакеты, чтобы получить ту же функцию, пожалуйста, сообщите.


person iamchrisa    schedule 25.06.2015    source источник
comment
какому пакету AverageDrawdown принадлежит?   -  person SabDeM    schedule 25.06.2015
comment
Пакет называется пакетом PerformanceAnalytics, который предназначен для возвращаемых данных (в процентах).   -  person iamchrisa    schedule 25.06.2015
comment
Я упомянул имя пакета в заголовке.   -  person iamchrisa    schedule 25.06.2015


Ответы (1)


Я изменил функции пакета. Вот одно решение в случае PnL (или в любом другом случае, когда вы хотите получить значение, а не доход) и надеюсь, что вы найдете его полезным. Параметр x — это dataframe, а row.names для x — это dates, поэтому вам не нужно преобразовывать различные типы данных (от чего я действительно сильно страдаю). С помощью функции findPnLDrawdown вы можете выполнять множество других функций для вычисления averageDrawDown, averageLength, recovery и т. д.

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))
}
person iamchrisa    schedule 26.06.2015