15 — Position Sizing

Maximum Position Limits#

ConcentrationHeuristic1 min read
◆ The PatternHard caps on concentration to prevent catastrophic single-name losses

No matter how attractive a trade, position limits cap exposure. Common tiers:

LevelLimit
Single name2-5 % of equity
Sector15-25 %
Asset class30-60 %
Total leverage1×-2× (risk parity may use more)

Regulatory frameworks (UCITS, 40-Act) enforce their own diversification rules. Risk budgeting integrates position limits with volatility and correlation constraints.

// Position limits — concentration caps
Concentration kills. Archegos lost $20 B+ in days due to massive single-name concentration with leveraged swaps.
Pattern bridge: Position caps exist because of overconfidence: the bigger the conviction, the bigger the bet. Models get the same guard rail from regularization, which caps how much any one weight can matter.
Worked example

Seven positions, the largest at 30% and 20%. Capping each at 15% and spreading the excess over the others pro rata gives 15, 15, 15, 15, 15, 13.3 and 11.7%. If the top name then halves, the portfolio loses 7.5% instead of 15%. The cap does not make the picks better; it bounds what one mistake can cost.

Where it misleads
  • Caps on single names miss correlated exposure: seven positions in one sector are one position.
  • Limits on market value miss leverage and derivatives; Archegos built huge exposure through swaps that did not show up as holdings.
  • Rules like UCITS 5/10/40 and the U.S. 75-5-10 test set minimums for funds, not good practice for every portfolio.
In code
w = pd.Series({'A': 0.30, 'B': 0.20, 'C': 0.15, 'D': 0.10, 'E': 0.10, 'F': 0.08, 'G': 0.07})
cap = 0.15
while (w > cap + 1e-12).any():                             # trim to the cap, share the excess pro rata
    excess = (w - cap).clip(lower=0).sum()
    w = w.clip(upper=cap)
    room = w < cap
    w[room] += excess * w[room] / w[room].sum()
hit_before = 0.30 * 0.5                                    # the top name halves
hit_after = w.max() * 0.5
Python, in your browser — edit the code and run it again

Assumes import numpy as np and import pandas as pd. Each snippet carries its own example numbers; the comments say which are made up or simulated.

Sources
  • Directive 2009/65/EC (UCITS), Article 52 — the 5/10/40 rule
  • Investment Company Act of 1940, Section 5(b)(1) — the 75-5-10 test for a diversified fund
  • Paul, Weiss, Credit Suisse Group Special Committee of the Board of Directors Report on Archegos Capital Management, 2021

Last reviewed October 2026 · How this site checks its content · Report a mistake

Linked from 1
← Previous
Pyramiding
Open in the full reader, with the topic sidebar