NSE·histdataOpen console

CAVEATS · 7 MIN READ

Trading holidays, settlement and missing dates

Why your export has gaps, why row counts differ between two stocks over the same range, and why the newest rows are missing delivery figures.

Ask for a full year and you will get roughly 245 to 250 rows, not 365. Ask for the same range for two different stocks and the row counts may not match each other either. And the newest rows will have empty delivery columns.

All three are expected. Here is what causes each, and what it means for analysis.

Why a year is about 250 rows

The arithmetic is simple:

  • 365 calendar days
  • minus roughly 104 weekend days
  • minus the exchange’s declared trading holidays

That leaves somewhere near 250 sessions. The exact figure changes each year, because Indian market holidays follow a mix of fixed-date and lunar-calendar festivals, and some fall on weekends in one year and midweek in the next.

Your export contains sessions, not calendar days. There is no row for a day the market was shut, because nothing happened. This is correct behaviour, not missing data.

The exchange publishes its holiday list annually, and it is the authoritative source — do not infer the calendar from your data.

One curiosity worth knowing: the exchange occasionally holds a short ceremonial session on Diwali, outside normal hours. It is a real trading session and produces a real row, often on a date the market is otherwise closed. If you find a lone session on an apparent holiday, that is usually the explanation.

Why two stocks give different row counts

This one surprises people, and it matters more than the holiday arithmetic because it silently breaks multi-stock analysis.

The market being open does not mean every stock traded. Reasons a specific stock is missing a date:

  • No trades at all. In genuinely illiquid stocks, whole sessions pass with nobody transacting. No trade, no row.
  • Suspension. Trading can be halted in a security for regulatory or compliance reasons, sometimes for extended periods.
  • Listing date. A stock listed partway through your range simply has no history before it.
  • Series changes. Movement between segments can affect which rows appear and how many rows exist per date. Details.

The practical consequence: never assume two exports align row for row. Pasting them side by side and comparing is the single most common way to produce confidently wrong analysis, because after the first missing date every subsequent comparison is off by a row and nothing looks obviously broken.

Always join on the date column. The mechanics are in the benchmarking guide and the portfolio tracker.

Settlement, and why delivery data lags

When you buy a share, the trade executes immediately but the shares arrive in your demat account on a later settlement day. Indian equity markets operate on a short rolling settlement cycle — T+1 has been the standard for equities in recent years, meaning settlement completes the business day after the trade, and the exchanges have since introduced even shorter optional cycles.

The detail that affects your data: delivery figures are a settlement output, not a trading output. The exchange knows the traded quantity the moment the session ends, but it only knows how much was actually delivered once settlement has been processed.

So in a fresh export:

  • Price, volume, turnover and trade count are present for every session including the most recent.
  • DELIVERY QTY and DELIVERY % may be blank for the newest rows.

Blank means not yet published — never zero. A formula treating blank as zero will report a dramatic collapse in delivery that did not occur. AVERAGE ignores blanks correctly; SUM divided by a hardcoded row count does not. Check which behaviour yours has.

Re-downloading the same range a few days later usually fills these in.

What gaps do to your calculations

Missing sessions are not neutral. They change what your formulas actually measure.

Moving averages span more time than you think

A 20-row moving average is twenty sessions — about four calendar weeks normally, but longer across a holiday cluster. In a stock that misses sessions to illiquidity, a 20-row average might span two calendar months. The window is constant in rows, never in time.

Returns across gaps cover more than a day

=H3/H2-1 gives the move from one row to the next. If those rows are a week apart, that is a weekly return sitting in a column labelled daily, and it will show up as an outlier in your volatility.

Check the actual spacing:

=A3-A2

Values of 1 and 3 are routine — the 3 is a weekend. Anything much larger is a holiday cluster or a genuine gap in that stock’s trading, and those rows deserve a look before you trust statistics computed over them.

Annualisation assumes a session count

The conventional SQRT(252) multiplier assumes roughly 252 trading days a year. For a stock that only traded 180 sessions, that factor is wrong. Count the actual sessions per year and use that figure instead.

Quick diagnostic checks

QuestionFormula
How many sessions did I get?=COUNT(A2:A1000)
Any unusually long gaps?=MAX(A3:A1000-A2:A999)
Where is the biggest gap?=IF(A3-A2>5,"GAP",""), filled down
Missing delivery rows?=COUNTBLANK(N2:N1000)
Duplicate dates?=SUMPRODUCT((COUNTIF(A2:A1000,A2:A1000)>1)*1)

Running these five before any analysis takes under a minute and catches most of the problems that otherwise surface as a conclusion that quietly does not hold.

Summary

  • ~250 rows a year is correct; the rest are weekends and holidays.
  • Different stocks legitimately have different session counts — always join on date, never paste side by side.
  • Blank delivery on recent rows is a settlement timing lag, not a zero.
  • Row-based windows measure sessions, not time, and gaps stretch them.

Related: what this dataset does and does not cover. Nothing here is investment advice — see the disclaimer.


Keep reading

Or go straight to the download console and pull a file.