Capacity & crowding on four reference factors
Synthetic NIFTY-100-like panel, five years, 100 names. Same engine you'd run on your own data via /analyze, plus the cross-sectional crowding signals that need universe-wide data.
Two compounding mechanisms degrade factor returns
Every factor strategy — momentum, value, quality, low-volatility — earns positive expected returns at small AUM and earns less at larger AUM. The usual story is "alpha decays as size grows." That story is incomplete. Two distinct mechanisms compound on each other:
Trading-cost drag. Costs scale super-linearly with size. Spread is roughly constant per unit of trade, but market impact grows like (Almgren–Chriss) and faster than that for large notionals. At some AUM the marginal alpha is fully consumed by impact.
Crowding. Other managers run the same signal. As capital piles in, the long basket bids up and the short basket gets squeezed. Realised alpha decays before trading costs even fire. Drawdowns become correlated across funds and unwinds become reflexive.
The PM-level question is not "what's my Sharpe at infinite AUM" — it is: given my current AUM and my factors' current crowding, what's my hard cap and what's my safe rebalancing rule?This monitor answers exactly that.
What the dashboard is computing in the background
Five stages run in sequence whenever the data is refreshed. Each stage's output drives one section of the dashboard below.
Cross-sectional rank per factor: 12-1 momentum, P/B value, ROE quality, 6-month low-vol.
Top quintile long, bottom quintile short, dollar-neutral, equal-weighted.
Daily gross-of-cost return series. Used as the alpha side of every capacity calculation.
At each AUM in the grid: spread + Almgren-Chriss impact + commission + borrow + India tax stack → Net IR.
Composite crowding score, OU-model alpha forecast, regime classifier (GMM), optimal rebalance + buffer search.
Per-rebalance equations
is the bid-ask spread (Corwin-Schultz), trade dollars, annualised vol, daily ADV, chosen execution days, the impact coefficient, target weight, holding period.
Current market regime
A 3-component GMM clusters daily market state (vol, average pairwise correlation, spread, ADV) into 'calm', 'normal', 'stressed'. The label drives whether nominal or stressed capacity should bind.
Regime centroids (interpretable axes)
| regime | market vol (ann.) | avg pairwise corr | median spread | log10 ADV ($) |
|---|---|---|---|---|
| calm | 0.235 | 0.319 | 1 bps | 9.12 |
| normal | 0.251 | 0.353 | 1 bps | 9.11 |
| stressed | 0.262 | 0.367 | 1 bps | 9.17 |
Factor deep dive
Select a factor to inspect its capacity curve, cost decomposition, crowding score, and ML forecast.
Capacity curve
Each point is the strategy run at a different AUM with trades scaled linearly. Y-axis is the Information Ratio after every cost; X-axis is AUM (log scale). The dashed line is the IR=0.5 PM hurdle.
Cost decomposition
Stacked annualised cost in bps, split by component. Spread, commission and India tax are roughly linear in turnover. Impact bends — square-root in participation up to the 10% of ADV threshold, then power-0.6.
Crowding score
Six external + internal signals each rolling-percentile-ranked into 0–100, then weighted into a composite. Higher = more crowded.
Latest snapshot
Component scores
| signal | score | interpretation |
|---|---|---|
| valuation_spread | 81 | narrow long-vs-short P/B spread → factor mispricing arbitraged out (Asness) |
| alpha_decay | 0 | negative slope of trailing 1y IR → edge being competed away (Arnott) |
| short_interest | 100 | weighted SI on the short leg → squeeze risk and high borrow (Drechsler) |
| comomentum | 2 | long-leg names moving in lockstep → same arbitrageurs (Lou-Polk) |
| holdings_overlap | 98 | fraction of long names also held long by other factors (Sias) |
| internal_footprint | 70 | strategy's own liquidity strain at base AUM |
Alpha-decay forecast
Six-month forward Sharpe projected via a mean-reverting state-space model fit on rolling 1-year IR. Crowding is the regime covariate — heavier crowding pulls the long-run attractor down.
Operating policy search
Search over rebalance frequency × no-trade buffer at the safe-AUM target. The optimal point is highlighted.
| freq | buffer (bps) | gross IR | net IR | cost (bps) | max exec days |
|---|---|---|---|---|---|
| D | 0 | 1.12 | -4.77 | 4651 | 3.0 |
| D | 25 | 1.12 | -4.77 | 4651 | 3.0 |
| D | 50 | 1.12 | -4.77 | 4651 | 3.0 |
| D | 100 | 1.12 | -4.77 | 4651 | 3.0 |
| D | 200 | 1.12 | -4.77 | 4651 | 3.0 |
| W | 0 | 1.14 | -1.03 | 1714 | 2.5 |
| W | 25 | 1.14 | -1.03 | 1714 | 2.5 |
| W | 50 | 1.14 | -1.03 | 1714 | 2.5 |
| W | 100 | 1.14 | -1.03 | 1714 | 2.5 |
| W | 200 | 1.14 | -1.03 | 1714 | 2.5 |
| BW | 0 | 1.09 | -0.38 | 1170 | 1.6 |
| BW | 25 | 1.09 | -0.38 | 1170 | 1.6 |
| BW | 50 | 1.09 | -0.38 | 1170 | 1.6 |
| BW | 100 | 1.09 | -0.38 | 1170 | 1.6 |
| BW | 200 | 1.09 | -0.38 | 1170 | 1.6 |
| M | 0 | 1.10 | 0.19 | 735 | 1.6 |
| M | 25 | 1.10 | 0.19 | 735 | 1.6 |
| M | 50 | 1.10 | 0.19 | 735 | 1.6 |
| M | 100 | 1.10 | 0.19 | 735 | 1.6 |
| M | 200 | 1.10 | 0.19 | 735 | 1.6 |
| Q | 0 | 1.12 | 0.58 | 435 | 1.3 |
| Q | 25 | 1.12 | 0.58 | 435 | 1.3 |
| Q | 50 | 1.12 | 0.58 | 435 | 1.3 |
| Q | 100 | 1.12 | 0.58 | 435 | 1.3 |
| Q | 200 | 1.12 | 0.58 | 435 | 1.3 |
Capacity checkpoints
As AUM utilisation climbs through 50% / 75% / 90% of safe capacity, execute these operational changes.
Routine — keep current rebalance + buffer.
Raise no-trade buffer to 100bps, downshift rebalance by one tier.
Soft-close to new flows. Raise buffer to 200bps, switch to monthly rebalance.
Multi-factor allocation
Total target AUM split across factors to maximise expected net return, constrained by the crowding red line.
| factor | weight | AUM | net IR | crowding |
|---|---|---|---|---|
| momentum | 0.0% | 0.0 cr | 0.73 | 57 |
| value | 100.0% | 5.0 cr | 0.95 | 38 |
| quality | 0.0% | 0.0 cr | 0.64 | 44 |
| low_vol | 0.0% | 0.0 cr | -0.14 | 48 |
Capacity prediction model
A small ridge regressor that lets you predict 'safe AUM' from market state without re-running the full curve. Lambda picked by leave-one-out CV.
| feature | β coefficient | interpretation |
|---|---|---|
| spread_bps | 0.0000 | +1 bp of spread increases log-AUM by 0.000 |
| vol | 0.0000 | +1pt vol increases log-AUM by 0.000 |
| log_adv | -0.0004 | +1 in log10(ADV) decreases log-AUM by -0.000 |
| crowding | 0.0428 | +1pt crowding score increases log-AUM by 0.043 |
| gross_ir | 0.0972 | +1 unit of gross IR increases log-AUM by 0.097 |
| intercept | 1.4497 | log₁₀ AUM at zero feature values |