r-在没有xts对象的情况下,在PortfolioAnalytics中创建高效的前沿



有没有一种方法可以在PortfolioAnalytics包中创建一个有效的边界,而不指定资产回报的xts对象?相反,我想提供预期回报的向量和协方差矩阵。

有两种方法。首先,您可以提供一个包含矩阵的列表,其结构如下所示,然后调用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", ...)

作为一个例子。

相关内容

  • 没有找到相关文章

最新更新