Path: blob/master/sandbox/mult_layer_script.R
1433 views
1data(edhec)2R <- edhec[, 1:10]3funds <- colnames(R)45# The first sub-portfolio, portf1, will contain assets 1:5 of edhec6# with an objective to minimize standard deviation.7portf1 <- portfolio.spec(assets=funds[1:5])8portf1 <- add.constraint(portfolio=portf1, type="weight_sum",9min_sum=0.99, max_sum=1.01)10portf1 <- add.constraint(portfolio=portf1, type="long_only")11portf1 <- add.objective(portfolio=portf1, type="risk", name="StdDev")1213# The second sub-portfolio, portf2, will contain assets 6:10 of edhec14# with an objective to minimize expected shortfall.15portf2 <- portfolio.spec(assets=funds[6:10])16# portf2 <- portfolio.spec(assets=5)17portf2 <- add.constraint(portfolio=portf2, type="weight_sum",18min_sum=0.99, max_sum=1.01)19portf2 <- add.constraint(portfolio=portf2, type="long_only")20portf2 <- add.objective(portfolio=portf2, type="risk", name="ES",21arguments=list(p=0.9))2223# portf1 and portf2 have the same constraints so they can used the same24# set of random portfolios25set.seed(123)26rp <- random_portfolios(portf2, 2000)272829# The 'top level' portfolio has objectives for equal contribution to risk30# where modified ES is the risk measure31portf <- portfolio.spec(assets=paste("proxy",1:2, sep="."))32portf <- add.constraint(portfolio=portf, type="weight_sum",33min_sum=0.99, max_sum=1.01)34portf <- add.constraint(portfolio=portf, type="long_only")35portf <- add.objective(portfolio=portf, type="risk", name="ES",36arguments=list(p=0.9))37portf <- add.objective(portfolio=portf, type="risk_budget", name="ES",38arguments=list(p=0.9), min_concentration=TRUE)3940# Specify a mult-layer portfolio41mult.portf <- mult.portfolio.spec(portf)4243# Add portf1 as a sub portfolio with optimization parameters specific to44# running optimize.portfolio.rebalancing with portf145mult.portf <- add.sub.portfolio(mult.portf, portf1, rp=rp,46optimize_method="random",47rebalance_on="quarters",48training_period=136)4950# Add portf2 as a sub portfolio with optimization parameters specific to51# running optimize.portfolio.rebalancing with portf252mult.portf <- add.sub.portfolio(mult.portf, portf2, rp=rp,53optimize_method="random",54rebalance_on="months",55training_period=136,56trailing_periods=48)5758# Compute the out of sample backtesting returns for each sub portfolio59proxy.ret <- PortfolioAnalytics:::proxy.mult.portfolio(R, mult.portf)6061# Verify that proxy.mult.portfolio is computing returns correctly62opt1 <- optimize.portfolio.rebalancing(R[,1:5],63portf1,64optimize_method="random",65rp=rp,66rebalance_on="quarters",67training_period=136)68ret1 <- summary(opt1)$portfolio_returns6970opt2 <- optimize.portfolio.rebalancing(R[,6:10],71portf2,72optimize_method="random",73rp=rp,74rebalance_on="months",75training_period=136,76trailing_periods=48)77ret2 <- summary(opt2)$portfolio_returns78ret <- na.omit(cbind(ret1, ret2))7980all.equal(ret, proxy.ret, check.attributes=FALSE)8182# Verify that multi layer optimization is done correctly in optimize.portfolio83set.seed(123)84rp.top <- random_portfolios(portf, 1000)8586opt <- optimize.portfolio(proxy.ret, portf,87optimize_method="random",88trace=TRUE, rp=rp.top)8990opt.mult <- optimize.portfolio(R, mult.portf,91optimize_method="random",92trace=TRUE, rp=rp.top)9394all.equal(extractObjectiveMeasures(opt), extractObjectiveMeasures(opt.mult))95all.equal(extractWeights(opt), extractWeights(opt.mult))969798