bhavcopy
nse/ · bse/.parquetRaw end-of-day OHLCV straight from official SEBI CMTS bhavcopy. Cleaned, deduped, typed.
TejHQ starts from the raw NSE and BSE bhavcopy and ships what nobody else gives away: closes back-adjusted for splits, bonuses and dividends, keyed by ISIN so a series survives renames and mergers, and a monthly liquid universe built point-in-time so delisted names stay in the months they qualified for. Parquet on HuggingFace every trading day, keyless API on top, MIT.
One row per (symbol, date). Hive-partitioned Parquet, zstd-compressed. Polars, DuckDB, Pandas: whichever you already use.
| source | you get | you do not |
|---|---|---|
| Kite Connect historical | Broker candles over an API | Needs a trading account. Terms restrict redistribution. No corporate actions, ISIN continuity or point-in-time universe. |
| nsepy, jugaad-data | Raw bhavcopy through a scraper | No corporate actions, adjustment, ISIN continuity or point-in-time universe. You own the breakage when the exchange changes its site. |
| TrueData and other vendors | Cleaned feeds, support desk | Per-seat and closed. You cannot redistribute what you pull. |
| TejHQ | Raw bhavcopy, actions, adjusted close with ISIN continuity, point-in-time universe. MIT, redistributable. | Intraday. It is EOD only. Adjusted prices need a free key, universes need Pro. |
import polars as pl
from huggingface_hub import hf_hub_download
p = hf_hub_download(
"tejhq/indian-markets",
"nse/year=2026/nse_2026.parquet",
repo_type="dataset",
)
df = pl.read_parquet(p)
df.filter(
(pl.col("date") == pl.date(2026, 9, 7))
& pl.col("symbol").is_in(["RELIANCE", "TCS"])
).select("symbol", "close")
# RELIANCE 1309.5, TCS 2270.0| symbol | series | isin | close | volume | %chg |
|---|---|---|---|---|---|
| RELIANCE | EQ | INE002A01018 | 1309.50 | 10.2M | -0.95% |
| TCS | EQ | INE467B01029 | 2270.00 | 2.3M | -1.48% |
| HDFCBANK | EQ | INE040A01034 | 710.50 | 12.2M | -0.22% |
| INFY | EQ | INE009A01021 | 1087.50 | 7.7M | -3.76% |
| ITC | EQ | INE154A01025 | 263.50 | 6.7M | -0.23% |
| BHARTIARTL | EQ | INE397D01024 | 1854.00 | 6.0M | +0.76% |
tej-bazaar, the open pipeline, publishes six parquet trees to HuggingFace every trading day. Each one composes with the next. Same partitions, same keys, same guarantees.
nse/ · bse/.parquetRaw end-of-day OHLCV straight from official SEBI CMTS bhavcopy. Cleaned, deduped, typed.
actions/<ex>_<YYYY>.parquetCorporate actions classified - dividend, split, bonus, rights, buyback, demerger, merger.
prices_adjusted/<ex>_<YYYY>.parquetBack-adjusted close. Reverse cumprod over splits, bonuses, dividends, per instrument chain across ISIN changes. Reconciled vs Yahoo.
symbol_history/<ex>.parquetISIN to symbol intervals. Resolves rename drift across post-merger or pre-split identifiers.
metrics/<ex>_<YYYY>.parquet1d/5d/21d/63d/126d/252d/YTD returns, 52w hi/lo, 20d & 60d avg volume, 20d avg turnover.
universe/<ex>_liquid.parquetMonthly top-500 by trailing 63-day turnover, ranked with only data available on each rebalance date. Delisted names stay in the months they qualified for.
fundamentals/<ex>_<YYYY>.parquetISIN-keyed filings: revenue, EBITDA, EPS, net debt. Joins to every other tree on ISIN.
Adjusted close reconciles within ±1% of Yahoo Finance on 96.9% of 25,329 daily comparisons across 48 large NSE names. Forty-six of them sit at 99% or above. The two that do not are Yahoo disagreeing with the exchange: a bonus Yahoo dates five months early, and a demerger Yahoo scales for while NSE convention leaves it alone. Per-symbol report →
Same shape across NSE and BSE, every trading day, every symbol. ISIN-keyed, series-tagged, types locked. No guessing what last means in row 47,231.
One dataset, four shapes of work. Pick yours - the snippet drops straight in.
Stop paying for stale tickers.
Build factor models on every NSE+BSE equity, not just NIFTY 50. Cross-sectional research, no licence chatter.
df.group_by("symbol")
.agg(pl.col("close").pct_change())Walk-forward without scraping.
One parquet per year, sorted by (symbol, date) - filter a date range, get exactly the universe that traded those days.
df.filter(pl.col("date")
.is_between(D0, D1))Same shape your model already eats.
Parquet → DataFrame → tensor. ISIN-keyed joins to fundamentals, news, alt data. No ETL boilerplate.
ds = HF.load("tejhq/indian-markets")
model.fit(ds.to_torch())Ship a chart in an afternoon.
DuckDB-over-HTTP, no server. Streamlit, Observable, Grafana - whatever renders SQL, renders TejHQ.
SELECT date, close
FROM 'hf://.../**/*.parquet'
WHERE symbol = 'RELIANCE'tej-bazaar parquet on HuggingFace, MIT, forever. Paid tiers fund the cron and the servers. Early customers are onboarded by hand: email us, we reply and switch your key the same day.
The whole dataset. No signup.
Researchers · students · hackers
Sign in by email, get a key in a minute.
Solo quants · indie devs · students
Built for the strategy you actually trade.
Active backtesters · prop traders · small RIAs
Several people, one invoice.
Small funds · fintech teams · research desks
The pipeline is MIT and the source is the exchange's own bhavcopy. Nothing here depends on us staying in business: clone tej-bazaar, backfill from 2010-01-04, and the same parquet is on your own disk.
git clone https://github.com/tejhq/tej-bazaar && cd tej-bazaar
pip install -e .
tej-bazaar backfill --from 2010-01-04 --to $(date +%F) --exchange NSE
tej-bazaar backfill --from 2024-07-08 --to $(date +%F) --exchange BSEFunds, brokerages, exchanges, fintech infra. Talk to us about volume, white-label, on-prem mirrors, and custom data partnerships.
Talk to foundersBazaar ingests it. CLI fetches it. API serves it. Same schema, same partitions, same guarantees end-to-end.
Bhavcopy + corp actions + back-adjusted close + symbol history + derived metrics + liquidity universe. Six parquet trees, one weekday cron, all on HuggingFace.
pip install tejhq or npm install tejhq. Same surface in Python and TypeScript, zero runtime dependencies, plain rows that drop straight into polars, pandas, or a chart.
Hosted REST over the six trees. Keyless free tier served from the edge, free key for adjusted prices, Pro for universes, metrics, batch and resolve.