Methodology
The exact statement of how each number is computed, and when it is refused rather than computed. New to these terms? Start with the glossary, which says what each number means in plain language.
Version 1.0.0Metrics as of 2026-10-31NAV 2006-04-01 to 2026-11-04
This is a research and analytics tool, not investment advice. Historical returns do not guarantee future returns.
Observation frequency and annualisation
- Returns risk and peer metrics
- month-end NAV and monthly returns
- Maximum drawdown
- daily NAV
- Charts and nav history
- daily NAV
- Annualisation monthly
- sqrt(12)
- Why month end
- Comparing a fund with its peers or a benchmark requires every series on the same dates. Funds publish on different days and index data often arrives month-end only, so aligning on daily NAV would mean either discarding the days that do not match everywhere or filling the gaps, and gaps are never filled here.
- Why drawdown is daily
- Drawdown measures the path rather than the endpoints, so a month-end sample steps over the trough. Through the 2020 crash a month-end grid put a typical equity fund at -23% against -34% on daily NAV. It needs no cross-series alignment, so it is the one metric that can use daily data without costing comparability.
The last NAV published in a calendar month is that month's observation, but only if it falls within 10 days of the month end. That excludes the running current month and any month where publication stopped early. Missing months stay missing: NAV is never forward-filled.
Risk-free rate
6.50% a year, converted geometrically to 0.5262% a month with (1 + annual) ** (1/12) - 1. A naive division by twelve would overstate the monthly hurdle. Change it with MF_RISK_FREE_ANNUAL in .env.
Formulas
Trailing CAGR over horizon h
NAV_T is the latest month-end NAV; NAV_{T-h} is the observation h years earlier, accepted only within 10 days of that month end.
Rolling CAGR of the window ending at t
Sharpe ratio
The denominator is total volatility, so upside variation is penalised too.
Sortino ratio
Downside deviation
Only months below the risk-free rate contribute to the sum, but n is the full sample, which keeps this on the same scale as volatility.
Annualised volatility
Tracking error
Information ratio
R_c is the comparison return: the leave-one-out peer average, or the mapped benchmark, depending on which information ratio is shown.
Alpha and beta regression
Ordinary least squares on monthly excess returns; R-squared is reported alongside.
Alpha t-statistic
Tests the monthly intercept alpha_m against zero, from the same OLS fit as alpha_beta; x_bar and S_xx are the mean and sum of squared deviations of the benchmark's monthly excess return. The t-statistic is on the monthly estimate, not the annualised alpha shown elsewhere, because annualising first would test a nonlinear transform of the estimate rather than the estimate itself. Null with reason 'zero_or_invalid_denominator' when the fit leaves no residual variance to estimate a standard error from.
Alpha p-value
Two-sided p-value of alpha_tstat against a Student's t distribution with n-2 degrees of freedom. See 'alpha_significance' below before filtering on this: screened across thousands of funds, this number is not corrected for multiple comparisons.
Maximum drawdown
Computed on daily NAV, so an intra-month trough is captured. The series starts at any NAV redenomination, so the step itself is never counted as a fall.
Calmar ratio
Excess return over peers
Ratio to peers
Reported only when the peer average is positive; otherwise the excess is shown alone.
SIP return (XIRR)
CF_i is -1 (one unit bought) at every month-end NAV in the window and the redemption value of the whole holding at the window's last month-end; d_i is actual calendar days since the first contribution, the same convention a spreadsheet's XIRR function uses. Solved with a bracketed root finder (Brent's method or an equivalent bisection), never a Newton guess, so a cash-flow series with no root in the bracket reports a named reason instead of a plausible wrong rate.
Basket correlation
Basket blended return
Diversification benefit
The weighted average of each component's own annualised volatility, minus the blend's own annualised volatility - the reduction in risk diversification bought by holding several funds rather than the single riskiest one at the same total weight. It is zero when every component moves in lockstep (correlation 1) and positive whenever they do not, whatever the correlation. Correlation of returns is not portfolio overlap: two funds with entirely different holdings can still be highly correlated, and two funds with overlapping holdings can still show a low correlation.
Up and down capture
R_c is the leave-one-out sub-category peer average, the same comparison series the information ratio vs sub-category uses - never a benchmark. The up set is months the peer average rose, the down set months it fell; each ratio compounds the fund's return and the peer return separately over that set before dividing, rather than averaging a ratio month by month, so a single very negative month cannot dominate the result.
Worst calendar-year return
Only complete (12-month) calendar years count, at least 3 of them; a fund's first and last year are almost always partial and are excluded rather than compared against a full year. 'positive_calendar_years_pct' is the share of those same complete years with a positive return.
Current peer quartile
The fund's sub-category peers are ranked by trailing return at every month end (the same rolling series 'rolling_{h}y_median' summarises) and split into four equal-sized groups, 1 being the best-performing group. Computed at both 3y and 5y.
Quartile persistence over 3 years
Read off the fund's trailing 3-year quartile at every eligible month end in the last 5 years: the share matching the quartile it is in now is 'quartile_persistence_3y', the share in the top quartile is 'quartile_top_share_3y', and the count of month-to-month quartile changes is 'quartile_transitions_3y'. Past performance chasing is the error this exists to check.
Style exposure
R_b is the whole style-factor basis at once: every non-negative weight summing to one, chosen to minimise squared error against the fund's own monthly returns. Weights below 0.01% are dropped rather than shown as a false-precision exposure. Describes behaviour only - never read as a holdings statement.
Style drift over 3 years
The single style_exposure fit repeated on every trailing 36-month window, stepped one month at a time, restricted to windows ending in the last 3 years. w_i(b) is the fitted weight on basis member b in window i; the mean is over each pair of consecutive windows that both clear the R-squared floor, so a window that fails the fit is dropped from the series with its reason rather than carrying the previous window's weights forward, and never bridged across in the drift calculation either.
Latest fund-family AUM
AUM_c is latest_aum for one scheme code; the family sums every code sharing this fund's fund_family_id (T2.1), so a Direct/Regular or Growth/IDCW split is not undercounted as several small funds.
AUM growth over 4 quarters
aum_family_latest at the two AMFI-published quarters 4 apart, read from scheme_aum_history rather than parsed from the aum_quarter label.
AUM percentile in sub-category
Percentile rank of aum_family_latest among peers in the fund's clean_sub_category, 1.0 being the largest fund by family AUM. A column to read beside the score rather than one of its components: asset bloat is a risk to weigh yourself, not one this score prices.
Standard deviations use the sample estimator (ddof = 1). Monthly statistics are annualised by sqrt(12); no metric mixes daily and monthly observations.
Peer universe
- Direct plans only and Growth option only by default; plans and options are never mixed silently.
- Active schemes only by default, which introduces survivorship bias in historical screening.
- At least 5 eligible peers, otherwise the metric is null with reason 'insufficient_peer_universe'.
- Peer averages exclude the fund being measured (leave-one-out); at least 2 peers must remain.
- A ratio against a zero or negative peer return is reported as null; the percentage-point excess is still shown.
Defaults
- Level
- sub_category
- Plan scope
- direct
- Option scope
- growth
- Active only
- true
- Aggregation
- mean
- Exclude self
- true
- Min peers
- 5
Survivorship bias, quantified
Every category aggregate (CAGR at 1, 3, 5 and 10 years) is computed twice: once over today's active schemes only, and once over every scheme in the category including ones that later closed or merged away. A category_key encodes which side it is with an active=y or active=n marker; the two keys for one category differ only in that marker.
GET /categories/{category_key}/metrics returns both sides as active_only and all_schemes, plus survivorship_gap_pp: the active-only CAGR minus the all-schemes CAGR at each horizon, in percentage points. A positive gap means the active-only average - the default shown everywhere else in this app - overstates the category by leaving out the funds that did not survive.
Minimum observations before a metric is computed
- Rolling 1y point
- 12 months
- Rolling 3y point
- 36 months
- Rolling 5y point
- 60 months
- Rolling 10y point
- 120 months
- Rolling summary
- 12 valid windows (MF_MIN_ROLLING_WINDOWS)
- Sip xirr
- 12 monthly contributions in the window
- Rolling sip xirr median
- 12 valid windows (MF_MIN_ROLLING_WINDOWS), each itself requiring 12 contributions
- Risk metrics
- 3y: 24 · 5y: 42 · 10y: 84
- Alpha significance
- Same floor as the risk metrics at that horizon, since alpha_tstat and alpha_pvalue come from the same regression as alpha and beta.
- Capture ratios
- Same floor as the risk metrics at that horizon: 24 months at 3y, 42 at 5y.
- Calendar year summary
- 3 complete (12-month) calendar years
- Quartile ranking
- 5 eligible peers in the sub-category at that month end (MF_MIN_PEERS), the same floor every other peer-relative metric uses; below it the month end is excluded rather than ranked on a thin universe.
- Basket analysis
- 24 matched monthly observations across every basket member, the same 3-year floor the risk metrics use; below it the whole /basket response is null with reason 'insufficient_history'.
- Style exposure
- 24 months shared with every member of the style-factor basis, and a fit explaining at least 50% of the fund's month-to-month movement (R-squared); below either, null with reason 'insufficient_observations' or 'style_basis_does_not_describe_this_fund'.
- Style drift 3y
- Each window needs 36 months and the same R-squared floor as style_exposure; the scalar itself needs at least 2 such windows ending in the last 3 years, otherwise null with reason 'insufficient_rolling_windows'.
- Why risk metrics start at 3y
- Rolling windows go down to one year because a 1-year window still yields a long series of overlapping observations. The peer-relative, benchmark-relative and risk metrics do not: a 1-year window holds about 10 matched monthly observations, too thin a sample for a beta, a Sharpe or a tracking error that a screener will sort on.
- Aum growth 4q
- 5 distinct dated readings in scheme_aum_history (the horizon plus the one to grow from); below that, null with reason 'insufficient_aum_history'.
- Aum percentile in sub category
- 5 eligible peers in the sub-category with a computed aum_family_latest (MF_MIN_PEERS), the same floor every other peer-relative metric uses; below it, null with reason 'insufficient_peer_universe'.
Below these thresholds the metric is null with a stated reason. Nothing is extrapolated, and NAV gaps are never forward-filled to manufacture an observation.
Alpha significance and multiple comparisons
Alpha reported without a standard error, screened across the full universe, is a multiple-comparisons machine: some funds clear any p-value threshold by chance alone, with no skill behind the number.
No multiple-comparisons correction (Bonferroni, Benjamini-Hochberg or otherwise) is applied anywhere in this project. The raw, uncorrected p-value is what is stored and filtered on; this section exists so the user sees the consequence of that choice instead of it being silent.
At the p < 0.05 threshold, about 5% of funds are expected to show a nominally significant alpha by chance alone even if none of them have true skill. Across the roughly 36,917 schemes in the metrics snapshot, that is on the order of 1,846 funds - a number worth holding in mind before treating a low p-value on its own as evidence of skill.
Alpha p-value is a filter for ruling funds out, not for ruling one in: a high p-value says the alpha estimate is indistinguishable from noise, but a low one is necessary, not sufficient, evidence of skill. Cross-check with R-squared (is the benchmark actually a good fit?) and with the same fund's alpha at another horizon before treating a single significant result as a finding.
Benchmarks
- Policy
- This project ships no index data. Import your own total-return index CSVs, or build a clearly-labelled proxy from an index fund's NAV. A proxy is net of that fund's expenses and tracking error, so it understates the index.
- Currency rule
- Fund NAVs are published in INR. A benchmark in any other currency is stored and displayed, but no benchmark-relative metric is computed against it: alpha, beta, tracking error, the benchmark information ratio and the benchmark excess return all stay null with reason 'benchmark_currency_mismatch'. This project performs no FX conversion, and the import refuses a CSV with no currency column rather than assuming INR. Where both an INR and a foreign series are configured for the same category, the INR one is always chosen.
- Csv contract
- date, benchmark_id, benchmark_name, currency and one of total_return_index or price. A total-return index is preferred: a growth-option NAV reinvests dividends, so a price index understates the benchmark and flatters the fund. Files are rejected whole, never partially imported.
Loaded series
- Nifty 100 Quality 30INR · 61 months
index_fund_proxy:149254 - Nifty 500 Momentum 50 (index-fund proxy)INR · 26 months
index_fund_proxy:152875 - Nifty 500 (index-fund proxy)INR · 86 months
index_fund_proxy:147625 - Nifty 500 Value 50 (index-fund proxy)INR · 42 months
index_fund_proxy:151739 - Nifty 50 (large cap)INR · 166 months
index_fund_proxy:118581 - Nifty 50 (index-fund proxy)INR · 247 months
index_fund_proxy:100484 - Nifty BankINR · 57 months
index_fund_proxy:149804 - Nifty ITINR · 51 months
index_fund_proxy:150468 - Nifty Midcap 150INR · 69 months
index_fund_proxy:148726 - Nifty Midcap 150 (index-fund proxy)INR · 86 months
index_fund_proxy:147622 - Nifty PharmaINR · 47 months
index_fund_proxy:150930 - Nifty Smallcap 250INR · 73 months
index_fund_proxy:148519 - Nifty Smallcap 250 (index-fund proxy)INR · 86 months
index_fund_proxy:147623 - S&P 500 INR (index-fund proxy)INR · 79 months
index_fund_proxy:148381
Why a value can be missing
Every blank on this site carries one of these reasons; click a blank to see which.
insufficient_history- The scheme does not have enough NAV history for this horizon.
insufficient_observations- Fewer monthly observations than the metric requires.
insufficient_rolling_windows- Fewer valid rolling windows than the configured minimum.
insufficient_peer_universe- Too few eligible peer schemes in the sub-category for this horizon.
benchmark_unavailable- No benchmark index data loaded for the mapped benchmark and period.
benchmark_not_mapped- No benchmark is mapped to this scheme: none is configured for the index or sub-category it follows, or the only candidate is an index-fund proxy built from this same fund, which would measure the fund against itself.
benchmark_currency_mismatch- The mapped benchmark is denominated in a different currency from the fund's NAV. Comparing them would measure the exchange rate as well as performance, so this metric is withheld until an INR-converted series is imported.
style_basis_does_not_describe_this_fund- The style-factor basis explains too little of this fund's month-to-month movement for the fitted weights to mean anything. That is the honest answer for a fund the basis does not cover, such as one investing outside India, or in gold or debt.
ter_not_published- No usable expense ratio for this scheme. TER comes from AMFI's daily per-AMC disclosures, which carry no AMFI scheme code, so it is matched by name and a value is never inferred from a similar one. A fund is also withheld when its disclosure contradicts itself, such as a Direct plan priced above the Regular plan it cannot cost more than.
all_navs_non_positive- Every NAV published for this scheme was zero or negative. AMFI files 0.00 as a matured scheme's terminal marker rather than as a price, so none of them can be used in a return and no metric can be computed. Rebuilding will not change this.
no_nav_history- The source carries this scheme in its master list but publishes no NAV history for it, so there is nothing to compute a return from.
too_few_month_end_observations- Fewer than two month-end NAV observations survive, so not even a single monthly return can be formed. A scheme that only ever traded inside one month lands here.
snapshot_predates_this_nav_history- NAV history is stored for this scheme but the metrics snapshot was built before it arrived. Run `make metrics` to include it.
no_overlapping_observations- Fund and comparison series have too few overlapping months.
zero_or_invalid_denominator- The metric's denominator is zero, so the ratio is undefined.
denominator_zero_or_negative- The peer/benchmark return used as denominator is zero or negative, so a ratio would be misleading. The percentage-point excess is shown instead.
start_observation_outside_tolerance- No NAV observation close enough to the required start month-end.
no_downside_observations- Not enough observations below the threshold to estimate downside deviation.
source_field_missing- The data source does not publish this field.
nav_gap_in_window- The NAV series has missing months inside the window.
nav_scale_discontinuity- The NAV series changes scale part-way through - a face-value redenomination or unit split filed as a raw NAV jump. Only the history after the break is comparable, and it is too short for this window.
sip_xirr_not_bracketed- No annualised rate between -99.99% and +2000% makes this SIP's cash flows net to zero, so no plausible XIRR exists for it. This is a bracketed solve, not a Newton guess, so a series like this reports a reason instead of a number that happened to be the nearest root a guess converged to.
tax_treatment_undetermined- Whether this scheme is equity-oriented for capital gains tax cannot be read off its category. Hybrid schemes whose mandate lets the equity share float across the 65% line - Balanced Advantage, Dynamic Asset Allocation, Multi Asset Allocation - are not guessed into either treatment.
exit_load_not_published- No exit load is stored for this scheme, so the after-tax-and-load figure is withheld rather than assumed to be zero. A fund with an unpublished load may still be inside its load period.
insufficient_aum_history- Fewer than five dated quarterly AUM readings are stored for this scheme, so a four-quarter change has nothing to measure from. AUM history accrues one quarter per master ingest and is never backfilled, so this fills in over time rather than being a fact about the fund.
not_recovered- The fund has not regained the NAV high it fell from inside this window, so there is no recovery date to measure days against. A large placeholder number would misstate a fall the fund may still be inside.
metric_not_computed- This component's metric is not in the stored snapshot at all - it was added to the weight table after the last metrics rebuild. Run `make metrics` to compute it; until then the component is named missing and its weight is redistributed.
coverage_below_floor- Fewer than half the weighted components could be computed for this fund, so no total is published. The components that exist are still shown with their own percentiles: read those instead of a total built on a fraction of the table.
enrichment_source_does_not_carry_this_fund- The enrichment source does not publish this fact for this scheme, so it is shown blank rather than assumed.
enrichment_source_unreachable- The enrichment source could not be reached, so this value is a blank, not a zero.
enrichment_value_stale- SEBI requires the riskometer to be republished monthly; the value shown is older than that and may no longer reflect the fund's current risk band.
holdings_not_loaded- No holdings are stored for this scheme. This project ships no holdings data and fetches none - the candidate source is unreachable and scraping AMC sites is refused - so a portfolio appears here only once one is imported with `make holdings-import`.
insufficient_holdings_months- Turnover is the change between two consecutive monthly portfolios, so it needs at least two disclosure months for this scheme. Only one is stored.
holdings_as_of_months_differ- The two funds' latest portfolios are more than a month apart. Overlapping a January portfolio with a June one would measure six months of trading as if it were a difference in holdings, so the pair is refused rather than reported.
holdings_asset_type_not_supplied- The imported file carries no asset_type for this scheme-month, so the equity share of the portfolio is unknown and cannot be cross-checked against the returns-based exposure estimate.
Metric catalog
| Metric | Definition | Better | Caveat |
|---|---|---|---|
| Past return per year (1Y) cagr_1y | Annualised trailing return from month-end NAV to month-end NAV. | Higher | Past return. It says nothing about future return, and it ignores risk taken. |
| Past return per year (3Y) cagr_3y | Annualised trailing return from month-end NAV to month-end NAV. | Higher | Past return. It says nothing about future return, and it ignores risk taken. |
| Past return per year (5Y) cagr_5y | Annualised trailing return from month-end NAV to month-end NAV. | Higher | Past return. It says nothing about future return, and it ignores risk taken. |
| Past return per year (10Y) cagr_10y | Annualised trailing return from month-end NAV to month-end NAV. | Higher | Past return. It says nothing about future return, and it ignores risk taken. |
| Past return per year, monthly SIP (1Y) sip_xirr_1y | Annualised return on a fixed monthly contribution made at each month-end NAV in the window, redeemed at the window's last observation. | Higher | Not the same number as trailing CAGR: it reflects the timing of monthly contributions, not a single lump sum in and out. Blank below 12 contributions or when no annualised rate prices the cash flows to zero. |
| Past return per year, monthly SIP (3Y) sip_xirr_3y | Annualised return on a fixed monthly contribution made at each month-end NAV in the window, redeemed at the window's last observation. | Higher | Not the same number as trailing CAGR: it reflects the timing of monthly contributions, not a single lump sum in and out. Blank below 12 contributions or when no annualised rate prices the cash flows to zero. |
| Past return per year, monthly SIP (5Y) sip_xirr_5y | Annualised return on a fixed monthly contribution made at each month-end NAV in the window, redeemed at the window's last observation. | Higher | Not the same number as trailing CAGR: it reflects the timing of monthly contributions, not a single lump sum in and out. Blank below 12 contributions or when no annualised rate prices the cash flows to zero. |
| Past return per year, monthly SIP (10Y) sip_xirr_10y | Annualised return on a fixed monthly contribution made at each month-end NAV in the window, redeemed at the window's last observation. | Higher | Not the same number as trailing CAGR: it reflects the timing of monthly contributions, not a single lump sum in and out. Blank below 12 contributions or when no annualised rate prices the cash flows to zero. |
| Typical 3-year outcome, monthly SIP rolling_sip_xirr_3y_median | Median SIP XIRR of every overlapping 3-year contribution window in the fund's history. | Higher | Overlapping windows are correlated, so this is not a sample of independent outcomes. |
| Typical 5-year outcome, monthly SIP rolling_sip_xirr_5y_median | Median SIP XIRR of every overlapping 5-year contribution window in the fund's history. | Higher | Overlapping windows are correlated, so this is not a sample of independent outcomes. |
| Average 1-year outcome rolling_1y_mean | mean of every overlapping 1-year annualised return in the fund's history. | Higher | Overlapping windows are correlated, so this is not a sample of independent outcomes. |
| Typical 1-year outcome rolling_1y_median | median of every overlapping 1-year annualised return in the fund's history. | Higher | Less sensitive to one exceptional market phase than the mean. |
| Worst 1-year stretch on record rolling_1y_min | minimum of every overlapping 1-year annualised return in the fund's history. | Higher | The single worst window in the available history - not a floor on future outcomes. |
| Strongest 1-year stretch on record rolling_1y_max | maximum of every overlapping 1-year annualised return in the fund's history. | Neither | The best window. Useful for range, useless as an expectation. |
| How much the outcome depended on start date rolling_1y_std | dispersion of every overlapping 1-year annualised return in the fund's history. | Lower | Standard deviation across overlapping windows; windows share months, so it understates independence. |
| How often 1 years ended in profit rolling_1y_positive_pct | positive % of every overlapping 1-year annualised return in the fund's history. | Higher | Share of windows with a return above zero, not above inflation. |
| How often it beat similar funds rolling_1y_beat_category_pct | beat sub-category % of every overlapping 1-year annualised return in the fund's history. | Higher | Compared against the equal-weighted peer index, which is itself survivorship-affected. |
| How often it beat its index rolling_1y_beat_benchmark_pct | beat benchmark % of every overlapping 1-year annualised return in the fund's history. | Higher | Only as good as the mapped benchmark series. |
| Average 3-year outcome rolling_3y_mean | mean of every overlapping 3-year annualised return in the fund's history. | Higher | Overlapping windows are correlated, so this is not a sample of independent outcomes. |
| Typical 3-year outcome rolling_3y_median | median of every overlapping 3-year annualised return in the fund's history. | Higher | Less sensitive to one exceptional market phase than the mean. |
| Worst 3-year stretch on record rolling_3y_min | minimum of every overlapping 3-year annualised return in the fund's history. | Higher | The single worst window in the available history - not a floor on future outcomes. |
| Strongest 3-year stretch on record rolling_3y_max | maximum of every overlapping 3-year annualised return in the fund's history. | Neither | The best window. Useful for range, useless as an expectation. |
| How much the outcome depended on start date rolling_3y_std | dispersion of every overlapping 3-year annualised return in the fund's history. | Lower | Standard deviation across overlapping windows; windows share months, so it understates independence. |
| How often 3 years ended in profit rolling_3y_positive_pct | positive % of every overlapping 3-year annualised return in the fund's history. | Higher | Share of windows with a return above zero, not above inflation. |
| How often it beat similar funds rolling_3y_beat_category_pct | beat sub-category % of every overlapping 3-year annualised return in the fund's history. | Higher | Compared against the equal-weighted peer index, which is itself survivorship-affected. |
| How often it beat its index rolling_3y_beat_benchmark_pct | beat benchmark % of every overlapping 3-year annualised return in the fund's history. | Higher | Only as good as the mapped benchmark series. |
| Average 5-year outcome rolling_5y_mean | mean of every overlapping 5-year annualised return in the fund's history. | Higher | Overlapping windows are correlated, so this is not a sample of independent outcomes. |
| Typical 5-year outcome rolling_5y_median | median of every overlapping 5-year annualised return in the fund's history. | Higher | Less sensitive to one exceptional market phase than the mean. |
| Worst 5-year stretch on record rolling_5y_min | minimum of every overlapping 5-year annualised return in the fund's history. | Higher | The single worst window in the available history - not a floor on future outcomes. |
| Strongest 5-year stretch on record rolling_5y_max | maximum of every overlapping 5-year annualised return in the fund's history. | Neither | The best window. Useful for range, useless as an expectation. |
| How much the outcome depended on start date rolling_5y_std | dispersion of every overlapping 5-year annualised return in the fund's history. | Lower | Standard deviation across overlapping windows; windows share months, so it understates independence. |
| How often 5 years ended in profit rolling_5y_positive_pct | positive % of every overlapping 5-year annualised return in the fund's history. | Higher | Share of windows with a return above zero, not above inflation. |
| How often it beat similar funds rolling_5y_beat_category_pct | beat sub-category % of every overlapping 5-year annualised return in the fund's history. | Higher | Compared against the equal-weighted peer index, which is itself survivorship-affected. |
| How often it beat its index rolling_5y_beat_benchmark_pct | beat benchmark % of every overlapping 5-year annualised return in the fund's history. | Higher | Only as good as the mapped benchmark series. |
| Average 10-year outcome rolling_10y_mean | mean of every overlapping 10-year annualised return in the fund's history. | Higher | Overlapping windows are correlated, so this is not a sample of independent outcomes. |
| Typical 10-year outcome rolling_10y_median | median of every overlapping 10-year annualised return in the fund's history. | Higher | Less sensitive to one exceptional market phase than the mean. |
| Worst 10-year stretch on record rolling_10y_min | minimum of every overlapping 10-year annualised return in the fund's history. | Higher | The single worst window in the available history - not a floor on future outcomes. |
| Strongest 10-year stretch on record rolling_10y_max | maximum of every overlapping 10-year annualised return in the fund's history. | Neither | The best window. Useful for range, useless as an expectation. |
| How much the outcome depended on start date rolling_10y_std | dispersion of every overlapping 10-year annualised return in the fund's history. | Lower | Standard deviation across overlapping windows; windows share months, so it understates independence. |
| How often 10 years ended in profit rolling_10y_positive_pct | positive % of every overlapping 10-year annualised return in the fund's history. | Higher | Share of windows with a return above zero, not above inflation. |
| How often it beat similar funds rolling_10y_beat_category_pct | beat sub-category % of every overlapping 10-year annualised return in the fund's history. | Higher | Compared against the equal-weighted peer index, which is itself survivorship-affected. |
| How often it beat its index rolling_10y_beat_benchmark_pct | beat benchmark % of every overlapping 10-year annualised return in the fund's history. | Higher | Only as good as the mapped benchmark series. |
| Share of similar funds' good months captured upside_capture_3y | Fund's compounded return over months its sub-category peer average rose, divided by the peer average's own compounded return over those same months. | Higher | Against the leave-one-out sub-category peer average, not a benchmark index - capture against peers and capture against a benchmark are different numbers. |
| Share of similar funds' bad months taken on downside_capture_3y | Fund's compounded return over months its sub-category peer average fell, divided by the peer average's own compounded return over those same months. | Lower | Below 1 means the fund lost less than peers when they fell, the desirable direction. Against the leave-one-out sub-category peer average, not a benchmark index - capture against peers and capture against a benchmark are different numbers. |
| Share of similar funds' good months captured upside_capture_5y | Fund's compounded return over months its sub-category peer average rose, divided by the peer average's own compounded return over those same months. | Higher | Against the leave-one-out sub-category peer average, not a benchmark index - capture against peers and capture against a benchmark are different numbers. |
| Share of similar funds' bad months taken on downside_capture_5y | Fund's compounded return over months its sub-category peer average fell, divided by the peer average's own compounded return over those same months. | Lower | Below 1 means the fund lost less than peers when they fell, the desirable direction. Against the leave-one-out sub-category peer average, not a benchmark index - capture against peers and capture against a benchmark are different numbers. |
| Time taken to recover that fall max_drawdown_5y_recovery_days | Calendar days from the trough of the worst peak-to-trough fall in the last 5 years to the first daily NAV that regained the pre-fall peak. | Lower | Blank, never a large number, when the fund has not yet regained that peak. |
| Worst full year it has had worst_calendar_year_return | Lowest compounded return of any complete calendar year in the fund's history. | Higher | Needs at least 3 complete (12-month) calendar years; the fund's first and last, almost always partial, are never counted. |
| Which year was the worst full year worst_calendar_year | Calendar year of the fund's worst complete-year return. | Neither | Needs at least 3 complete (12-month) calendar years; the fund's first and last, almost always partial, are never counted. |
| Share of years that ended up positive_calendar_years_pct | Share of complete calendar years with a positive compounded return. | Higher | Needs at least 3 complete (12-month) calendar years; the fund's first and last, almost always partial, are never counted. |
| How much its investing style has shifted (3Y) style_drift_3y | Mean turnover between consecutive rolling 36-month style-factor fits over the last 3 years: half the sum of absolute weight changes across the basis, so a complete switch from one factor to another reads as 1 and an unchanged mix as 0. | Lower | Inferred from NAV, not from holdings - the same style-analysis basis as the exposure fit, and blank for the same reasons: too little shared history with the basis, or fewer than 2 windows in the last 3 years that clear the R-squared floor. |
| Rank group among similar funds today, on 3-year return (1 = top quarter) quartile_now_3y | Quartile of the fund's trailing 3-year return inside its sub-category as of the snapshot date, 1 being the best-performing quarter of peers. | Lower | Ranked inside the fund's own sub-category, requiring the same minimum peer count as every other peer-relative metric; blank below it. |
| Rank group among similar funds today (1 = top quarter) quartile_now_5y | Quartile of the fund's trailing 5-year return inside its sub-category as of the snapshot date, 1 being the best-performing quarter of peers. | Lower | Ranked inside the fund's own sub-category, requiring the same minimum peer count as every other peer-relative metric; blank below it. |
| How often it stayed in the same rank group quartile_persistence_3y | Share of month ends in the last 5 years where the fund's trailing 3-year sub-category quartile matched the quartile it is in now. | Higher | Ranked inside the fund's own sub-category, requiring the same minimum peer count as every other peer-relative metric; blank below it. Past performance chasing is the error this exists to check. |
| Time spent in the top quarter of similar funds quartile_top_share_3y | Share of month ends in the last 5 years where the fund's trailing 3-year return ranked in the top quartile of its sub-category. | Higher | Ranked inside the fund's own sub-category, requiring the same minimum peer count as every other peer-relative metric; blank below it. |
| How often its rank group changed quartile_transitions_3y | Number of month-to-month changes in the fund's trailing 3-year sub-category quartile over the last 5 years. | Lower | Ranked inside the fund's own sub-category, requiring the same minimum peer count as every other peer-relative metric; blank below it. Fewer changes means a more stable relative rank, not a better one. |
| Ahead of / behind similar funds (3Y) fund_minus_category_3y | Fund CAGR minus the leave-one-out average CAGR of its peer universe. | Higher | Peers are today's surviving schemes; funds that closed are not in the average. |
| Times the similar-fund average (3Y) fund_div_category_3y | Fund CAGR divided by the peer average CAGR. | Higher | Undefined and shown blank when the peer average is zero or negative. |
| Similar funds' average return (3Y) category_return_3y | Average trailing CAGR of the peer universe, excluding this fund. | Neither | Equal-weighted across schemes by default, not weighted by AUM. |
| Its index's return (3Y) benchmark_return_3y | Trailing CAGR of the mapped benchmark over the same window as the fund. | Neither | Blank when no benchmark series is loaded for the fund's category. |
| Ahead of / behind its index (3Y) fund_minus_benchmark_3y | Fund CAGR minus the mapped benchmark's CAGR. | Higher | Blank when no benchmark series is loaded for the fund's category. |
| How reliably it beat similar funds (3Y) information_ratio_vs_category_3y | Measures the consistency of monthly fund outperformance versus its sub-category peer return. | Higher | It is not benchmark Information Ratio. The app uses an equal-weighted, leave-one-out peer return by default. |
| How reliably it beat its index (3Y) information_ratio_vs_benchmark_3y | Mean monthly active return over its standard deviation, annualised, against the mapped benchmark. | Higher | A proxy benchmark is net of that index fund's costs, which flatters the fund slightly. Blank when the mapped benchmark is in another currency. |
| Return earned per unit of ups and downs (3Y) sharpe_3y | Mean monthly return above the risk-free rate over the standard deviation of monthly returns, annualised. | Higher | Penalises upside volatility as much as downside. |
| Return earned per unit of downside (3Y) sortino_3y | Excess return over downside deviation, annualised. | Higher | Downside deviation uses only months below the risk-free rate, so it rests on fewer observations. |
| How bumpy the ride was (3Y) volatility_3y | Annualised standard deviation of monthly returns. | Lower | Monthly data smooths intra-month drawdowns. |
| How large the bad months were (3Y) downside_deviation_3y | Annualised standard deviation of shortfalls below the monthly risk-free rate. | Lower | Estimated from below-threshold months only. |
| How closely it follows its index (3Y) tracking_error_3y | Annualised standard deviation of the fund-minus-benchmark monthly return. | Lower | For an active fund a low value means index-hugging, not skill. Blank when the mapped benchmark is in another currency. |
| Return the index does not explain (3Y) alpha_3y | Annualised intercept of the fund's excess return regressed on the benchmark's excess return. | Higher | Only meaningful against a benchmark the fund actually tracks; check R-squared and beta. Blank when the mapped benchmark is in another currency. |
| How hard it swings with the index (3Y) beta_3y | Slope of the fund's excess return regressed on the benchmark's excess return: sensitivity to the benchmark. | Neither | Above 1 means it amplified the index, in both directions. Blank when the mapped benchmark is in another currency. |
| How much the index explains (3Y) r_squared_3y | Share of the fund's excess return variance explained by that same regression. | Neither | A low value means alpha and beta describe this fund poorly. Blank when the mapped benchmark is in another currency. |
| Strength of the evidence behind that leftover return (3Y) alpha_tstat_3y | T-statistic of the monthly alpha estimate against zero, from the same regression's residual standard error. | Neither | No multiple-comparisons correction is applied: screened across the full universe, roughly 5% of funds are expected to clear p < 0.05 by chance alone even with zero true skill. See the methodology page for the expected false-positive count. Blank when the mapped benchmark is in another currency. |
| Odds this outperformance is chance (3Y) alpha_pvalue_3y | Two-sided p-value of the alpha t-statistic against the t-distribution with n-2 degrees of freedom. | Lower | No multiple-comparisons correction is applied: screened across the full universe, roughly 5% of funds are expected to clear p < 0.05 by chance alone even with zero true skill. See the methodology page for the expected false-positive count. Blank when the mapped benchmark is in another currency. |
| Worst fall from a peak (3Y) max_drawdown_3y | Worst peak-to-trough fall in daily NAV, carried as a negative number: -12% is a milder fall than -40%, which is why a higher value is the better one. | Higher | Measured on daily NAV. The series starts at any NAV redenomination, so the step is never counted as a fall. |
| Return per unit of worst fall (3Y) calmar_3y | Trailing CAGR divided by the absolute maximum drawdown. | Higher | Unstable when the drawdown is small. |
| Ahead of / behind similar funds (5Y) fund_minus_category_5y | Fund CAGR minus the leave-one-out average CAGR of its peer universe. | Higher | Peers are today's surviving schemes; funds that closed are not in the average. |
| Times the similar-fund average (5Y) fund_div_category_5y | Fund CAGR divided by the peer average CAGR. | Higher | Undefined and shown blank when the peer average is zero or negative. |
| Similar funds' average return (5Y) category_return_5y | Average trailing CAGR of the peer universe, excluding this fund. | Neither | Equal-weighted across schemes by default, not weighted by AUM. |
| Its index's return (5Y) benchmark_return_5y | Trailing CAGR of the mapped benchmark over the same window as the fund. | Neither | Blank when no benchmark series is loaded for the fund's category. |
| Ahead of / behind its index (5Y) fund_minus_benchmark_5y | Fund CAGR minus the mapped benchmark's CAGR. | Higher | Blank when no benchmark series is loaded for the fund's category. |
| How reliably it beat similar funds (5Y) information_ratio_vs_category_5y | Measures the consistency of monthly fund outperformance versus its sub-category peer return. | Higher | It is not benchmark Information Ratio. The app uses an equal-weighted, leave-one-out peer return by default. |
| How reliably it beat its index (5Y) information_ratio_vs_benchmark_5y | Mean monthly active return over its standard deviation, annualised, against the mapped benchmark. | Higher | A proxy benchmark is net of that index fund's costs, which flatters the fund slightly. Blank when the mapped benchmark is in another currency. |
| Return earned per unit of ups and downs (5Y) sharpe_5y | Mean monthly return above the risk-free rate over the standard deviation of monthly returns, annualised. | Higher | Penalises upside volatility as much as downside. |
| Return earned per unit of downside (5Y) sortino_5y | Excess return over downside deviation, annualised. | Higher | Downside deviation uses only months below the risk-free rate, so it rests on fewer observations. |
| How bumpy the ride was (5Y) volatility_5y | Annualised standard deviation of monthly returns. | Lower | Monthly data smooths intra-month drawdowns. |
| How large the bad months were (5Y) downside_deviation_5y | Annualised standard deviation of shortfalls below the monthly risk-free rate. | Lower | Estimated from below-threshold months only. |
| How closely it follows its index (5Y) tracking_error_5y | Annualised standard deviation of the fund-minus-benchmark monthly return. | Lower | For an active fund a low value means index-hugging, not skill. Blank when the mapped benchmark is in another currency. |
| Return the index does not explain (5Y) alpha_5y | Annualised intercept of the fund's excess return regressed on the benchmark's excess return. | Higher | Only meaningful against a benchmark the fund actually tracks; check R-squared and beta. Blank when the mapped benchmark is in another currency. |
| How hard it swings with the index (5Y) beta_5y | Slope of the fund's excess return regressed on the benchmark's excess return: sensitivity to the benchmark. | Neither | Above 1 means it amplified the index, in both directions. Blank when the mapped benchmark is in another currency. |
| How much the index explains (5Y) r_squared_5y | Share of the fund's excess return variance explained by that same regression. | Neither | A low value means alpha and beta describe this fund poorly. Blank when the mapped benchmark is in another currency. |
| Strength of the evidence behind that leftover return (5Y) alpha_tstat_5y | T-statistic of the monthly alpha estimate against zero, from the same regression's residual standard error. | Neither | No multiple-comparisons correction is applied: screened across the full universe, roughly 5% of funds are expected to clear p < 0.05 by chance alone even with zero true skill. See the methodology page for the expected false-positive count. Blank when the mapped benchmark is in another currency. |
| Odds this outperformance is chance (5Y) alpha_pvalue_5y | Two-sided p-value of the alpha t-statistic against the t-distribution with n-2 degrees of freedom. | Lower | No multiple-comparisons correction is applied: screened across the full universe, roughly 5% of funds are expected to clear p < 0.05 by chance alone even with zero true skill. See the methodology page for the expected false-positive count. Blank when the mapped benchmark is in another currency. |
| Worst fall from a peak (5Y) max_drawdown_5y | Worst peak-to-trough fall in daily NAV, carried as a negative number: -12% is a milder fall than -40%, which is why a higher value is the better one. | Higher | Measured on daily NAV. The series starts at any NAV redenomination, so the step is never counted as a fall. |
| Return per unit of worst fall (5Y) calmar_5y | Trailing CAGR divided by the absolute maximum drawdown. | Higher | Unstable when the drawdown is small. |
| Ahead of / behind similar funds (10Y) fund_minus_category_10y | Fund CAGR minus the leave-one-out average CAGR of its peer universe. | Higher | Peers are today's surviving schemes; funds that closed are not in the average. |
| Times the similar-fund average (10Y) fund_div_category_10y | Fund CAGR divided by the peer average CAGR. | Higher | Undefined and shown blank when the peer average is zero or negative. |
| Similar funds' average return (10Y) category_return_10y | Average trailing CAGR of the peer universe, excluding this fund. | Neither | Equal-weighted across schemes by default, not weighted by AUM. |
| Its index's return (10Y) benchmark_return_10y | Trailing CAGR of the mapped benchmark over the same window as the fund. | Neither | Blank when no benchmark series is loaded for the fund's category. |
| Ahead of / behind its index (10Y) fund_minus_benchmark_10y | Fund CAGR minus the mapped benchmark's CAGR. | Higher | Blank when no benchmark series is loaded for the fund's category. |
| How reliably it beat similar funds (10Y) information_ratio_vs_category_10y | Measures the consistency of monthly fund outperformance versus its sub-category peer return. | Higher | It is not benchmark Information Ratio. The app uses an equal-weighted, leave-one-out peer return by default. |
| How reliably it beat its index (10Y) information_ratio_vs_benchmark_10y | Mean monthly active return over its standard deviation, annualised, against the mapped benchmark. | Higher | A proxy benchmark is net of that index fund's costs, which flatters the fund slightly. Blank when the mapped benchmark is in another currency. |
| Return earned per unit of ups and downs (10Y) sharpe_10y | Mean monthly return above the risk-free rate over the standard deviation of monthly returns, annualised. | Higher | Penalises upside volatility as much as downside. |
| Return earned per unit of downside (10Y) sortino_10y | Excess return over downside deviation, annualised. | Higher | Downside deviation uses only months below the risk-free rate, so it rests on fewer observations. |
| How bumpy the ride was (10Y) volatility_10y | Annualised standard deviation of monthly returns. | Lower | Monthly data smooths intra-month drawdowns. |
| How large the bad months were (10Y) downside_deviation_10y | Annualised standard deviation of shortfalls below the monthly risk-free rate. | Lower | Estimated from below-threshold months only. |
| How closely it follows its index (10Y) tracking_error_10y | Annualised standard deviation of the fund-minus-benchmark monthly return. | Lower | For an active fund a low value means index-hugging, not skill. Blank when the mapped benchmark is in another currency. |
| Return the index does not explain (10Y) alpha_10y | Annualised intercept of the fund's excess return regressed on the benchmark's excess return. | Higher | Only meaningful against a benchmark the fund actually tracks; check R-squared and beta. Blank when the mapped benchmark is in another currency. |
| How hard it swings with the index (10Y) beta_10y | Slope of the fund's excess return regressed on the benchmark's excess return: sensitivity to the benchmark. | Neither | Above 1 means it amplified the index, in both directions. Blank when the mapped benchmark is in another currency. |
| How much the index explains (10Y) r_squared_10y | Share of the fund's excess return variance explained by that same regression. | Neither | A low value means alpha and beta describe this fund poorly. Blank when the mapped benchmark is in another currency. |
| Strength of the evidence behind that leftover return (10Y) alpha_tstat_10y | T-statistic of the monthly alpha estimate against zero, from the same regression's residual standard error. | Neither | No multiple-comparisons correction is applied: screened across the full universe, roughly 5% of funds are expected to clear p < 0.05 by chance alone even with zero true skill. See the methodology page for the expected false-positive count. Blank when the mapped benchmark is in another currency. |
| Odds this outperformance is chance (10Y) alpha_pvalue_10y | Two-sided p-value of the alpha t-statistic against the t-distribution with n-2 degrees of freedom. | Lower | No multiple-comparisons correction is applied: screened across the full universe, roughly 5% of funds are expected to clear p < 0.05 by chance alone even with zero true skill. See the methodology page for the expected false-positive count. Blank when the mapped benchmark is in another currency. |
| Worst fall from a peak (10Y) max_drawdown_10y | Worst peak-to-trough fall in daily NAV, carried as a negative number: -12% is a milder fall than -40%, which is why a higher value is the better one. | Higher | Measured on daily NAV. The series starts at any NAV redenomination, so the step is never counted as a fall. |
| Return per unit of worst fall (10Y) calmar_10y | Trailing CAGR divided by the absolute maximum drawdown. | Higher | Unstable when the drawdown is small. |
| Score against similar funds score | Weighted percentile decomposition against the fund's own peer group, 0-100. Computed by the same scoring module GET /score/{scheme_code} returns in full. | Higher | A description of the past against a declared weight table, never a rating or a recommendation. It is a percentile inside one peer group, so it does not compare across groups: a fund scoring 80 among 34 small-cap funds and one scoring 60 among 16 US feeders are not ranked against each other. Blank where the peer group is too thin to rank in, or where the fund answers less than half the weight table. |
| How much of the score this fund could answer score_coverage | Share of the composite score's weight table this fund could answer; the score is renormalised over it. | Neither | A young fund answers less of the table, so its score rests on fewer measures. Below half the table no score is published at all. |
| Recent run, last year minus last month momentum_12_1 | Total return over the eleven months ending one month before the snapshot date. | Higher | The most recent month is deliberately left out: it carries a short-term reversal that says nothing about the manager. Blank below eleven months of history. |
| Annual fee, already deducted from returns expense_ratio | Total expense ratio for this scheme's plan, as disclosed by the AMC. | Lower | Matched to the scheme by name, since the disclosure carries no scheme code. The source covers only part of the industry, so a blank means not published, not zero. Returns already sit net of it, so it is not a second deduction. |
| How long this fund has existed fund_age_years | Years between the first and the latest NAV published for the scheme. | Neither | AMFI publishes no launch date; the first NAV date stands in for it. |
| Money in this exact plan (quarterly average) latest_aum | This is AMFI quarterly average AUM for this exact scheme variant, such as Direct Growth. | Neither | It is not a current month-end AUM and does not include related Direct/Regular or Growth/IDCW variants. |
| Total money in the fund, all plans aum_family_latest | Sum of latest_aum across every scheme code sharing this fund's fund_family_id (Direct/Regular, Growth/IDCW) - the figure comparable to a factsheet total. | Neither | Still AMFI's SEBI-standardised quarterly average, so it will not match a month-end factsheet figure. Null where no variant in the family has a reported AUM. |
| Change in fund size over a year aum_growth_4q | Growth in aum_family_latest over the last 4 AMFI-published quarters. | Neither | Needs 5 distinct quarterly AUM readings recorded for the fund's family; blank below that, such as for a fund newly tracked by this project. |
| Size compared with similar funds aum_percentile_in_sub_category | Percentile rank of aum_family_latest inside the fund's clean_sub_category, 1.0 being the largest fund. | Lower | Ranked on the family total, not this scheme code's own AUM. Requires the same minimum peer count as every other peer-relative metric; blank below it. |
| Price of one unit today latest_nav | Latest published net asset value. | Neither | For a matured scheme this is its final frozen NAV. |
| Charge for selling early exit_load_pct | Exit load charged on redemption inside the exit load period, per the SID. | Lower | Third-party enrichment, not AMFI. Blank when the source does not carry this scheme. |
| How long that early-exit charge applies exit_load_period_days | Days after purchase during which the exit load applies. | Neither | Third-party enrichment, not AMFI. Blank when the source does not carry this scheme. |
| Money cannot be withdrawn for lock_in_days | Mandatory lock-in period from purchase, such as for ELSS schemes. | Neither | Third-party enrichment, not AMFI. Blank when the source does not carry this scheme. |
| Smallest lump sum min_investment | Minimum lump-sum investment stated in the SID. | Neither | Third-party enrichment, not AMFI. Blank when the source does not carry this scheme. |
| Smallest monthly amount min_sip | Minimum monthly SIP instalment stated in the SID. | Neither | Third-party enrichment, not AMFI. Blank when the source does not carry this scheme. |
| Years the current manager has run it manager_tenure_years | Years since the current fund manager's stated start date, derived at query time. | Neither | Third-party enrichment, not AMFI. Blank when the source does not carry a start date. |
Sources and attribution
- Nav original
- AMFI (Association of Mutual Funds in India), public records
- Nav delivery
- TigZig MF NAV API (api.tigzig.com/mf/v1)
- Expense ratio
- AMFI's daily per-AMC TER disclosures (amfiindia.com/ter-of-mf-schemes), latest day per scheme; matched to schemes by name.
- Scheme attributes
- Riskometer, exit load, lock-in, minimum investment/SIP, SID benchmark and fund manager: a third-party candidate source, observed unreachable on first contact and not yet confirmed reliable. Never used in a return, risk or ranking - a screener filter or display value only, blank with a named reason wherever the source could not be reached or does not carry the fact.
- Attribution note
- TigZig reformats and republishes AMFI data; it is not an authoritative source and is not affiliated with AMFI.
Limitations
- Expense ratio comes from a separate scrape of AMFI's per-AMC TER disclosures, not from the NAV source. It is joined by exact fund name, covers part of the industry rather than all of it, and is blank wherever a fund was not published under a matching name or its disclosure contradicted itself.
- AUM is AMFI's quarterly average per scheme code, not month-end AUM for the whole fund.
- Scheme mergers and renames can split one economic fund across scheme codes.
- SEBI re-categorisation means a fund's sub-category today may not be the one it ran under.
- The default active-only universe excludes closed and merged schemes, biasing history upward.
- Riskometer, exit load, lock-in, minimums, SID benchmark and fund manager come from an unproven third-party source and are never a return, risk or ranking input; manager tenure is computed from the manager's start date at query time, never stored.
- Survivorship bias: this site publishes today's active schemes only, so historical screening here will not see funds that closed or merged. The API (
make api) keeps them, and "Survivorship bias, quantified" above shows how it measures the gap per category.