FactorCapacity-Nirbhai

Reference run

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.


Why this matters

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.

How it works

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.

step 1
Build factor scores

Cross-sectional rank per factor: 12-1 momentum, P/B value, ROE quality, 6-month low-vol.

step 2
Construct portfolio

Top quintile long, bottom quintile short, dollar-neutral, equal-weighted.

step 3
Backtest gross

Daily gross-of-cost return series. Used as the alpha side of every capacity calculation.

step 4
Cost & capacity scan

At each AUM in the grid: spread + Almgren-Chriss impact + commission + borrow + India tax stack → Net IR.

step 5
Crowding, ML, policy

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.

ML layer · Gaussian mixture model

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.

Today's regime
calm
argmax over the three GMM components
calm probability
93%
normal probability
7%
stressed probability
0%
Regime centroids (interpretable axes)
regimemarket vol (ann.)avg pairwise corrmedian spreadlog10 ADV ($)
calm0.2350.3191 bps9.12
normal0.2510.3531 bps9.11
stressed0.2620.3671 bps9.17
Per-factor

Factor deep dive

Select a factor to inspect its capacity curve, cost decomposition, crowding score, and ML forecast.

Gross IR
+1.10
annualised, before costs
Safe capacity
Net IR ≥ 0.5 + zone constraints
Stress capacity
under tail-quantile market
Crowding
57amber
composite, 0-100, rolling-percentile
Best policy
Q / 0bps
net IR 0.58 at 10.0 cr

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

signalscoreinterpretation
valuation_spread81narrow long-vs-short P/B spread → factor mispricing arbitraged out (Asness)
alpha_decay0negative slope of trailing 1y IR → edge being competed away (Arnott)
short_interest100weighted SI on the short leg → squeeze risk and high borrow (Drechsler)
comomentum2long-leg names moving in lockstep → same arbitrageurs (Lou-Polk)
holdings_overlap98fraction of long names also held long by other factors (Sias)
internal_footprint70strategy'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.

half-life
512 days
deviation from attractor halves in this many days
crowding loading β
0.292
slope of attractor on crowding score
in-sample RMSE
0.099
daily increment residual, IR units

Operating policy search

Search over rebalance frequency × no-trade buffer at the safe-AUM target. The optimal point is highlighted.

freqbuffer (bps)gross IRnet IRcost (bps)max exec days
D01.12-4.7746513.0
D251.12-4.7746513.0
D501.12-4.7746513.0
D1001.12-4.7746513.0
D2001.12-4.7746513.0
W01.14-1.0317142.5
W251.14-1.0317142.5
W501.14-1.0317142.5
W1001.14-1.0317142.5
W2001.14-1.0317142.5
BW01.09-0.3811701.6
BW251.09-0.3811701.6
BW501.09-0.3811701.6
BW1001.09-0.3811701.6
BW2001.09-0.3811701.6
M01.100.197351.6
M251.100.197351.6
M501.100.197351.6
M1001.100.197351.6
M2001.100.197351.6
Q01.120.584351.3
Q251.120.584351.3
Q501.120.584351.3
Q1001.120.584351.3
Q2001.120.584351.3

Capacity checkpoints

As AUM utilisation climbs through 50% / 75% / 90% of safe capacity, execute these operational changes.

50% checkpoint
0.0 cr

Routine — keep current rebalance + buffer.

75% checkpoint
0.0 cr

Raise no-trade buffer to 100bps, downshift rebalance by one tier.

90% checkpoint
0.0 cr

Soft-close to new flows. Raise buffer to 200bps, switch to monthly rebalance.

Joint capacity

Multi-factor allocation

Total target AUM split across factors to maximise expected net return, constrained by the crowding red line.

Total AUM
5.0 cr
2× max single-factor safe capacity
Expected net return
11.9%
annualised, after all costs
Selected factors
1/4
non-zero allocations
factorweightAUMnet IRcrowding
momentum0.0%0.0 cr0.7357
value100.0%5.0 cr0.9538
quality0.0%0.0 cr0.6444
low_vol0.0%0.0 cr-0.1448
ML layer · ridge regression

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.

In-sample R²
0.01
how much variance the linear model explains
Selected λ
100.00
ridge regularisation, picked by LOO-CV
Features
5
spread, vol, ADV, crowding, gross IR
featureβ coefficientinterpretation
spread_bps0.0000+1 bp of spread increases log-AUM by 0.000
vol0.0000+1pt vol increases log-AUM by 0.000
log_adv-0.0004+1 in log10(ADV) decreases log-AUM by -0.000
crowding0.0428+1pt crowding score increases log-AUM by 0.043
gross_ir0.0972+1 unit of gross IR increases log-AUM by 0.097
intercept1.4497log₁₀ AUM at zero feature values