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)
至少现在我可以绘制出投资组合优化的结果。
我想尝试 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)
至少现在我可以绘制出投资组合优化的结果。