Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
braverock
GitHub Repository: braverock/portfolioanalytics
Path: blob/master/demo/demo_roi_solvers.R
1433 views
1
#' ---
2
#' title: "ROI Solvers 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 with different solvers available through the ROI
9
#' (R Optimization Interface) package. See
10
#' http://cran.r-project.org/web/packages/ROI/index.html for more details.
11
12
#' Load the packages
13
library(PortfolioAnalytics)
14
library(ROI)
15
library(ROI.plugin.quadprog)
16
library(ROI.plugin.glpk)
17
library(ROI.plugin.symphony)
18
19
#' Load data
20
data(edhec)
21
R <- edhec[, 1:4]
22
funds <- colnames(R)
23
24
#' Set up initial portfolio with basic constraints.
25
init.portf <- portfolio.spec(assets=funds)
26
init.portf <- add.constraint(portfolio=init.portf, type="full_investment")
27
init.portf <- add.constraint(portfolio=init.portf, type="long_only")
28
29
#' Add objectives.
30
maxret.portf <- add.objective(portfolio=init.portf, type="return", name="mean")
31
mines.portf <- add.objective(portfolio=init.portf, type="risk", name="ES")
32
minsd.portf <- add.objective(portfolio=init.portf, type="risk", name="StdDev")
33
qu.portf <- add.objective(portfolio=init.portf, type="risk", name="StdDev",
34
risk_aversion=0.25)
35
qu.portf <- add.objective(portfolio=qu.portf, type="return", name="mean")
36
37
#' Solve optimization problem to maximize return. Note that
38
#' optimize_method="ROI" defaults to using the glpk solver for linear
39
#' problems.
40
opt.maxret.roi <- optimize.portfolio(R, maxret.portf, optimize_method="ROI")
41
opt.maxret.glpk <- optimize.portfolio(R, maxret.portf, optimize_method="glpk")
42
opt.maxret.symphony <- optimize.portfolio(R, maxret.portf, optimize_method="symphony")
43
all.equal(extractStats(opt.maxret.roi), extractStats(opt.maxret.glpk))
44
all.equal(extractStats(opt.maxret.roi), extractStats(opt.maxret.symphony))
45
46
#' This fails because an optimization problem with a linear objective cannot
47
#' be solved with a quadratic programming solver.
48
# opt.maxret.qp <- optimize.portfolio(R, maxret.portf, optimize_method="quadprog")
49
50
#' Solve optimization problem to minimize ES. Note that
51
#' optimize_method="ROI" defaults to using the glpk solver for linear
52
#' problems.
53
opt.mines.roi <- optimize.portfolio(R, mines.portf, optimize_method="ROI")
54
opt.mines.glpk <- optimize.portfolio(R, mines.portf, optimize_method="glpk")
55
opt.mines.symphony <- optimize.portfolio(R, mines.portf, optimize_method="symphony")
56
all.equal(extractStats(opt.mines.roi), extractStats(opt.mines.glpk))
57
all.equal(extractStats(opt.mines.roi), extractStats(opt.mines.symphony))
58
59
#' Solve optimization problem to minimize standard deviation. Note that
60
#' optimize_method="ROI" defaults to using the quadprog solver for quadratic
61
#' problems.
62
opt.minsd.roi <- optimize.portfolio(R, minsd.portf, optimize_method="ROI")
63
opt.minsd.qp <- optimize.portfolio(R, minsd.portf, optimize_method="quadprog")
64
all.equal(extractStats(opt.minsd.roi), extractStats(opt.minsd.qp))
65
66
#' This fails because an optimization problem with a quadratic objective cannot
67
#' be solved with a linear programming solver.
68
# opt.minsd.glpk <- optimize.portfolio(R, minsd.portf, optimize_method="glpk")
69
70
#' Solve optimization problem to maximize quadratic utility. Note that
71
#' optimize_method="ROI" defaults to using the quadprog solver for quadratic
72
#' problems.
73
opt.qu.roi <- optimize.portfolio(R, qu.portf, optimize_method="ROI")
74
opt.qu.qp <- optimize.portfolio(R, qu.portf, optimize_method="quadprog")
75
all.equal(extractStats(opt.qu.roi), extractStats(opt.qu.qp))
76
77