我正在计算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我使用了fTrading包中的maxDrawDown函数,它起作用了。我怎样才能得到其他的drawdown函数呢?如果我直接运行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是一个数据框,但对此函数不起作用。或者您是否有任何其他包来获得相同的功能,请告知。
发布于 2015-06-27 00:30:40
我已经修改了包的函数。这里有一个在PnL情况下的解决方案(或者任何其他你想要得到值而不是返回的情况),希望你会发现它是有用的。参数x是一个dataframe,而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))
}https://stackoverflow.com/questions/31060184
复制相似问题