我最近发现了PerformanceAnalytics并发现它对我的研究非常有用。但是,我发现了一种奇怪的行为。我正在尝试扩展InformationRatio()
以接受零基准回报:
InformationRatio <- function(Ra, Rb=NULL, scale=NA) {
if (is.null(Rb)) {
Rb <- Ra[, 1, FALSE]
Rb[] <- 0
}
PerformanceAnalytics::InformationRatio(Ra, Rb, scale)
}
InformationRatio(managers[, 1:6])
返回
HAM1 HAM2 HAM3 HAM4 HAM5 HAM6
Information Ratio: HAM1 Inf 1.373211 1.19553 0.6592017 0.2355561 1.66417
Inf不是我所期望的。结果(在浏览源之后),其来源包含在Return.excess()
:
coln.Rf = colnames(Rf)
Rft = cbind(R, Rf)
Rft = na.locf(Rft[, make.names(coln.Rf)])
Rf = Rft[which(index(R) %in% index(Rft))]
如果资产收益(Ra == R)和基准收益(Rb == Rf)之间的共同名称发生冲突,则将Rf分配给R,最终导致除以零。
这是一种解决方法:
InformationRatio <- function(Ra, Rb=NULL, scale=NA) {
if (is.null(Rb)) {
Rb <- Ra[, 1, FALSE]
Rb[] <- 0
colnames(Rb) <- "zero"
}
PerformanceAnalytics::InformationRatio(Ra, Rb, scale)
}
InformationRatio(managers[, 1:6])
返回
HAM1 HAM2 HAM3 HAM4 HAM5 HAM6
Information Ratio: zero 1.549119 1.373211 1.19553 0.6592017 0.2355561 1.66417
这是一个错误还是我错过了什么?如果是,我该如何举报?我无法通过this page,没有任何错误追踪者。我想写了一封电子邮件,但我在这里见过开发者,所以SO帖子可能是一个不错的选择,不是吗?
答案 0 :(得分:1)
Rb 不应该是标量,它应该是一个时间序列。
Rb 在文档中描述为
Rb: return vector of the benchmark asset
所以我认为文档可以更清楚,我希望改进它以指定时间序列。我们需要将基准回报的时间序列合并到资产回报的时间序列中进行计算。
这是一个带有 Rb 的时间序列输入的工作示例:
data(managers)
rb<-xts( rep(0,nrow(managers)), order.by=index(managers) )
colnames(rb)<-'zero'
InformationRatio(managers,rb)
产生
HAM1 HAM2 HAM3 HAM4 HAM5 HAM6 EDHEC LS EQ SP500 TR US 10Y TR US 3m TR
Information Ratio: zero 1.549119 1.373211 1.19553 0.6592017 0.2355561 1.66417 1.665694 0.6448502 0.7265079 7.620057
对于 Return.excess ,我认为不允许在那里进行colnames碰撞是有意义的,因为你试图确定一个系列到另一个系列的超额回报。上面粘贴的代码旨在合并系列并创建一个与输入系列具有相同索引的输出系列。现在可以比最初编写函数时( xts 之前)更有效地完成该操作,我也会看一下。
通常, R 包的错误报告应该发送到包网站或包维护者。电子邮件本来没问题。一般来说, SO 应该是针对使用问题,而不是错误报告,因为错误得到修复, SO 仍然存在陈旧数据。