Создайте эффективную границу в PortfolioAnalytics без объекта xts

Есть ли способ создать эффективную границу в пакете PortfolioAnalytics без указания объекта возврата активов xts? Вместо этого я хотел бы предоставить вектор ожидаемой доходности и матрицу ковариации.


person RMacey    schedule 04.11.2014    source источник


Ответы (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", ...)

Например.

person WaltS    schedule 02.12.2014