Why Leverage Constraints Can Concentrate Mean-Variance Portfolios
Summary
The document examines why adding a gross-exposure constraint to a return-maximizing, risk-constrained portfolio can produce weights concentrated in a few assets. It describes a mean-variance setup that maximizes expected return subject to a covariance-based risk limit, then adds a bound on the sum of absolute weights. A response explains that optimizer concentration can arise from errors in expected returns and the covariance matrix, especially when many assets are estimated from relatively little return history. The optimizer may favor seemingly extreme inputs that partly reflect estimation noise.
The suggested remedies are to improve or regularize the estimates and to impose explicit position bounds if diversification is desired. The document offers a sample lower and upper bound approach, but does not establish that those particular bounds are appropriate or explain how to choose them. It gives no empirical comparison or performance evidence, and the discussion does not distinguish the effects of the leverage constraint from estimation error or other model choices.
Key ideas
- Mean-variance optimization can produce concentrated portfolios when expected returns or covariance estimates are noisy.
- Covariance estimation error can be especially consequential when the asset universe is large relative to the return history.
- A gross-exposure constraint alone does not guarantee diversification.
- Position bounds can restrict concentration, but their levels require justification.
Tags
Full text
# portfolio optimization with weights constraint in python
# portfolio optimization with weights constraint in python
I'm trying to optimize a portfolio using cvxpy. My original construction is the following:
```
w = Variable(n)
ret = mu.T * w
risk = quad_form(w, Sigma)
prob = Problem(Maximize(ret), [risk <= .01])
```
which is just maximize return under some risk constraint. However, I would like to also have a weights/leverage constraint, like the following:
```
prob = Problem(Maximize(ret), [risk <= .01, sum(abs(w)) <= 1.0])
```
However, when I add this constraint in many of my weights go to zero and the optimal portfolio is just concentrated in 2-3 assets. This is different from the case without this constraint which results in a much more diversified portfolio. I'm a little confused as to why the weights constraint causes this. Does anyone have any insight?
## Answer by mperlow (score 3)
https://quant.stackexchange.com/a/43004
This is a bit more complex than adding additional constraints. This is a well known problem in markowitz optimization - if you don't treat your covariance matrix and expected return vector with great care, markowitz will often spray your weights against the edges and result in a very non-diversified portfolio.
I suggest robustly landscaping the literature - here is a good place to start:
http://www.ledoit.net/honey.pdf
"Estimating the covariance matrix of stock returns has always been one of the stickiest points. The standard statistical method is to gather a history of past stock returns and compute their sample covariance matrix. Unfortunately this creates problems that are well documented (Jobson and Korkie, 1980). To put it as simply as possible, when the number of stocks under consideration is large, especially relative to the number of historical return observations available (which is the usual case), the sample covariance matrix is estimated with a lot of error. It implies that the most extreme coefficients in the matrix thus estimated tend to take on extreme values not because this is “the truth”, but because they contain an extreme amount of error. Invariably the mean-variance optimization software will latch onto them and place its biggest bets on those coefficients which are the most extremely unreliable"
## Answer by MFABIEN2 (score 0)
https://quant.stackexchange.com/a/42995
I had the same problems on matlab. I Guess that you need To put some boundaries as constraints:
```
cons=({'type':'eq', 'fun': lambda x:sum(x)-1})
Bounds= [(0.1 , 0.5) for i in range(0,nb_assets)]
Optim= scipy.optimize.minimize(fonction,
InitialSolution,method='SLSQP',bounds=Bounds,constraints=cons)
```
This way you tell the optimization tool to find a more diversified solution.Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.