Reputation: 1242
I am trying to perform a standard portfolio optimization, but with a constraint to how much the final weights of the portfolio are allowed to deviate from a set of initial weights. I do this with the PortfolioAnalytics
package and the following code is a MWE without any errors.
# load packages and data
library(quadprog)
library(PortfolioAnalytics)
data(edhec)
dat <- edhec[,1:4]
# add initial weights to initial portfolio
funds <- c("Convertible Arbitrage" = 0.4, "CTA Global" = 0.3, "Distressed Securities" = 0.2, "Emerging Markets" = 0.1)
init.portf <- portfolio.spec(assets=funds)
# standard constraints & objectives
init.portf <- add.constraint(portfolio=init.portf, type="box", min_w=0, min_sum=0.99, max_sum=1.01)
init.portf <- add.objective(portfolio=init.portf, type="return", name="mean")
init.portf <- add.objective(portfolio=init.portf, type="risk", name="StdDev")
# TURNOVER CONSTRAINT (MATTER OF THIS THREAD)
init.portf <- add.constraint(portfolio=init.portf, type="turnover", turnover_target=0)
# optimize portfolio
opt.portf <- optimize.portfolio(R=dat, portfolio=init.portf, trace=TRUE, optimize_method="random")
# check the weights of optimized portfolio
print.default(opt.portf$weights)
turnover_target
is 0
, so the output weights should be the same as the input weights (0.4, 0.3, 0.2, 0.1)
but instead they are equal weighted (0.25, 0.25, 0.25, 0.25)
. Equal weighted are the default initial weights, so somehow it seems like the initial weights I set up aren't recognized. However looking at the documentation of add.constraint or turnover_constraint doesn't help much. It kinda look's like everything should be working. They way I define the initial weights matches with the documentation of portfolio.spec
Does anyone have an idea why my initial weights are ignored by turnover_constraint?
Upvotes: 0
Views: 274
Reputation: 1692
It seems like the turnover constraint of 0 is the problem, as the following code runs (new turnover_target = 0.1
):
pf2 <- portfolio.spec(assets = funds)
pf2 <- add.constraint(pf2,
type="box",
min_w = 0,
min_sum = 0.99,
max_sum = 1.01,
min=c(0.35, 0.25, 0.15, 0.05),
max=c(0.45, 0.35, 0.25, 0.15))
pf2 <- add.constraint(portfolio=pf2, type="turnover", turnover_target=0.1)
# optimize portfolio
pf2 <- optimize.portfolio(R=dat, portfolio=pf2, trace=TRUE, optimize_method="random")
# check the weights of optimized portfolio
> print.default(pf2$weights)
Convertible Arbitrage CTA Global Distressed Securities Emerging Markets
0.350 0.340 0.248 0.062
Upvotes: 0