Tawny包演示代码有错误

时间:2018-03-23 12:58:55

标签: r quantitative-finance

我想通过收缩估算器尝试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)或者,有没有办法修复并使用该示例?

1 个答案:

答案 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)

至少现在我可以从投资组合优化中获得结果。