ответ

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", ...) 

в качестве примера.