2017-08-24 17 views
0

Je suis nouveau chez Portfolio Optimization dans R. Lorsque j'ajoute plus de 25 actifs (chaque actif a environ 25 observations) à mon portefeuille, optimize.portfolio ne trouve aucune solution. Lorsque j'exécute ce programme avec 25 actifs ou moins, cela fonctionne correctement et trace la frontière efficace. Toute aide à ce sujet est très appréciée.Optimisation du portefeuille d'actifs multiples R

library(data.table) 
library(readxl) 
library(PerformanceAnalytics) 
library(PortfolioAnalytics) 
library(ROI) 
library(foreach) 
library(DEoptim) 
library(iterators) 
library(fGarch) 
library(Rglpk) 
library(quadprog) 
library(ROI.plugin.glpk) 
library(ROI.plugin.quadprog) 
library(ROI.plugin.symphony) 
library(pso) 
library(GenSA) 
library(corpcor) 
library(testthat) 
library(nloptr) 
library(MASS) 
library(robustbase) 
library(ggplot2) 


setwd("~/R") 


#BRING IN DATA 

returns.data <- read_excel("portfolio_sample_4asset.xlsx", sheet = "portfolio") 
returns.data <- data.frame(returns.data) 
row.names(returns.data) <- (returns.data$year) 
returns.data$year <- NULL 

meanReturns <- colMeans(returns.data) 

#GENERATE COVARIANCE AND CORRELATION TABLES 

cov.pop <- function(x,y=NULL) { 
    cov(x,y)*(NROW(x)-1)/NROW(x) 
} 

covMat <- cov.pop(returns.data) 

corMat <- cor(returns.data) 


#SPECIFY PORTFOLIO OBJECT 

port <- portfolio.spec(assets = colnames(returns.data)) 


#CONSTRAINTS 

port <- add.constraint(port,type="weight_sum",min=0.99, max=1.01) 
#rportfolios <- random_portfolios(port, permutations = 500, rp_method = "sample", eliminate = TRUE) 


#OPTIMIZATION SETUP 

minreturnLimit <- min(colMeans(returns.data)) 
maxreturnLimit <- max(colMeans(returns.data)) 

minret <- minreturnLimit 
maxret <- maxreturnLimit 

vec <- seq(minret, maxret, length.out = 100) 

eff.frontier <- data.frame(Risk = rep(NA, length(vec)), Return = rep(NA, length(vec))) 

frontier.weights <- mat.or.vec(nr = length(vec), nc = ncol(returns.data)) 

colnames(frontier.weights) <- colnames(returns.data) 



#GENERATE EFFICIENT FRONTIER 
#In add.constraint...the type is return, as in, it is targeting a specific return specified by vec 
#Subsequently, it looks for the portfolio that minimizes StdDev for that return constraint...this is the objective 

for(i in 1:length(vec)){ 
    eff.port <- add.constraint(port, type = "return", name = "mean", return_target = vec[i]) 
    eff.port <- add.objective(eff.port, type = "risk", name = "var") 
    # eff.port <- add.objective(eff.port, type = "weight_concentration", name = "HHI", 
    #       conc_aversion = 0.001) 

    eff.port <- optimize.portfolio(returns.data, eff.port, optimize_method = "ROI") 

    eff.frontier$Risk[i] <- sqrt(t(eff.port$weights) %*% covMat %*% eff.port$weights) 

    eff.frontier$Return[i] <- eff.port$weights %*% meanReturns 

    eff.frontier$Sharperatio[i] <- eff.port$Return[i]/eff.port$Risk[i] 

    frontier.weights[i,] = eff.port$weights 

    print(paste(round(i/length(vec) * 100, 0), "% done...")) 
} 



#PLOT EFFICIENT FRONTIER 

ggplot(eff.frontier, aes(x=eff.frontier$Risk, y=eff.frontier$Return)) + geom_point(shape = 18, color = "limegreen", size = 2) + ggtitle("Portfolio Optimization") + labs(x="Risk",y="Return") 

eff.frontier$Sharpe <- eff.frontier$Return/eff.frontier$Risk 

Répondre

0

Je compris pourquoi mon optimisation ne fonctionnait pas - mon jeu de données contenait une matrice déficiente rang qui ne pouvait pas être résolu (plus de colonnes que les lignes).