Path: blob/master/demo/demo_risk_budgets.R
1433 views
#' ---1#' title: "Risk Budget Demo"2#' author: Ross Bennett3#' date: "7/17/2014"4#' ---56#' This script demonstrates how to solve a constrained portfolio optimization7#' problem with risk budget objectives.89#' Load the package and data10library(PortfolioAnalytics)11data(edhec)12R <- edhec[, 1:8]13funds <- colnames(R)1415#' Construct initial portfolio with basic constraints.16init.portf <- portfolio.spec(assets=funds)17init.portf <- add.constraint(portfolio=init.portf, type="leverage",18min_sum=0.99, max_sum=1.01)19init.portf <- add.constraint(portfolio=init.portf, type="long_only")2021#' Portfolio optimization problems with risk budget objectives must be solved22#' with DEoptim, random portfolios, pso, or GenSA.2324#' Risk budget objectives can be used to place limits on component contribution25#' to risk or for equal risk contribution portfolios. Note that there are26#' potentially many portfolios that satisfy component ES risk limits so we need27#' to have a "sub" objective such as maximizing return, minimizing ES,28#' minimizing StdDev, etc.2930#' Add objective to maximize mean with limit on component ES risk contribution.31#' The max_prisk controls the maximum percentage contribution to risk.32rbES.portf <- add.objective(portfolio=init.portf, type="return", name="mean")33rbES.portf <- add.objective(portfolio=rbES.portf, type="risk_budget", name="ES",34max_prisk=0.4, arguments=list(p=0.92))3536#' Run optimization with DEoptim as the optimization engine.37rbES.DE <- optimize.portfolio(R=R, portfolio=rbES.portf,38optimize_method="DEoptim",39search_size=2000, trace=TRUE)40rbES.DE41plot(rbES.DE, xlim=c(0, 0.08), ylim=c(0, 0.01))42chart.RiskBudget(rbES.DE, risk.type="pct_contrib")4344#' Add objective to maximize mean return with equal ES risk contribution.45eqES.portf <- add.objective(portfolio=init.portf, type="return", name="mean")46eqES.portf <- add.objective(portfolio=eqES.portf, type="risk_budget",47name="ES", min_concentration=TRUE,48arguments=list(p=0.9, clean="boudt"),49multiplier=10)5051#' Run optimization with random portfolios as the optimization engine.52#' Use cleaned returns53R.clean <- Return.clean(R=R, method="boudt")54eqES.RP <- optimize.portfolio(R=R.clean, portfolio=eqES.portf,55optimize_method="random",56search_size=2000, trace=TRUE)5758eqES.RP59plot(eqES.RP)60chart.RiskBudget(eqES.RP, risk.type="pct_contrib")6162#' Add objective to maximize mean return with limits on StdDev risk contribution.63rbStdDev.portf <- add.objective(portfolio=init.portf, type="return", name="mean")64rbStdDev.portf <- add.objective(portfolio=rbStdDev.portf, type="risk_budget",65name="StdDev", max_prisk=0.25)6667#' Run optimization with DEoptim as the optimization engine.68rbStdDev.DE <- optimize.portfolio(R=R.clean, portfolio=rbStdDev.portf,69optimize_method="DEoptim",70search_size=2000, trace=TRUE)7172rbStdDev.DE73plot(rbStdDev.DE, risk.col="StdDev", xlim=c(0, 0.035), ylim=c(0, 0.01))74chart.RiskBudget(rbStdDev.DE, risk.type="pct_contrib")7576#' Generate random portfolios.77rp <- random_portfolios(init.portf, 5000)7879#' Run out of sample backtest with yearly rebalancing.80SDRB.opt.bt <- optimize.portfolio.rebalancing(R, SDRB.portf,81optimize_method="random",82rp=rp,83trace=TRUE,84rebalance_on="years",85training_period=100,86trailing_periods=60)8788#' Here we demonstrate print and summary methods for89#' optimize.portfolio.rebalancing objects.90SDRB.opt.bt9192tmp_summary <- summary(SDRB.opt.bt)93names(tmp_summary)94tmp_summary9596#' Here we show several extractor functions for97#' summary.optimize.portfolio.rebalancing and optimize.portfolio.rebalancing98#' to extract useful data.99extractWeights(tmp_summary)100extractObjectiveMeasures(tmp_summary)101102tmp_stats <- extractStats(SDRB.opt.bt)103head(tmp_stats[[1]])104tmp_weights <- extractWeights(SDRB.opt.bt)105tmp_obj <- extractObjectiveMeasures(SDRB.opt.bt)106107#' Chart the weights and risk budgets over time for the108#' optimize.portfolio.rebalancing object.109chart.Weights(SDRB.opt.bt)110chart.RiskBudget(SDRB.opt.bt, match.col="StdDev", risk.type="percent")111112113