在没有xts对象的情况下在PortfolioAnalytics中创建有效的边界 [英] Create efficient frontier in PortfolioAnalytics without an xts object

查看:120
本文介绍了在没有xts对象的情况下在PortfolioAnalytics中创建有效的边界的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有一种方法可以在PortfolioAnalytics包中创建有效的边界,而无需指定资产收益的xts对象?相反,我想提供期望收益的向量和协方差矩阵.

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 expected returns and the covariance matrix.

推荐答案

有两种方法.首先,您可以提供一个包含包含矩阵的列表,其结构如下所示,然后调用optimize.portfolio,并将此列表作为参数.

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

或者,您可以提供自己的函数来计算弯矩.下面显示了一个复制一些PortfolioAnalytics选项的简单示例.

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

然后您将使用

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

作为示例.

这篇关于在没有xts对象的情况下在PortfolioAnalytics中创建有效的边界的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆