Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
braverock
GitHub Repository: braverock/portfolioanalytics
Path: blob/master/demo/demo_risk_budgets.R
1433 views
1
#' ---
2
#' title: "Risk Budget 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 risk budget objectives.
9
10
#' Load the package and data
11
library(PortfolioAnalytics)
12
data(edhec)
13
R <- edhec[, 1:8]
14
funds <- colnames(R)
15
16
#' Construct initial portfolio with basic constraints.
17
init.portf <- portfolio.spec(assets=funds)
18
init.portf <- add.constraint(portfolio=init.portf, type="leverage",
19
min_sum=0.99, max_sum=1.01)
20
init.portf <- add.constraint(portfolio=init.portf, type="long_only")
21
22
#' Portfolio optimization problems with risk budget objectives must be solved
23
#' with DEoptim, random portfolios, pso, or GenSA.
24
25
#' Risk budget objectives can be used to place limits on component contribution
26
#' to risk or for equal risk contribution portfolios. Note that there are
27
#' potentially many portfolios that satisfy component ES risk limits so we need
28
#' to have a "sub" objective such as maximizing return, minimizing ES,
29
#' minimizing StdDev, etc.
30
31
#' Add objective to maximize mean with limit on component ES risk contribution.
32
#' The max_prisk controls the maximum percentage contribution to risk.
33
rbES.portf <- add.objective(portfolio=init.portf, type="return", name="mean")
34
rbES.portf <- add.objective(portfolio=rbES.portf, type="risk_budget", name="ES",
35
max_prisk=0.4, arguments=list(p=0.92))
36
37
#' Run optimization with DEoptim as the optimization engine.
38
rbES.DE <- optimize.portfolio(R=R, portfolio=rbES.portf,
39
optimize_method="DEoptim",
40
search_size=2000, trace=TRUE)
41
rbES.DE
42
plot(rbES.DE, xlim=c(0, 0.08), ylim=c(0, 0.01))
43
chart.RiskBudget(rbES.DE, risk.type="pct_contrib")
44
45
#' Add objective to maximize mean return with equal ES risk contribution.
46
eqES.portf <- add.objective(portfolio=init.portf, type="return", name="mean")
47
eqES.portf <- add.objective(portfolio=eqES.portf, type="risk_budget",
48
name="ES", min_concentration=TRUE,
49
arguments=list(p=0.9, clean="boudt"),
50
multiplier=10)
51
52
#' Run optimization with random portfolios as the optimization engine.
53
#' Use cleaned returns
54
R.clean <- Return.clean(R=R, method="boudt")
55
eqES.RP <- optimize.portfolio(R=R.clean, portfolio=eqES.portf,
56
optimize_method="random",
57
search_size=2000, trace=TRUE)
58
59
eqES.RP
60
plot(eqES.RP)
61
chart.RiskBudget(eqES.RP, risk.type="pct_contrib")
62
63
#' Add objective to maximize mean return with limits on StdDev risk contribution.
64
rbStdDev.portf <- add.objective(portfolio=init.portf, type="return", name="mean")
65
rbStdDev.portf <- add.objective(portfolio=rbStdDev.portf, type="risk_budget",
66
name="StdDev", max_prisk=0.25)
67
68
#' Run optimization with DEoptim as the optimization engine.
69
rbStdDev.DE <- optimize.portfolio(R=R.clean, portfolio=rbStdDev.portf,
70
optimize_method="DEoptim",
71
search_size=2000, trace=TRUE)
72
73
rbStdDev.DE
74
plot(rbStdDev.DE, risk.col="StdDev", xlim=c(0, 0.035), ylim=c(0, 0.01))
75
chart.RiskBudget(rbStdDev.DE, risk.type="pct_contrib")
76
77
#' Generate random portfolios.
78
rp <- random_portfolios(init.portf, 5000)
79
80
#' Run out of sample backtest with yearly rebalancing.
81
SDRB.opt.bt <- optimize.portfolio.rebalancing(R, SDRB.portf,
82
optimize_method="random",
83
rp=rp,
84
trace=TRUE,
85
rebalance_on="years",
86
training_period=100,
87
trailing_periods=60)
88
89
#' Here we demonstrate print and summary methods for
90
#' optimize.portfolio.rebalancing objects.
91
SDRB.opt.bt
92
93
tmp_summary <- summary(SDRB.opt.bt)
94
names(tmp_summary)
95
tmp_summary
96
97
#' Here we show several extractor functions for
98
#' summary.optimize.portfolio.rebalancing and optimize.portfolio.rebalancing
99
#' to extract useful data.
100
extractWeights(tmp_summary)
101
extractObjectiveMeasures(tmp_summary)
102
103
tmp_stats <- extractStats(SDRB.opt.bt)
104
head(tmp_stats[[1]])
105
tmp_weights <- extractWeights(SDRB.opt.bt)
106
tmp_obj <- extractObjectiveMeasures(SDRB.opt.bt)
107
108
#' Chart the weights and risk budgets over time for the
109
#' optimize.portfolio.rebalancing object.
110
chart.Weights(SDRB.opt.bt)
111
chart.RiskBudget(SDRB.opt.bt, match.col="StdDev", risk.type="percent")
112
113