[英]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
,而x
的row.names
是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))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.