Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
braverock
GitHub Repository: braverock/portfolioanalytics
Path: blob/master/demo/demo_weight_concentration.R
1433 views
1
#' ---
2
#' title: "Weight Concentration Demo"
3
#' author: Ross Bennett
4
#' date: "7/17/2014"
5
#' ---
6
7
#' This script demonstrates how to solve a constrained portfolio optimization
8
#' problem to minimize weight concentration.
9
10
#' Load the packages and data
11
library(PortfolioAnalytics)
12
library(ROI)
13
library(ROI.plugin.quadprog)
14
data(edhec)
15
R <- edhec[, 1:8]
16
colnames(R) <- c("CA", "CTAG", "DS", "EM", "EMN", "ED", "FIA", "GM")
17
funds <- colnames(R)
18
19
#' Set labels based on category (e.g. market capitalization)
20
cap_labels <- c(rep("Group1", 2), rep("Group2", 2),
21
rep("Group3", 2), rep("Group4", 2))
22
23
24
#' Create initial portfolio object with category_labels.
25
init.portf <- portfolio.spec(assets=funds, category_labels=cap_labels)
26
27
#' Add basic constraints.
28
init.portf <- add.constraint(portfolio=init.portf, type="full_investment")
29
init.portf <- add.constraint(portfolio=init.portf, type="long_only")
30
31
#' Add objective to minimize variance.
32
init.portf <- add.objective(portfolio=init.portf, type="risk", name="var")
33
34
#' Run the optimization with var as the only objective.
35
opt1 <- optimize.portfolio(R=R, portfolio=init.portf, optimize_method="ROI", trace=TRUE)
36
opt1
37
38
#' Add the weight_concentration objective.
39
#' Set the conc_aversion values to 0 so that we should get the same result as
40
#' the minimum variance portfolio.
41
conc.portf <- add.objective(portfolio=init.portf, type="weight_concentration", name="HHI",
42
conc_aversion=0, conc_groups=init.portf$category_labels)
43
44
#' Run the optimization with minimum concentration objective.
45
opt2 <- optimize.portfolio(R=R, portfolio=conc.portf, optimize_method="ROI", trace=TRUE)
46
opt2
47
all.equal(opt1$weights, opt2$weights)
48
chart.Weights(opt2)
49
50
#' Now change the conc_aversion values to control the concentration aversion
51
#' parameters.
52
conc.portf$objectives[[2]]$conc_aversion <- c(0.03, 0.03, 0.06, 0.02)
53
opt3 <- optimize.portfolio(R=R, portfolio=conc.portf, optimize_method="ROI", trace=TRUE)
54
opt3
55
chart.Weights(opt3)
56
57
#' We do not have a group constraint, but we can plot the groups based on
58
#' category labels in the portfolio object.
59
chart.GroupWeights(opt3, grouping="category", plot.type="barplot", col=bluemono)
60
61
#' High conc_aversion values should result in an equal weight portfolio.
62
conc.portf$objectives[[2]]$conc_aversion <- rep(1e6, 4)
63
opt4 <- optimize.portfolio(R=R, portfolio=conc.portf, optimize_method="ROI", trace=TRUE)
64
opt4
65
chart.Weights(opt4)
66
67