Small and midcap fund stress tests: methods
Code: pipeline/tipsheet/compute/mf_stress.py, pipeline/tipsheet/publish/mf_stress.py. Tests: pipeline/tests/test_mf_stress.py.
What we measure
How long a mid-cap or small-cap mutual fund says it would take to sell part of its portfolio in a rush. Since February 2024 every such scheme has had to disclose, each month, the number of days it would need to liquidate 50% and 25% of its portfolio. We publish:
- By month and category (mid cap, small cap): the number of schemes, the median, 25th and 75th percentiles, interquartile range and maximum of both measures, the AUM-weighted mean, and which scheme had the maximum.
- Per scheme, latest month: scheme, AMC, AUM, days for 50% and 25%, the same a year earlier, and every other disclosed risk field (top-10 investor share, large/mid/small/cash split, standard deviation and beta, portfolio and benchmark P/E, portfolio turnover).
- Stat bundles: median days to liquidate 50% and 25%, for small caps and for mid caps.
How the stress test is defined
The test is prescribed by AMFI under SEBI’s direction, and each AMC computes its own number. AMFI’s disclosure format (as printed in AMC disclosures, for example HSBC Mutual Fund’s for March 2025) describes it as:
Pro-rata liquidation after removing bottom 20% of portfolio based on scrip liquidity (considering 10% PV with 3x volumes)
with the notes that volumes are the 3-month daily average traded volumes on both NSE and BSE, PV means participation volume, and cash is assumed to be used pro-rata. In plain terms:
- The fund sells every holding in proportion to its weight, so remaining investors are treated the same as those leaving. AMFI’s note says AMCs are not required to sell this way in practice; the test assumes it.
- The least liquid 20% of the portfolio is set aside before the calculation.
- The fund is assumed to sell up to 10% of three times a stock’s 3-month average daily volume each day, which is 30% of normal daily volume.
Source
AMFI’s “Disclosure of risk parameters” for mid-cap (AMFI category 17) and small-cap (18) schemes, collected monthly by the Data bank as amfi_risk_parameters (API risk-parameter-data-revised). History starts with February 2024 portfolios, the first month AMFI published. Every series therefore starts 2024-02.
Source quirks and how we handle them
- Missing category names from July 2026. AMFI now returns some rows under new category ids (76 and 77) with a blank category name: 3 rows in Jul 2026 and 24 in Aug 2026. Because each request asks for one category (
strCatId=17or18), we take the category from the request. Without this, Aug 2026 would look like a month with only 21 mid caps and 25 small caps instead of 34 and 36. - Placeholder rows. Samco Mid Cap Fund appears in Dec 2025 and Jan 2026 with zero AUM and zero for every field. These rows are dropped. Any other zero-day figure is treated as not disclosed, since no real portfolio sells instantly.
- Rounding differs by AMC. Most AMCs print whole days; a few print fractions (0.64, 0.98). With a median of 3-5 days, rounding moves the medians, and the 25th percentile often sits at exactly 1.
- Late filers. A month counts as complete for a category when it has at least 85% of the previous month’s schemes. Stat bundles use complete months only, and the per-scheme table uses the latest month complete in both categories. As of the 1 Oct 2026 snapshot every month from Feb 2024 to Aug 2026 passes.
- Scheme names change (for example HDFC Mid-Cap Opportunities Fund became HDFC Mid Cap Fund). Year-ago figures are matched on AMFI’s scheme id, not the name.
- Asset-side shares are as printed and need not sum to 100; a few AMCs printed fractions in early 2024. They are not rescaled. Portfolio turnover is printed as a ratio by most AMCs, but a few values (up to 27.7) look like they are in per cent; it is shown as disclosed.
Checks on the real data (1 Oct 2026 snapshot)
Our category statistics match a direct query of the raw disclosures:
| Month | Category | Schemes | Median days, 50% | IQR | Max (scheme) |
|---|---|---|---|---|---|
| Dec 2024 | Small cap | 28 | 8 | 3.75-26.75 | 73 (quant Small Cap) |
| Aug 2025 | Small cap | 31 | 6 | 2-16.5 | 71 (quant Small Cap) |
| Aug 2026 | Small cap | 36 | 5 | 1.75-13.25 | 48 (quant Small Cap) |
| Aug 2026 | Mid cap | 34 | 3 | 1-7 | 37 (HDFC Mid Cap) |
Spot checks of individual schemes, days for 50% (25%): SBI Small Cap 60 (30) in Feb 2024, 43 (22) in Aug 2026; Nippon India Small Cap 27 (13), then 27 (14); Axis Small Cap 28 (14), then 14 (7); quant Small Cap 22 (11), 71 (35) in Aug 2025, 48 (24) in Aug 2026.
Caveats
- The median understates the risk where the money is. Big funds take longest to sell. In Aug 2026 the median small-cap fund needed 5 days for half its portfolio, but the AUM-weighted average was 24.6 days. For mid caps it was 3 days against 16.7. Both figures are published.
- Each AMC runs the test itself on AMFI’s format. There is no independent audit, and inputs (which exchange volumes, how the bottom 20% is chosen) can differ at the margin.
- Volume is assumed, not stress-tested. The test uses normal 3-month volumes. In a real sell-off volumes and prices both move, and many funds would be selling the same stocks at once. The figure is a comparative yardstick, not a forecast.
- Excluding the least liquid 20% makes the numbers look better than a full liquidation would.
- Short history. Two and a half years of monthly data. Percentiles in the stat bundles rest on about 30 observations.
Same-fund comparisons (2026-10-04)
The changing category median is retained alongside a matched comparison. For 50% liquidation days, we match scheme IDs within the same category at exact one-month and one-year endpoints. Both observations must be positive and finite. Missing calendar months are not replaced by earlier disclosures; category migrations are excluded. Duplicate month/category/scheme keys fail the build.
We report the median individual fund change, before and after medians for that matched set, shares reporting fewer/more days, and matched counts. The median change need not equal the change in medians. Equal values count toward neither fewer nor more days. A new cohort is selected for each window; this is not a fixed panel of surviving funds throughout history.
Coverage is matched funds divided by valid acquired disclosures, separately for each endpoint. This measures matching coverage within the acquired data, not completeness against the full AMFI fund universe. No matches means no change estimate. Latest comparisons use the same disclosure month as the existing scheme table. The existing 85% count rule is a screening rule, not proof of industry completeness. Small changes can reflect AMC rounding.
No cause is inferred: liquidation times depend on holdings, fund size and
trading volumes. A same-fund comparison alone cannot separate these effects.
Bundles: the new fields are in funds/stress/category_monthly; endpoint
comparisons and coverage are in funds/stress/matched_latest.
AUM-weighted distribution and fixed day thresholds
For each category and 25%/50% stress test, usable weights require finite, positive disclosed AUM and finite, positive liquidation days. The weighted mean uses that same set. Weighted median and 90th percentile use the first reported day value reaching 50%/90% of cumulative usable AUM, without interpolation. These differ from equal-fund quantiles when large funds carry more weight.
AUM shares above 10 or 30 days use strict greater-than thresholds and divide by usable AUM for that test. They are fixed descriptive cuts, not calibrated risk boundaries. Coverage is usable AUM divided by the positive finite AUM observed in this dataset. It does not certify complete industry acquisition. Missing AUM cannot carry a weight; missing/zero/negative days are not assigned a zero-day result. Empty usable sets leave statistics and shares blank.
The measures describe AMFI’s prescribed test. They are not forecasts of the actual time, market impact or losses in a market-wide liquidation. Matched-fund changes are still shown separately. Entrant/exit effects and a frozen-cohort AUM decomposition remain pending.