Create efficient frontier in PortfolioAnalytics without an xts object

前端 未结 1 856
孤城傲影
孤城傲影 2021-01-13 14:42

Is there a way to create an efficient frontier in the PortfolioAnalytics package without specifying an xts object of asset returns? Instead I\'d like to supply the vector of

1条回答
  •  醉梦人生
    2021-01-13 15:26

    There are two ways. First you can supply a list containing containing your matrices with the structure shown below and then call optimize.portfolio including this list as an argument.

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

    Alternatively, you can supply your own function to calculate the moments. A simple example reproducing some of the PortfolioAnalytics options is shown below.

     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)
     }
    

    You would then call PortfolioAnalytics with

     optimize.portfolio(R, portfolio, momentFUN = "set.portfolio.moments.user", ...)
    

    as an example.

    0 讨论(0)
提交回复
热议问题