R, пожалуйста, проверьте мою самую длинную функцию просадки - PullRequest
1 голос
/ 23 ноября 2010

Я не могу заставить PerformanceAnalytics работать с моими сериями зоопарков, и я решил написать свой собственный скрипт.

Предполагается получить cummax (equity) -eity в качестве входных данных, если вы хотите вычислить десамые длинные просадки.Он также дает максимальное значение просадки за эти периоды.

исправленная версия приведена ниже.

Пожалуйста, не могли бы вы проверить мой сценарий.Это не работает, как ожидалось.Некоторые 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) []

Теперь это похоже на работу, но я не уверен.

Джошуа:В начале мои данные были zoo с индексом chron. Теперь я преобразовал их в xts с индексом posixct,

"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, хотя я могу отобразить их и выполнить любые вычисления по моимсвоя.Просадка (myData) дает серию xts со всеми значениями данных NaN.Я смотрел на код findDrawdown, и он отличается от моего, потому что он измеряет относительные просадки вместо абсолютных просадок.

В любом случае, я надеюсь, что мой сценарий может быть кому-то полезен.

Ответы [ 3 ]

3 голосов
/ 23 ноября 2010

Вы можете посмотреть на старую функцию maxdrawdown из пакета tseries . Вот пример со страницы руководства:

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 голос
/ 24 ноября 2010

Функции в PerformanceAnalytics терпят неудачу только при использовании chron в качестве индекса.Ранее я предлагал вам не полагаться на 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))
1 голос
/ 23 ноября 2010

Я ничего не знаю о максимальных просадках, но вот некоторые мысли о вашем коде.


Не совсем ясно, какую форму принимает входной сигнал DD. Скорее всего, вы захотите проверить ввод, чтобы убедиться, что он правильно сформирован.


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

Если вы не перегрузили эту функцию, sign возвращает числовой вектор (содержащий -1 с, 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.


Код легче читать, если вы согласны с тем, где вы ставите пробелы. Лично я предпочитаю пробел после запятой и пробел до и после операторов.

...