【问题标题】:Create efficient frontier in PortfolioAnalytics without an xts object在没有 xts 对象的情况下在 PortfolioAnalytics 中创建有效的前沿
【发布时间】:2020-05-12 20:46:34
【问题描述】:

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

【问题讨论】:

    标签: r finance portfolio quantitative-finance r-portfolioanalytics


    【解决方案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", ...)
    

    举个例子。

    【讨论】:

      猜你喜欢
      • 2016-07-07
      • 2011-07-07
      • 2014-10-02
      • 1970-01-01
      • 2020-09-17
      • 2012-08-31
      • 2012-01-22
      • 1970-01-01
      • 2017-05-30
      相关资源
      最近更新 更多