Data to 9 October 2026
About

Methods

Bond curves from reported trades

These are descriptive estimates of traded yield to maturity (YTM), not zero-coupon curves, executable quotes or valuation benchmarks. The first trade collection covers 10 September–9 October 2026. The separate RBI reference and auction sections are described below. No licensed CCIL, FBIL or FIMMDA valuation feed enters the reported-trade calculation.

Separate RBI reference and primary auctions

The /bonds/ page also shows RBI DBIE report 217, Month-end Yield of SGL Transactions in Government Dated Securities for Various Maturities, as a monthly sovereign YTM reference. It is not pooled with NSE trade estimates or used as a stale fallback for corporate spreads. Report 1368 is an alias of the same series and is not added. The first accepted snapshot contains 9,477 non-missing month/maturity observations from April 1996 through August 2026, with 30 one-year-spaced maturities in the latest month.

The sovereign series is published by RBI in DBIE. Dates, maturities, unique month/maturity keys and numeric yields are validated before use. Missing source values remain missing. Malformed values, infinities, duplicate keys and future observations fail acceptance. Values were checked against the RBIHub DBIE data service; all 9,477 shared observations reconciled within the publication’s four-decimal rounding. Failed updates preserve the last accepted data with its original observation date.

The monthly history is a latest-vintage descriptive history. Current source revisions may change old months; it is not a release-vintage archive suitable for backtests. It is never joined to earlier corporate trade dates. Current corporate spreads continue to use the contemporaneous NSE sovereign estimate from the same window. References older than 75 days are flagged.

Government and SDL auction observations come from RBI’s full auction-result releases. Rows retain auction date, release date, source retrieval time, security, issuer/state, source release URL, weighted-average yield, cut-off yield and notified amount in crores. Future auctions or unpublished releases are excluded; missing yields and out-of-range values are counted separately; duplicate auction/state/security keys fail the source. Green-bond security labels remain explicit. Neither auction yields nor issue amounts enter secondary-market curves or corporate spreads.

Latest auction results and the previous 35 calendar days are displayed separately for central government and SDLs; the complete accepted auction archive is downloadable as JSON. The SDL maturity plot uses only explicitly stated new-issue tenors and weighted-average yields on the latest auction date. A reissue’s maturity year cannot supply an exact date or remaining tenor, so it remains in the table and is omitted from this plot. State observations are labelled individually, with no pooled state auction curve. G-sec yields are shown by security because the local auction schema provides maturity years without exact redemption dates. Auction snapshots more than 14 days old are flagged.

The page is checked daily, while monthly sovereign values and auction results update at their source frequency. Observation dates, retrieval dates and collection gaps remain visible. These RBI views are independent of the secondary-market calculations and licensed valuation feeds.

Inputs and units

Raw files, retrieval times, hashes and source URLs are retained under .cache/ref/bond_trades. CDSL raw pages are retained alongside parsed snapshots. Source URLs are the exchange/depository endpoints, not licensed valuation feeds.

Eligible corporate observations

Require a fixed coupon, senior payment priority, explicitly absent put and call options, non-perpetual and non-convertible terms, no coupon step-up/down, full redemption, taxable status and no indicated redemption default. Missing fields fail eligibility. Partial-redemption/strip structures, market-linked bonds, subordinated debt, securitised debt and tax-free bonds do not enter the initial curve universe. Require a valid future maturity and reported positive yield no greater than 30%; these bounds reject malformed inputs, not economic outliers. Minimum daily traded value is ₹1 crore. Rejected observations and their reasons remain in the audit.

Reference snapshots are usable only on or after their collection date and for at most 30 days. Collection refreshes each held reference after seven days. Consequently the initial month of corporate trade history is a coverage audit; it is not silently reconstructed with today’s terms. Corporate curve history accumulates as reference snapshots become available.

Ratings

Retain agency-level records. NSE filings become usable at their broadcast date, never earlier than their rating date; our observations are end-of-day, not intraday. CDSL ratings become usable on their snapshot collection date, provided the rating date is not in the future. Only verified ratings no more than two years old qualify. Choose the latest known event per agency, then the lowest eligible grade across agencies. A withdrawal or unverified update does not resurrect an older agency rating. Unsupported structured-obligation, credit-enhancement and market-linked ratings keep the bond out of the rating curves. Missing ratings remain unknown; issuer reputation is never a substitute.

Minus and plus notches are preserved. Historical charts never apply a later rating to an earlier trade. CDSL verification status and dated NSE disclosures are imperfect source data; these filters reduce risk but do not establish that every underlying record is correct.

Windows and curve construction

Same-day observations use the chart date only. The recent view uses up to five observed sessions within ten calendar days, taking each bond’s most recent row before checking eligibility. Thus a new disqualifying observation cannot revive an older eligible one. A recent yield remains the yield observed on its trade date; we do not mark it to today’s market. Remaining maturity on the chart is measured from the chart date, and each observation’s age is shown.

Bucket centres are 0.25, 0.5, 1, 2, 3, 5, 7, 10, 15, 20, 30 and 40 years. Boundaries are 0, 0.375, 0.75, 1.5, 2.5, 4, 6, 8.5, 12.5, 17.5, 25, 35 and 50 years. The anchor’s horizontal position is its actual mean remaining maturity, not the named bucket centre.

For a government bucket, each bond has equal influence. For a corporate bucket, average the bond yields within each issuer, then average the issuer means. Apply those same issuer weights to the anchor maturity. Require at least three distinct bonds and three distinct issuers for a corporate curve anchor; this caps an issuer’s influence at one third. Smaller groups remain visible as observations. Ratings AAA, AA+ and AA are shown when observations exist, with optional financial/non-financial splits from the depository’s business-sector field. We do not infer PSU status from inconsistent issuer classifications.

Interpolate linearly between supported anchors; never extrapolate outside them cross an explicitly unsupported bucket or bridge a gap greater than ten years. The chart shows standard-tenor estimates only where supported. The government fit can still reflect coupon and liquidity differences; this is a traded-YTM curve, not a cash-flow discount curve.

Corporate spread is the bucket yield minus the sovereign estimate at that bucket’s actual mean maturity, using the same observation window, multiplied by 100 to give basis points. Missing sovereign support leaves the spread blank. It is an indicative maturity-matched YTM spread, not a Z-spread or option-adjusted spread. Within-rating differences also reflect sector, security, liquidity and coupon composition.

Daily refresh and failures

uv run python -m tipsheet.ops.bond_daily --days 7 --enrich 40 collects, computes and writes bundles. Its lock prevents overlapping local runs. It rechecks recent dated files for revisions and retains hashes/provenance. Ratings bootstrap from January 2025 once and subsequently overlap the previous week, retaining older records. A fixed CDSL request budget prioritises recently traded bonds by turnover, with one request per second and a stop on an HTTP refusal. This introduces coverage selection: the eligible universe is not representative of all corporate bonds.

The collector also opens BSE once per run and validates the report against its repository before replacing accepted raw data. It needs Node, the existing site Playwright dependency and Chrome/Chromium; these are available locally and prepared in the staged workflow. A blocked or stale BSE response remains a visible collection gap.

The local timer runs weekdays at 20:45 IST and Tuesday–Saturday at 08:15 IST for catch-up, including a run after a missed trigger. Cloud collection is wired into E1/M1/W1 in refresh.yml; those changes take effect when this code reaches the cloud’s branch. Existing R2 cache handling carries .cache/ref between cloud runs. Neither the local job nor this source collector deploys a website.

Unavailable weekday files remain gaps and are retried; they are not declared holidays or zero-volume days. The report distinguishes collection date from last available trade date, records parser and fetch failures, and reports each exclusion. Missing reference fields leave bonds out. A collection or parse failure does not invent observations. The page hides unsupported curves and exposes underlying ISINs, dates, yields, turnover and references.

Validation

Tests cover file dates, duplicate ISINs, units, WDM join ambiguity and trade-type filtering, rating notches and future/withdrawn ratings, CDSL identity checks, incomplete/complex terms, issuer weighting, stale windows, disqualifying updates, unsupported interpolation, BSE date/schema/units, accepted settlement statuses, non-YTM and flagged-yield exclusions, repository reconciliation, whitespace in ISINs, and cross-venue precedence. The first live archive parse is audited separately in docs/STATUS.md with measured coverage. Numerical fits are not claims of investable returns or fair value.

This note is the repository file docs/methods/bond_curves.md, rendered as-is.