Path: blob/master/demo/demo_weight_concentration.R
1433 views
#' ---1#' title: "Weight Concentration Demo"2#' author: Ross Bennett3#' date: "7/17/2014"4#' ---56#' This script demonstrates how to solve a constrained portfolio optimization7#' problem to minimize weight concentration.89#' Load the packages and data10library(PortfolioAnalytics)11library(ROI)12library(ROI.plugin.quadprog)13data(edhec)14R <- edhec[, 1:8]15colnames(R) <- c("CA", "CTAG", "DS", "EM", "EMN", "ED", "FIA", "GM")16funds <- colnames(R)1718#' Set labels based on category (e.g. market capitalization)19cap_labels <- c(rep("Group1", 2), rep("Group2", 2),20rep("Group3", 2), rep("Group4", 2))212223#' Create initial portfolio object with category_labels.24init.portf <- portfolio.spec(assets=funds, category_labels=cap_labels)2526#' Add basic constraints.27init.portf <- add.constraint(portfolio=init.portf, type="full_investment")28init.portf <- add.constraint(portfolio=init.portf, type="long_only")2930#' Add objective to minimize variance.31init.portf <- add.objective(portfolio=init.portf, type="risk", name="var")3233#' Run the optimization with var as the only objective.34opt1 <- optimize.portfolio(R=R, portfolio=init.portf, optimize_method="ROI", trace=TRUE)35opt13637#' Add the weight_concentration objective.38#' Set the conc_aversion values to 0 so that we should get the same result as39#' the minimum variance portfolio.40conc.portf <- add.objective(portfolio=init.portf, type="weight_concentration", name="HHI",41conc_aversion=0, conc_groups=init.portf$category_labels)4243#' Run the optimization with minimum concentration objective.44opt2 <- optimize.portfolio(R=R, portfolio=conc.portf, optimize_method="ROI", trace=TRUE)45opt246all.equal(opt1$weights, opt2$weights)47chart.Weights(opt2)4849#' Now change the conc_aversion values to control the concentration aversion50#' parameters.51conc.portf$objectives[[2]]$conc_aversion <- c(0.03, 0.03, 0.06, 0.02)52opt3 <- optimize.portfolio(R=R, portfolio=conc.portf, optimize_method="ROI", trace=TRUE)53opt354chart.Weights(opt3)5556#' We do not have a group constraint, but we can plot the groups based on57#' category labels in the portfolio object.58chart.GroupWeights(opt3, grouping="category", plot.type="barplot", col=bluemono)5960#' High conc_aversion values should result in an equal weight portfolio.61conc.portf$objectives[[2]]$conc_aversion <- rep(1e6, 4)62opt4 <- optimize.portfolio(R=R, portfolio=conc.portf, optimize_method="ROI", trace=TRUE)63opt464chart.Weights(opt4)656667