Создайте эффективную границу в PortfolioAnalytics без объекта xts
Есть ли способ создать эффективную границу в пакете PortfolioAnalytics без указания объекта возврата активов xts? Вместо этого я хотел бы указать вектор ожидаемой доходности и ковариационную матрицу.
1 ответ
Решение
Есть два способа. Сначала вы можете предоставить список, содержащий ваши матрицы, со структурой, показанной ниже, а затем вызвать 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", ...)
В качестве примера.