BAF net equity from returns (route A): pre-registered specification
Written 2026-10-01, before any regression was run on fund data. Only the scheme list, AMFI category labels and dataset schemas had been looked at. Parameters follow common practice for returns-based style analysis (Sharpe 1992) and are not tuned on Indian data. Any change must be logged here with the date and the reason.
Question
How much net equity do balanced advantage and dynamic asset allocation funds (BAFs) actually carry, day by day, and does it move with market valuation as most of them say it does? Hedges matter here. A BAF can hold 70% gross equity and sell stock futures against 20% of it, which leaves about 50% net. Portfolio files show this only once a month, late, and only for the AMCs our scraper reaches. NAV returns show it every day, for every fund.
Universe
- BAFs: every AMFI scheme whose NAV-history category contains “Balanced Advantage” or “Dynamic Asset Allocation”. AMFI uses both spellings.
- Arbitrage funds (control): every scheme whose category contains “Arbitrage Fund”.
- Schemes, not plans. Plan codes are grouped into one scheme by AMC and by name with the plan and option words removed.
- One plan per scheme: direct growth. Before the direct plan’s first NAV (direct plans began in January 2013), the regular growth plan is used. Both plans hold the same portfolio, so the slopes are the same; the TER gap only shifts the intercept. IDCW and bonus options are never used.
Data
- Fund: AMFI daily NAV, all NAV-history eras from 2006-04, read through DuckDB filtered to the chosen plan codes.
- Equity factor: Nifty 50 TRI, repaired against the price index (
compute/assets.pypanel,asset_tri_daily.parquet). - Bond factor: NSE 5-year benchmark G-sec index from the same panel.
- A BAF’s debt sleeve is short to medium duration, plus arbitrage carry that behaves like cash.
- Cash has almost no daily variance, so it falls into the intercept.
- The 5-year G-sec is the most liquid rate factor with daily history back to 2001. No better short-duration daily index is in the warehouse, so it stays.
- Variant equity factor: Nifty 500 TRI.
Returns
- Log returns between consecutive dates on which the fund has a NAV and both indices have a level.
- Every series is measured over the same interval.
- An interval longer than 7 calendar days is dropped as a data gap.
- Bad NAV prints are removed before computing returns: a one-day move of more than 15% that reverses to within 3% inside five observations, the same rule as the ETF desk.
- Remaining log returns larger than 15% in absolute value are dropped. A BAF cannot move that much in a day.
Model
For each scheme and each date t, run OLS over the last W return observations ending at t:
r_fund = a + b_eq · r_equity + b_bond · r_gsec5 + e
- Estimated net equity = b_eq.
- Default: W = 60 sessions, with Nifty 50 TRI as the equity factor.
- Robustness: W = 120 (Nifty 50), and W = 60 with Nifty 500 TRI.
- Standard errors: classical OLS, reported for b_eq. With 60 daily observations the standard error is typically a few points; it is published next to the estimate.
- Minimum: a full window. No estimate is made from fewer than W observations.
Industry series
- Weights: each scheme’s quarterly average AUM from
amfi_aum_schemewise, summed over all its plans.- On date t, a scheme uses the latest quarter whose end is at least 45 days before t, so there is no look-ahead into AUM that was not yet published.
- Schemes without AUM get no weight in the weighted series.
- AUM-weighted mean of the 60-session b_eq across schemes with an estimate on that date, with the scheme count.
- Equal-weighted median, published next to it and labelled as such.
- Start: 2018-06-01.
- SEBI’s recategorisation took effect in mid-2018. Before it, the category labels are AMFI’s retrospective assignment of today’s schemes; schemes that closed before 2018 are missing; and some funds labelled BAF today were different products then (HDFC Balanced Advantage was HDFC Prudence, a balanced fund).
- Per-scheme estimates are still computed from launch and kept in the derived table.
- Weekly bundles: the last session of each week.
Valuation comparison
- Monthly data: month-end industry b_eq (AUM-weighted) against Nifty 50 trailing PE and CAPE (adjusted), from
valuation_nifty_50.parquet. - Reported:
- Pearson correlation of the levels, with n.
- Correlation of non-overlapping 3-month changes.
- Per scheme with at least 36 month-ends, the correlation of its own b_eq with PE (the median and the count of negative ones).
- What a valuation-driven allocation would look like: a clearly negative correlation, with net equity falling when PE rises.
- Levels are strongly autocorrelated, so the level correlation has far fewer effective observations than months. The change correlation is the cleaner test.
- Results are reported whatever their sign.
Validation against disclosed net equity
- Source: the Data bank’s
mf_scheme_exposure(route B, parked; see the Data bank’sdocs/MF_PORTFOLIOS.md).- Its
net_equity_pct= gross equity + signed stock and index futures + signed same-row derivative exposure, as % of NAV. - Options are excluded from it.
- Only monthly rows with
validation_statuspassed or warning are used.
- Its
- Matching: the AMFI code on the exposure row is matched to our scheme through its plan codes.
- Primary comparison: rows whose
derivative_disclosureis notnone(hedges visible in the file).- Estimate = 100 × the 60-session b_eq whose window ends on the last session on or before the portfolio date.
- Error = estimate − disclosed net equity, in points.
- Reported: n, the number of schemes, mean error (bias), median absolute error, RMSE, correlation, and the share within ±10 points.
- The same statistics are reported against disclosed gross equity. If the estimate tracks net more closely than gross, it is seeing the hedges.
- Diagnostic (not for publication as a live number): a centred window (30 sessions either side of the portfolio date). The disclosure is a point in time and a trailing window averages the previous three months, so the centred version shows how much of the error is timing.
- Rows with
derivative_disclosure = none: reported separately. Their disclosed “net” equals gross, so an estimate below it is expected and is not counted as error.
Arbitrage-fund control
- Arbitrage funds hold hedged equity: long cash stocks and short the same stocks’ futures. Their b_eq should be about 0.
- Reported: the median and the 5th to 95th percentile of 60-session b_eq across arbitrage schemes and dates from 2018-06, and the share with |b_eq| < 0.05.
- A material non-zero value would mean the method is broken: the dates are misaligned, or the factor or NAV timing is wrong.
Known biases (stated wherever the numbers appear)
- b_eq is a sensitivity to Nifty 50, not a holdings percentage.
- Mid and small caps have betas to Nifty 50 that differ from 1. Defensive large caps are below 1.
- Foreign stocks have a low same-day beta to Nifty.
- The Nifty 500 variant reduces the first problem, not the second.
- NAV timing. Domestic holdings are priced at the same close as the index. Foreign holdings are priced at earlier or later closes, which biases their beta down.
- Hedges net out, which is the point.
- A cash position hedged with futures on the same stock contributes nothing to b_eq, exactly as it should.
- Index futures or puts against a stock portfolio net out to the extent the portfolio tracks the index.
- Options are measured at their delta over the window, which the disclosed figures do not do.
- A 60-session window lags. It averages exposure over about three months, so a fund that cuts equity sharply shows the change gradually.
- Debt-sleeve rate risk is attributed to the G-sec factor. Credit-spread moves and the convexity of long bonds are not modelled.
- Survivorship before 2018: see the industry series above.
Outputs
funds/baf/industry_weeklyfunds/baf/schemes_latest- stat bundles under
funds/baf/stats/ - derived Parquet tables for each scheme and the industry
- a checks JSON with the validation and control statistics
Results log
(Filled in after the first run, below this line, without changing the specification above.)
Changes after the first run (logged 2026-10-01)
- PE series. The spec said “Nifty 50 trailing PE”. The raw
pe_ratiosteps down at NSE’s 2021 switch from standalone to consolidated earnings, so the comparison usespe_consolidated_basis, which is the same PE spliced across that switch (seecompute/valuation.py). The raw-PE correlation is still reported, for reference only. This corrects a data-basis error; it is not a choice among results. - Disclosure screen. Three AMCs’ parsed files plainly do not net their futures: their arbitrage funds disclose median “net equity” of 68% (ABSL), 145% (HDFC) and 38% (quant), where a hedged fund sits near zero. Their BAF rows are excluded from the primary validation statistics. The screen uses the arbitrage funds, not the BAFs being validated. The unscreened statistics are published next to the screened ones.
2026-10-01: first run (data to 2026-09-30)
- Coverage. 43 BAF / dynamic asset allocation schemes and 48 arbitrage schemes. 37 BAFs are live, with Rs 3.23 lakh crore of quarterly average AUM.
- Arbitrage control: passes. The median 60-session equity slope across 46 arbitrage schemes from 2018-06 is −0.014. The 5th to 95th percentile is −0.034 to +0.006, and 98.4% of scheme-days have |slope| < 0.05.
- The latest weeks drift up to a median of +0.07, the highest in the sample, during a 6% Nifty fall in Aug-Sep 2026. Watch this. It is still small next to BAF levels.
- Validation against disclosed net equity: passes, with a small downward bias.
- Sample: 26 BAF schemes with hedges in their files, 1,156 scheme-months, 2019-01 to 2026-08.
- Against disclosed net equity: mean error −3.4 points, median absolute error 4.9, RMSE 10.4, correlation 0.76, 77% within ±10 points.
- Against disclosed gross equity: median absolute error 19.1 and correlation 0.47. The estimate tracks net equity, not gross: it sees the hedges.
- Unscreened (all AMCs): median absolute error 5.4, RMSE 11.6.
- Arbitrage funds, screened: median absolute error 1.2 points, 99.9% within ±10.
- Diagnostic only: a centred window lowers the BAF median absolute error to 4.4, so part of the error is the trailing window’s lag.
- Nifty 500 as the factor: 4.8.
- Persistent per-scheme gaps. Edelweiss (−15.5 points) and ABSL (−16, screened out) are the largest. Both show option positions in their files. Options count in the slope (at their delta) but not in the disclosed net figure, which is bias 3 in the list above.
- Precision. The median standard error of the 60-session slope is 0.025 (0.017 at 120 sessions), and the median R² is 0.87. The 60- and 120-session estimates correlate at 0.93; the Nifty 50 and Nifty 500 versions at 0.97.
- Industry level (AUM-weighted, 60 sessions).
- 2018-06: 0.40.
- Peak of about 0.70 to 0.74 from late 2019 to 2020.
- Low of about 0.40 to 0.45 from late 2021 to 2023.
- 0.59 on 2026-09-30 (equal-weighted median 0.57).
- Valuation: no reliable industry-level link. The sign depends on the weighting and the measure.
- Monthly levels, 100 months:
- AUM-weighted vs PE: r = +0.03.
- AUM-weighted vs CAPE: −0.50.
- Equal-weighted median vs PE: −0.46.
- Equal-weighted median vs CAPE: +0.44.
- Non-overlapping 3-month changes (n = 33): AUM-weighted vs PE −0.04, vs CAPE −0.18; equal-weighted vs PE −0.23. None is distinguishable from zero at n = 33.
- Per scheme (32 schemes with 36+ months): 26 lean against PE (negative correlation), median r −0.22, 12 below −0.3.
- Read plainly: most individual BAFs cut equity somewhat when PE is high, but weakly. The industry aggregate, dominated by a few large funds with different models, does not move with valuation in any consistent way.
- Monthly levels, 100 months: