0

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?

Quastiat
  • 1,164
  • 1
  • 18
  • 37
  • `Leverage constraint min_sum and max_sum are restrictive, consider relaxing. e.g. 'full_investment' constraint should be min_sum=0.99 and max_sum=1.01` that's the warning message I get in the optimization step. Have you tried addressing this issue? – tester Nov 17 '21 at 22:53
  • Yes but the optimization runs nonetheless, and as I have already set `min_sum=0.99 and max_sum=1.01` I figured that warning is triggered falsely. It also occurs without any constraints and the most basic optimization. – Quastiat Nov 18 '21 at 08:21

1 Answers1

0

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   
tester
  • 1,662
  • 1
  • 10
  • 16