Economy models: methods
The cross-dimension measures behind the economy portal’s front door, which asks “How is India’s economy doing?”
Code: pipeline/tipsheet/compute/economy_common.py (shared conventions), economy_registry.py (the indicator registry and scorecard), economy_breadth.py (M4), economy_composites.py (M5a), economy_liquidity.py (M9), economy_fci.py (M8); bundles in publish/economy_models.py; steps in steps/economy_models.py.
Tests: pipeline/tests/test_economy_registry.py, test_economy_breadth.py, test_economy_composites.py, test_economy_liquidity.py, test_economy_fci.py.
Bundles: economy/models/scorecard, economy/models/readings/<dimension>, economy/models/breadth, economy/models/breadth_facts, economy/models/activity, economy/models/inflation, economy/models/composites_facts, economy/models/liquidity_daily, economy/models/liquidity_monthly, economy/models/liquidity_facts, economy/models/fci, economy/models/fci_facts.
Build record: docs/plans/economy_portal/status/econ-models.md.
One convention: a reading against its own history
Every measure here compares an indicator with its own past, in the same units:
- robust z = (reading − median) / (1.4826 × median absolute deviation); the 1.4826 makes the MAD comparable to a standard deviation for normally distributed data;
- the reference is earlier readings only, never the reading itself or anything later;
- April 2020 to March 2022 never enter a reference window: the lockdowns, and a year later their base effects, swung every series far outside its range. Those months still get a z of their own;
- two windows. z36: the 36 previous readings (12 for a quarterly series), at least 18 months’ worth, the rule Pulse colours by. zlong: every reading since January 2013, at least 24 months’ worth (econvitals’ convention).
z36 is the headline. Several Indian series are maturing fast (UPI, card payments, EPF membership), and an expanding window would read their natural slowing as weakness. The cost: after three weak years, an ordinary reading looks strong. zlong is published beside it, so a reader can see when the two disagree.
The indicator registry
INDICATORS in economy_registry.py holds 60 indicators across the ten dimensions of the portal plan (§10). For each it records:
| Field | Meaning |
|---|---|
| dimension | Growth, Prices, Jobs and incomes, Households, Business and investment, Money and credit, Government, External, Rural and agriculture, States |
| source | the publisher; everything comes through the Data bank |
| freq | monthly, bimonthly (RBI’s household surveys) or quarterly |
| reading | what the number is: growth on a year earlier for amounts and indices; the level for rates, survey indices and spreads |
| polarity, sign | “stronger” (activity), “hotter” (prices) or none; sign −1 where a lower reading is stronger (unemployment) |
| lag_days | the publisher’s usual delay after the period ends, from release calendars (MoSPI, RBI, GSTN) and checked against what was held on 2026-10-24 |
| composite | the activity or inflation theme the indicator feeds (M5a), if any |
| rbi_level | the reading is RBI’s own published level (survey indices, survey medians): the page charts it but offers no table, CSV or JSON |
Indicators with no good or bad side carry no polarity: broad money, the real repo rate, the call rate against repo, lending spreads, the rupee’s real effective rate, RBI’s dollar purchases, government borrowing, and what states pay over the centre. They appear in the scorecard and are left out of breadth and of the composites.
Sources and licences
The readings come from tables other steps already build (Pulse, /macro/, /rbi/, /macro/credit/, /economy/bonds/), from Data bank datasets (GST state collections, Vahan), and from India Data Hub series. An IDH series is read only when IDH names a public publisher (RBI, MoSPI, EPFO, GSTN, Grid-India, PPAC, NPCI, NSDL). economy_common.idh raises an error if a caller asks for an FBIL, FIMMDA or CCIL series, or for one IDH builds itself (its rupee index, its CP and CD curves), so a withheld figure cannot slip in through a new registry line.
Notes on particular readings
- Bank credit to sectors (personal loans, industry, agriculture): RBI’s own published growth from its monthly sectoral-deployment workbooks (Data bank
rbi_sectoral_credit, to August 2026), the newest release’s figure for each reporting date. Where the workbooks are not held (2019 to 2021 in part, and 2021 to 2023), growth comes from India Data Hub’s levels, each month’s last reporting date against the same month a year earlier. For July 2023 to June 2024, the year after HDFC’s merger, RBI’s merger-adjusted series is used, because the headline counts HDFC’s book in one year only. After June 2024 it is not used: both years then include HDFC, and India Data Hub’s adjusted series (which runs to November 2025) overstates personal-loan growth by 2 to 3 pp against RBI’s published figure. Outside the merger year, growth from IDH’s levels matches RBI’s to within 0.1 pp in 88% (agriculture), 67% (personal loans) and 61% (industry) of the 33 months both hold. Gaps above 0.5 pp fall in late 2020 for all three, and for industry also in December 2022, July to September 2024 and December 2025. RBI’s figure is used in every month it exists. - States: the share of states and UTs whose GST collections (CGST + SGST + IGST, cess left out) or vehicle registrations grew on a year earlier, counted only where both months are positive and at least 20 states report. Vahan begins in 2012, after most states had joined it.
- GST is GSTN’s state-wise statistics workbook, which runs about two months behind the press release (the 2026-27 file held on 23 October 2026 ran to August). The lag in the registry is 55 days.
- Exports and imports: the commerce ministry’s quick estimate is out about 15 days after the month, and that is the lag used. The value held is RBI’s later figure (DBIE), which may differ slightly from the quick estimate.
- Averages of daily or weekly data (the call rate against repo, SDL spreads) leave out a month that the data do not yet reach the end of.
- PLFS monthly (unemployment, participation) begins in January 2025. With fewer than 18 months, it has no reading against its history; the scorecard shows the level and a blank z.
Stale readings, and why
A reading is stale when its period ended more than its usual lag plus a grace period ago (45 days for monthly series, 75 for bimonthly, 100 for quarterly). Each stale row carries stale_reason:
expected_latest: the newest period the publisher’s usual lag says should be out;input_latest: the newest period of the indicator’s own input (its Pulse level, or the India Data Hub series itself);databank_latest: the newest row of the whole Data bank dataset, any series in it (a coarse pointer; blank for DBIE report snapshots, which are not traced);verdict: base_gap (the input has newer periods but no figure a year earlier to grow from: a gap at source a year ago), pipeline (the IDH series holds newer data than the derived table the reading comes from: rerun or fix that step), source (checked at the publisher, which has released nothing newer), or ingestion (nothing newer is held: route to the data session);source_status: what was found at the publisher, checked by hand, with the date of the check.
Checked on 2026-10-24: EPF contributing members (weekly) run to October 2026, but the weeks a year earlier are missing at source after May, so growth stops in May 2026 (base_gap). EPFO’s monthly payroll release has not appeared since July 2025 (source). Sectoral credit, stale while it read India Data Hub’s copy (to April 2026), now reads RBI’s workbooks and is current to August 2026.
Checked against the publisher
- WPI, September 2026 (checked 2026-10-24). The registry reads 11.39% for the headline and 25.85% for fuel and power. The Office of the Economic Adviser’s provisional release of 14 October 2026 gives 11.39% and 25.85%, with index levels of 112.5 (all commodities) and 110.5 (fuel and power), against 101.0 and 87.8 a year earlier (OEA press release, PIB). Manufactured products (9.76%) and primary articles (8.67%) also match. The MoSPI audit had flagged hierarchy labels shifted on the 2022-23 base, so the labels were tested too: in all 42 months of the new base, the headline index equals a fixed weighting of the three major groups (primary 22.9%, fuel and power 14.1%, manufactured 63.1%; the weights sum to 1.000 and the largest miss is 0.05 index points). A mislabelled group would break that identity. September’s figure is provisional (weighted response rate 83.4%) and is revised two months later.
The scorecard (economy/models/scorecard)
One row per indicator: the latest period and reading, the reading before it and a year earlier, z36 and zlong, z36_directed (signed so that positive means stronger or hotter), the state in words (within ±0.5: “about usual”; otherwise stronger, weaker, hotter, cooler, higher or lower than usual), the percentile of the latest reading in the indicator’s full history (lockdown months left out), the last two years of readings, and the stale flag and reason. dimensions[] counts, for each dimension, the directional readings that are current, how many are beyond +0.5 and −0.5, and lists the missing, stale and history-less indicators. Missing inputs are listed, never silently dropped.
The scorecard reads each indicator’s newest reading held now. It is not point-in-time; breadth is.
Economy breadth, M4 (economy/models/breadth)
Question: how much of the economy is improving, and is that broad or narrow?
At the end of every month from January 2008 (plus the current month so far), each directional indicator contributes its newest reading that its publisher had released by that day (period end plus the usual lag). A reading older than its lag plus the grace period is dropped, so a series that stopped (EPFO) does not keep voting.
- Improving: the latest three months’ average reading is above the three months before. For a bimonthly survey, the latest round against the one before (if within four months). For a quarterly series, the latest quarter against the one before. All are signed so that up is stronger, so rising unemployment counts as worsening.
- Diffusion: the share with z36 above +0.5, less the share below −0.5.
- Overall breadth uses the “stronger” indicators. Price indicators are counted on their own as the share heating: cooler inflation is not unambiguously better, and mixing the two would make a disinflation look like a boom.
- By dimension, with the count of indicators behind each share. Months with fewer than 10 indicators are flagged
thin. Coverage grows from 14 indicators in 2008 to about 36 since 2022, so early shares are coarser; comparisons across decades should keep that in mind.
Limits, stated on the page:
- the lags are each publisher’s usual lag, not the actual date of each release;
- the values are today’s vintage, so revisions made after a release are already in. The Data bank keeps vintages only from mid-2026, so the history is pseudo-real-time;
- “improving” says the direction of the last three months, not the level: an economy can be improving from a weak place.
Validation (C63, pre-registered, run 2026-10-24): a null. Breadth at a quarter’s end barely correlates with that quarter’s GVA acceleration (+0.08, 95% interval −0.03 to +0.30) or the next quarter’s (−0.12). Present breadth as a description of the indicators, never as a read on GDP. Details in the Results log of docs/research/site_calculations_spec.md.
Activity and inflation composites, M5a (economy/models/activity, economy/models/inflation)
Question: is the economy running hot or cold against its own recent past, and what moved it?
econvitals’ method, adapted to India:
- each indicator’s z against its own history (z36 for the headline; zlong for the
_longversion), capped at ±4 so that one extreme series cannot carry a theme alone (WPI’s z of 6.9 in September 2026 enters as 4); - an equal-weight mean of the indicators within each theme;
- an equal-weight mean of the themes present that month. A theme’s contribution is its mean divided by the number of themes present, so the contributions add up to the composite.
| Composite | Themes and indicators |
|---|---|
| Activity | Industry (IIP, core industries, cement, steel); Transport and energy (electricity, e-way bills, diesel, FASTag, major-port cargo); Spending (UPI payments to merchants, credit cards, car and two-wheeler registrations, air passengers); Taxes (GST); Trade (exports, imports); Credit (bank credit); Jobs (new ESIC subscribers) |
| Inflation | Headline (CPI); Core (CPI excluding food and fuel); Food (CPI food); Producer prices (WPI, WPI manufactured); Expectations (households’ inflation expected a year ahead) |
The composites differ from econvitals’ in three ways, each for an Indian reason:
- No services or labour-market survey block. PMI is licensed, and PLFS’s monthly series is too short for a z. New ESIC subscribers stand in for formal hiring.
- Imports count as activity. They rise with demand at home.
- Inflation uses growth on a year earlier, not 3-month annualised rates. No seasonally adjusted CPI is held yet. An X-13 run with an Indian festival calendar is in the plan’s shared infrastructure; when it exists, the inflation composite switches to 3-month annualised rates and the switch is dated here.
The composites are built by reference month. August’s value uses August’s readings, whenever they were published. So the newest months rest on the fast indicators only: n_indicators, n_themes and partial (some theme has no reading yet) say so, and composites_facts.<kind>.complete_through is the last month every theme reports. Lead with that month; show later months as an early read. The bimonthly expectations survey stands for its own month and the next.
Coverage grows over time. Before 2012 the inflation composite is headline CPI alone (one theme), and the activity composite has 9 or 10 indicators in four themes until 2019. The page should start the inflation chart in July 2013, the first month four or more themes report. Lockdown months get values of their own (−2.0 for activity in July 2020); they are kept out only of the reference windows.
A reading of +1 means the indicators, on average, sit one robust standard deviation above their own last three years. It is not a growth rate or an inflation rate, and the scale is not comparable with the RBI’s or econvitals’ indices.
Validation (C62, run 2026-10-24): fails. The composite correlates with real GVA growth at 0.46 (Q1 FY14 to Q1 FY27, FY21–22 left out), but IIP alone gives 0.72, and the bootstrap interval of the difference (−0.48 to −0.06) says the composite is reliably worse. It is a measure of the indicators against their own past, not a GDP tracker, and must not be presented as one.
Liquidity tracker, M9 (economy/models/liquidity_*)
Question: is the banking system flush with cash or short of it, and is RBI adding or draining?
Source. RBI’s daily Money Market Operations release. From 31 March 2022 the tracker reads RBI’s own table (Data bank rbi_money_market_operations, each release reconciled by econ-data to its printed totals); before then, and on any day that table lacks, it reads India Data Hub’s mirror of the same release (RBI the publisher of every series used). When the dataset is absent from the warehouse (latest_snapshot returns None, as in a first cloud build), IDH is read throughout. Every day carries its source (rbi_mmo or idh); the daily bundle has official (1 or 0), the monthly official_share, and the facts list the stretches in sources, which the pages quote.
How RBI’s headings map to the parts: SDF and MSF by the heading’s last item, today’s and outstanding added; variable-rate repo and reverse repo of every tenor (the 2024-25 long-term variable-rate repos included); long-term, targeted and special long-term repos (LTRO, TLTRO, SLTRO) as fixed-rate repo, as IDH counts them, so the series does not jump where the source changes; several auctions under one heading on a day add up; a reserve position printed twice in one release takes the first (the day’s own). Checked against IDH over the 1,603 days both hold (31 March 2022 to 22 October 2026): every part agrees to the rupee on 1,600. The exceptions: 16 May 2022 and 30 September 2026, where RBI’s printed net injection differs from IDH’s by ₹42,462 and ₹1,513 crore (RBI’s figure is used); and 23 December 2024, where RBI prints a ₹1.5 lakh crore fine-tuning operation without saying whether it was a repo or a reverse repo, which IDH counts as variable-rate repo and this reader leaves in other_net_cr (the net total is unaffected). RBI’s table also has four days IDH lacks.
Measures, daily:
- Net injection (+) or absorption (−): today’s operations plus term operations still outstanding, as RBI’s release prints it. Negative means banks have surplus cash parked with RBI.
- The parts: the standing deposit facility (SDF, the corridor’s floor), the marginal standing facility (MSF, its ceiling: banks borrowing at a penalty rate), the standing liquidity facility, variable- and fixed-rate repo and reverse repo. Each is today’s operation plus what is outstanding from earlier ones.
other_net_cris the difference between RBI’s total and the named parts; it has been zero on every day since 2018, so the parts account for the whole. - Banks’ reserves: cash balances with RBI less the average daily requirement for the fortnight. The requirement is met on average over the fortnight, so a single day can sit below it.
- Scaled: net injection as a share of scheduled commercial banks’ deposits known that day (each fortnight’s figure is taken as known two weeks after its date). This stands in for NDTL, against which RBI states its comfort range.
- The price: the weighted average call rate (WACR) and TREPS against the repo rate, and where WACR sits in the corridor: 0 at the SDF rate, 100 at the MSF rate, 50 at the repo rate when the corridor is symmetric.
Monthly: averages of the daily figures, the share of days in surplus, and the number of days held (the current month is partial).
Licences. The ₹ crore amounts and the policy and market rates are RBI’s own figures. The bundles carry rbi_level: true, so pages chart them with no table, CSV or JSON. The share of deposits, the spreads to repo and the corridor position are derived and may be downloaded. No FBIL, FIMMDA or CCIL rate is used; the call rate, TREPS and market repo rates are RBI’s.
Not yet built (models.md M9): the weekly decomposition into currency demand, government cash balances, RBI’s FX operations and OMOs, and the look-ahead calendar of tax dates. Both need RBI’s weekly statistical supplement tables, which econ-data plans to refresh weekly. IDH’s “government surplus cash balance reckoned for auction” is not the government’s cash balance (it is zero on most days), so it is not used as one.
India financial conditions index, M8 (economy/models/fci)
Question: are money, bond, credit, equity and currency markets helping or hurting growth? Positive means tighter than usual.
The design follows the RBI’s own index (Bandyopadhyay, Kumar, Kumar and Bhattacharyya, “Financial Conditions Index for India: A High-Frequency Approach”, RBI Bulletin, June 2025): indicators standardised against their history since 2012, positive for tight. It is built from inputs the site may publish. It is monthly, because several RBI inputs are monthly.
| Group | Inputs (signed so that up is tighter) | Publisher | From |
|---|---|---|---|
| Money | call rate less repo; 91-day T-bill auction cut-off less repo; CD rates less repo (midpoint of the fortnight’s range); real repo rate (repo less CPI inflation) | RBI; MoSPI | 2005; 2019; 2001; 2001 |
| Bonds | 10-year G-sec yield at month-end; real 10-year yield | RBI (DBIE report 217); MoSPI | 1996; 2001 |
| Credit | lending rate on new rupee loans | RBI | Sep 2014 |
| Equity | Nifty 50 three-month return (falling is tighter); realised volatility | NSE (returns only, never levels) | 1990 |
| Currency | rupee’s 40-currency nominal effective rate, change on a year (appreciation is tighter); rupee-dollar realised volatility | RBI; ECB reference rates | 2005; 2000 |
- Standardised: each input’s robust z against its own readings from January 2012 to the month before (at least 24; lockdown months out of the reference), capped at ±4. The index therefore starts in January 2014.
- Weights: the mean within each group, then the mean of the groups present, if at least three are. Group contributions add up to the index.
- Not used: FBIL, FIMMDA and CCIL figures (withheld): no FBIL G-sec curve, no FIMMDA corporate spreads, no CCIL rupee rate. Exchange-traded corporate bond spreads begin only in September 2026; they join the credit group when they have two years of history. India VIX is not held, so realised volatility stands in.
- Lending rate, level not spread: the first build used the lending rate less repo. That spread narrows whenever RBI raises rates, because lending rates follow with a lag, so the index read the 2022-23 hikes as easing. The level is used instead (amendment 7 in the pre-registration file, made before any outcome was computed).
- Credit growth is left out of the headline: it is a quantity the conditions act on, and C61 tests whether the index precedes it.
fci_with_creditadds it as a sixth group. fci_asof: the headline as it could have been computed at each month-end, each input at its newest month released by then (usual lags: lending rates 35 days, month-end yields 30, NEER 40, CPI-based inputs 12). C60 and C61 use it.
Reading it. The level is measured against 2012 onwards, which includes the high-rate years 2012-14, so much of the last decade reads as loose. Changes are as informative as levels. Checked against episodes: the index tightened from +0.15 in September 2018 to +0.55 in December 2018 (IL&FS and the NBFC funding squeeze), was +0.36 in March 2020, and tightened by more than one unit from March 2022 (−1.27) to March 2023 (−0.12) as RBI raised rates.
Validation (C60, C61, run 2026-10-24): nulls. A tightening does not precede slower IIP growth (six-month slope −0.31, t −0.39; the sign is negative at every horizon but nothing is significant, and the term spread does as well) or slower bank credit growth (slope +0.09, t +0.09). The index describes conditions; it is not shown to forecast activity, and the page must not say it does.