有没有办法在 PortfolioAnalytics 包中创建一个有效的边界而不指定资产回报的 xts 对象?相反,我想提供预期收益的向量和协方差矩阵。
问问题
1821 次
1 回答
6
有两种方法。首先,您可以提供一个包含矩阵的列表,其结构如下所示,然后调用 optimize.portfolio 包括此列表作为参数。
# num_assets is the number of assets in the portfolio
momentargs <- list()
momentargs$mu <- matrix(0, nrow=num_assets, ncol=1 )
momentargs$sigma <- matrix(0, nrow=num_assets, ncol=num_assets)
momentargs$m3 <- matrix(0, nrow=num_assets, ncol=num_assets^2)
momentargs$m4 <- matrix(0, nrow=num_assets, ncol=num_assets^3)
optimize.portfolio(R, portfolio, momentargs=momentargs, ...)
或者,您可以提供自己的函数来计算矩。下面显示了一个简单的示例,该示例再现了一些 PortfolioAnalytics 选项。
set.portfolio.moments.user=function(R, portfolio, user_moments=NULL, user_method=c(returns, input, two_moment)) {
#
# Sets portfolio moments to user specified values
#
# R asset returns as in PortfoloAnalytics
# portfolio a portfolio object as in PortfolioAnalytics
# user_moments a list of four matices containing user-specified
# values for the first four return moments
# user_method user-specified method for computing moment matrices
# defaults to calculation used by PortfolioAnalytics "sample" method
# which uses PerformanceAnalytics functions to computer the higher-order moments
if( !hasArg(user_method) | is.null(user_method)) user_method <- "returns"
tmpR <- R
switch( user_method, returns = {
momentargs <- list()
momentargs$mu <- matrix(as.vector(apply(tmpR,2, "mean")), ncol = 1)
momentargs$sigma <- cov(tmpR)
momentargs$m3 <- PerformanceAnalytics:::M3.MM(tmpR)
momentargs$m4 <- PerformanceAnalytics:::M4.MM(tmpR)
}, input = {
momentargs <- user_moments
}, two_moment = {
momentargs <- list()
momentargs$mu <- matrix(as.vector(apply(tmpR,2, "mean")), ncol = 1)
momentargs$sigma <- cov(tmpR)
momentargs$m3 <- matrix(0, nrow=ncol(R), ncol=ncol(R)^2)
momentargs$m4 <- matrix(0, nrow=ncol(R), ncol=ncol(R)^3)
} )
return(momentargs)
}
然后,您将调用 PortfolioAnalytics
optimize.portfolio(R, portfolio, momentFUN = "set.portfolio.moments.user", ...)
举个例子。
于 2014-12-02T15:55:09.320 回答