Tawny 包演示代码有错误

Tawny package demo code with error

我想尝试 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) 我是在浪费时间使用 tawny 包(alpha 版)吗?有更好的替代品可以推荐吗?

2) 或者,有没有办法修复和使用该示例?

现在,我选择了手动方式。我使用原始蓝图将 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)

至少现在我可以绘制出投资组合优化的结果。