Quastiat
Quastiat

Reputation: 1242

Turnover Contraint not working in Portfolio Optimization with Portfolio Analytics

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

Answers (1)

tester
tester

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

Related Questions