Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
braverock
GitHub Repository: braverock/portfolioanalytics
Path: blob/master/sandbox/mult_layer_script.R
1433 views
1
2
data(edhec)
3
R <- edhec[, 1:10]
4
funds <- colnames(R)
5
6
# The first sub-portfolio, portf1, will contain assets 1:5 of edhec
7
# with an objective to minimize standard deviation.
8
portf1 <- portfolio.spec(assets=funds[1:5])
9
portf1 <- add.constraint(portfolio=portf1, type="weight_sum",
10
min_sum=0.99, max_sum=1.01)
11
portf1 <- add.constraint(portfolio=portf1, type="long_only")
12
portf1 <- add.objective(portfolio=portf1, type="risk", name="StdDev")
13
14
# The second sub-portfolio, portf2, will contain assets 6:10 of edhec
15
# with an objective to minimize expected shortfall.
16
portf2 <- portfolio.spec(assets=funds[6:10])
17
# portf2 <- portfolio.spec(assets=5)
18
portf2 <- add.constraint(portfolio=portf2, type="weight_sum",
19
min_sum=0.99, max_sum=1.01)
20
portf2 <- add.constraint(portfolio=portf2, type="long_only")
21
portf2 <- add.objective(portfolio=portf2, type="risk", name="ES",
22
arguments=list(p=0.9))
23
24
# portf1 and portf2 have the same constraints so they can used the same
25
# set of random portfolios
26
set.seed(123)
27
rp <- random_portfolios(portf2, 2000)
28
29
30
# The 'top level' portfolio has objectives for equal contribution to risk
31
# where modified ES is the risk measure
32
portf <- portfolio.spec(assets=paste("proxy",1:2, sep="."))
33
portf <- add.constraint(portfolio=portf, type="weight_sum",
34
min_sum=0.99, max_sum=1.01)
35
portf <- add.constraint(portfolio=portf, type="long_only")
36
portf <- add.objective(portfolio=portf, type="risk", name="ES",
37
arguments=list(p=0.9))
38
portf <- add.objective(portfolio=portf, type="risk_budget", name="ES",
39
arguments=list(p=0.9), min_concentration=TRUE)
40
41
# Specify a mult-layer portfolio
42
mult.portf <- mult.portfolio.spec(portf)
43
44
# Add portf1 as a sub portfolio with optimization parameters specific to
45
# running optimize.portfolio.rebalancing with portf1
46
mult.portf <- add.sub.portfolio(mult.portf, portf1, rp=rp,
47
optimize_method="random",
48
rebalance_on="quarters",
49
training_period=136)
50
51
# Add portf2 as a sub portfolio with optimization parameters specific to
52
# running optimize.portfolio.rebalancing with portf2
53
mult.portf <- add.sub.portfolio(mult.portf, portf2, rp=rp,
54
optimize_method="random",
55
rebalance_on="months",
56
training_period=136,
57
trailing_periods=48)
58
59
# Compute the out of sample backtesting returns for each sub portfolio
60
proxy.ret <- PortfolioAnalytics:::proxy.mult.portfolio(R, mult.portf)
61
62
# Verify that proxy.mult.portfolio is computing returns correctly
63
opt1 <- optimize.portfolio.rebalancing(R[,1:5],
64
portf1,
65
optimize_method="random",
66
rp=rp,
67
rebalance_on="quarters",
68
training_period=136)
69
ret1 <- summary(opt1)$portfolio_returns
70
71
opt2 <- optimize.portfolio.rebalancing(R[,6:10],
72
portf2,
73
optimize_method="random",
74
rp=rp,
75
rebalance_on="months",
76
training_period=136,
77
trailing_periods=48)
78
ret2 <- summary(opt2)$portfolio_returns
79
ret <- na.omit(cbind(ret1, ret2))
80
81
all.equal(ret, proxy.ret, check.attributes=FALSE)
82
83
# Verify that multi layer optimization is done correctly in optimize.portfolio
84
set.seed(123)
85
rp.top <- random_portfolios(portf, 1000)
86
87
opt <- optimize.portfolio(proxy.ret, portf,
88
optimize_method="random",
89
trace=TRUE, rp=rp.top)
90
91
opt.mult <- optimize.portfolio(R, mult.portf,
92
optimize_method="random",
93
trace=TRUE, rp=rp.top)
94
95
all.equal(extractObjectiveMeasures(opt), extractObjectiveMeasures(opt.mult))
96
all.equal(extractWeights(opt), extractWeights(opt.mult))
97
98