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?
(0.22, 0.27, 0.51, 0)
. So the turnover constraint itsself has definitely an affect and works as its supposed to work, it's just the initial weights it ignores. $\endgroup$random
solver, withoptimize_method="random"
. Like I said the turnover method itself is working, but somehow I am setting up the initial weights wrong. $\endgroup$