Why Equal Active-Weight Constraints Force a Benchmark Portfolio
Summary
The document explains why a minimum-risk portfolio optimization with fully equal active weights can return the benchmark itself. It defines each active weight as the difference between a portfolio weight and its benchmark weight. If both the portfolio and benchmark weights sum to one, the active weights must sum to zero. Requiring every active weight to equal every other active weight then means all active weights have the same value while summing to zero, which forces that value to be zero.
The answer directly diagnoses the optimization model’s constraints rather than attributing the result to the covariance matrix or solver. In the stated setup, the equal-active-weight constraints leave no nonzero active allocation for the optimizer to choose, so the benchmark is the only feasible solution under those conditions. The exchange does not propose an alternative portfolio objective or discuss relaxed constraints, additional exposures, or implementation details; it focuses on the mathematical implication of the full-investment and equality constraints.
Key ideas
- Active weight is the portfolio weight minus the corresponding benchmark weight.
- When portfolio and benchmark weights both sum to one, active weights must sum to zero.
- Constraining all active weights to be equal therefore forces each active weight to zero.
- The benchmark portfolio is consequently the only feasible solution under the stated constraints.
Tags
Full text
# How to run optimization to achieve an equal active weight portfolio?
# How to run optimization to achieve an equal active weight portfolio?
I am trying to build an equal active weight portfolio, while minimizing the total risk. However, my constraint of equal active weight always leads to 0 active weight for everything. I know 0 active weight for everything is not the optimal result, as there's no way my benchmark happens to be the minimal risk portfolio. Does anyone know how to solve this problem?
```
fun = lambda x: x.dot(covariance_matrix).dot(x.transpose())
cons = np.array([])
for i in range(0,x0.size-1):
con = {'type': 'eq', 'fun': lambda x, i=i: (x[i]-bmWeight[i])-(x[i+1]-bmWeight[i+1])}
cons = np.append(cons,con)
sumCon = {'type': 'eq', 'fun': lambda x: sum(x)-1}
cons = np.append(cons, sumCon)
solution = minimize(fun,x0,method='SLSQP',constraints = cons)
```
## Answer by Matthew Gunn (score 1)
https://quant.stackexchange.com/a/35949
#### Your constraints imply all the active weights must be zero!
We know that the base weights add to 1, that is:
$$ \sum_i b_i = 1$$
Define the active weight $a_i$ as:
$$ a_i = x_i - b_i$$
Hence if you have the constraint $\sum_i x_i = 1$, then the sum of the active weights must be zero. Observe that summing both sides:
$$ \underbrace{\sum_i a_i}_{=0} = \underbrace{\sum_i x_i}_{=1} - \underbrace{\sum_i b_i}_{=1}$$.
Then if you add constraints such that $a_i = a_j$ for any $i$ and $j$ then $a_i = 0 $ for all $i$ (otherwise, they wouldn't sum to zero).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.