我想通过收缩估算器尝试tawny package(v2.1.6)进行投资组合优化,并从文档页面(Win 7上的R 3.4.1)运行以下示例:
require(tawny)
require(tawny.types)
require(PerformanceAnalytics)
# Select a portfolio using 200 total observations
data(sp500.subset)
h <- sp500.subset
p <- TawnyPortfolio(h, 150)
b <- BenchmarkPortfolio('^GSPC', 150, nrow(h), end=end(h))
# Optimize using a window of length 200 (there will be 51 total iterations)
ws <- optimizePortfolio(p, RandomMatrixDenoiser())
rs <- PortfolioReturns(p, ws)
o <- zoo(cbind(portfolio=rs, benchmark=b$returns), index(rs))
charts.PerformanceSummary(o)
在第rs <- PortfolioReturns(p, ws)
行,我遇到了错误:
Error in UseFunction(type.fn, type.name, ...) :
No valid function for 'PortfolioReturns(TawnyPortfolio,xts)'
我可以通过调试lambda.r包中的UseFunction
得出的唯一结论是,当我提供xts对象时,PortfolioReturns函数期望第二个参数为数字。我尝试提供数字矩阵而不是xts,即as.numeric(coredata(ws))
- 没有成功。我的R / lambda.r-专业知识还不足以让它更进一步。
我有两个问题:
1)我是否在用黄褐色包装(alpha版本)浪费我的时间?您可以推荐更好的替代品吗?
2)或者,有没有办法修复并使用该示例?
答案 0 :(得分:0)
现在,我走了手动路线。我使用原始蓝图替换PortfolioReturns()
函数MyPortfolioReturns()
:
MyPortfolioReturns <- function(h, weights) {
w.index <- c(index(weights[2:nrow(weights)]), end(weights) + 1)
index(weights) <- w.index
h.trim <- h[index(h) %in% index(weights)]
ts.rets <- apply(xts(h.trim) * weights, 1, sum)
ts.rets <- xts(ts.rets, order.by=index(h.trim))
if (any(is.na(ts.rets)))
{
cat("WARNING: Filling NA returns with 0\n")
ts.rets[is.na(ts.rets)] <- 0
}
return(ts.rets)
}
请注意,黄褐色将权重移动一天,因为它们在第二天应用。
其余演示代码需要稍作调整:
rs <- MyPortfolioReturns(p$returns, ws)
o <- xts(cbind(portfolio=rs, benchmark=b$returns[151:200,]), index(rs))
charts.PerformanceSummary(o)
至少现在我可以从投资组合优化中获得结果。