Two dates the market talks about every year

The first seasonality post tested calendar months. This one tests two dates that are specifically Indian and come with a lot of commentary:

  • Union Budget day. Every year TV channels run “Budget-day market” specials, and there’s a popular belief that the market usually falls on the day, or at least moves a lot.
  • Muhurat trading. On Diwali evening, the exchanges hold a special session of about an hour, traditionally seen as an auspicious start to the new year. Some investors buy a token amount for luck, and a common line is that the market “usually closes green” in that session.

Both are claims about a specific date, so they need correct dates. That turns out to be half the work.

Getting the dates right

A test on the wrong dates is worse than no test. So every date here comes from a primary source, checked in September 2026:

  • Budget dates come from the date printed on each Budget speech on indiabudget.gov.in (for 2008, the Press Information Bureau’s release of that day). That’s 23 Budgets from 2008 to 2026, including the interim Budgets in election years and the full Budgets that followed them.
  • Weekend Budgets were presented on a Saturday or Sunday 4 times. For each, NSE issued a circular announcing a live trading session that day: NSE/CMTR/28939 (for 28 February 2015), NSE/CMTR/43290 (1 February 2020), NSE/CMTR/65729 (1 February 2025) and NSE/CMTR/72349 (1 February 2026).
  • Muhurat sessions come from NSE’s equity-segment circulars, one per year, 18 sessions from 2008 to 2025. They’re listed in full further down.

Then we check what the price file actually contains. The Nifty data here is the Nifty 50 price index from Yahoo Finance, 17 September 2007 to 30 March 2026. It has no row for 4 of the Budget days, and none for 12 of the 18 Muhurat sessions. Many of these are weekend sessions the feed skipped. Every missing date is listed below rather than quietly dropped.

The formula

Event-day move = Nifty close on the event day / previous close − 1

Compared with every trading day in the file:
   size:       average |move| on event days  vs  average |move| on all days
   direction:  rises and falls on event days  vs  share of all days that rose

Shuffle test: draw the same number of random trading days 10,000 times.
   How often is a random set at least as extreme as the event days?

Budget day: bigger moves, not a reliable direction

Across 4,545 trading days, the Nifty’s average move (up or down) was 0.86%, and it rose on 53% of days. The 19 Budget days with a row in the file:

Item Budget days All days
Days 19 4,545
Average size of the move, up or down 1.39% 0.86%
Median size of the move 1.14% 0.59%
Rose 6 of 19 (32%) 53%
Average move −0.3% 0.04%

Nifty's move on each Budget day

Nifty 50 price index. Source: Yahoo Finance. Historical data, for illustration only.

Size. Budget days moved more than ordinary days. In the shuffle test, only 2.5% of random sets of 19 days had an average move as large. That is the one result in this post that looks reasonably solid. But there’s a catch. Two of the biggest moves came in 2009, when every day was volatile. So we also compared each Budget day with the average move of the 20 sessions before it. Budget days were bigger than their own recent average 10 times out of 19 (53%). For all days the figure is 42%. So the effect survives the check, but it’s smaller than the raw averages suggest.

Direction. 13 falls and 6 rises. In the shuffle test, 5% of random sets of 19 days had at least as many falls. That’s worth noticing, but it isn’t much to go on. It’s 19 days. The biggest fall (6 July 2009, down 5.84%) and the biggest rise (1 February 2021, up 4.74%) both sit in the table. And “Budget day tends to fall” would not have told you which kind of year you were in.

Date Day Budget Nifty move Bigger than this % of all days
2008-02-29 Friday Full −1.17% 77%
2009-02-16 Monday Interim −3.39% 97%
2009-07-06 Monday Full −5.84% 100%
2010-02-26 Friday Full 1.29% 80%
2011-02-28 Monday Full 0.56% 48%
2012-03-16 Friday Full −1.16% 77%
2013-02-28 Thursday Full −1.79% 89%
2014-07-10 Thursday Full −0.23% 22%
2016-02-29 Monday Full −0.61% 51%
2017-02-01 Wednesday Full 1.81% 89%
2018-02-01 Thursday Full −0.1% 10%
2019-02-01 Friday Interim 0.58% 49%
2019-07-05 Friday Full −1.14% 76%
2021-02-01 Monday Full 4.74% 99%
2022-02-01 Tuesday Full 1.37% 82%
2023-02-01 Wednesday Full −0.26% 25%
2024-02-01 Thursday Interim −0.13% 13%
2024-07-23 Tuesday Full −0.12% 12%
2025-02-01 Saturday Full −0.11% 11%

The last column ranks each Budget-day move, by size, among all 4,545 trading days. A value of 50% would be a perfectly ordinary day.

Not in the file. For these Budget days the file has no row. The move shown runs from the last close before the Budget to the first close after it, so it includes a second session. It’s here for completeness and isn’t in any of the averages above.

Budget date Day First close after Move over both sessions
2014-02-17 Monday 2014-02-18 1.3%
2015-02-28 Saturday 2015-03-02 1.27%
2020-02-01 Saturday 2020-02-03 −2.13%
2026-02-01 Sunday 2026-02-02 −0.92%

Three of these were weekend sessions the feed skipped. The fourth, 17 February 2014, was a Monday; the file simply has no row for it. Leaving these out makes the Budget-day numbers slightly less complete. Leaving them in as one-day moves would have made them wrong.

Muhurat trading: an hour, six data points

Here is every Muhurat session from 2008 to 2025, with NSE’s circular, and the Nifty’s move where the file has a row for it:

Session Day Window (IST) NSE circular Nifty move
2008-10-28 Tuesday 18:15–19:15 NSE/CMTR/11371 no row
2009-10-17 Saturday 18:15–19:15 NSE/CMTR/13174 no row
2010-11-05 Friday 18:15–19:00 NSE/CMTR/16062 no row
2011-10-26 Wednesday 16:45–18:00 NSE/CMTR/19187 no row
2012-11-13 Tuesday 15:45–17:00 NSE/CMTR/22083 no row
2013-11-03 Sunday 18:15–19:30 NSE/CMTR/24773 no row
2014-10-23 Thursday 18:30–19:30 NSE/CMTR/27779 no row
2015-11-11 Wednesday 17:45–18:45 NSE/CMTR/31047 no row
2016-10-30 Sunday 18:30–19:30 NSE/CMTR/33424 no row
2017-10-19 Thursday 18:30–19:30 NSE/CMTR/35993 −0.63%
2018-11-07 Wednesday 17:30–18:30 NSE/CMTR/39216 0.65%
2019-10-27 Sunday 18:15–19:15 NSE/CMTR/42483 no row
2020-11-14 Saturday 18:15–19:15 NSE/CMTR/46230 no row
2021-11-04 Thursday 18:15–19:15 NSE/CMTR/50050 0.49%
2022-10-24 Monday 18:15–19:15 NSE/CMTR/54023 0.88%
2023-11-12 Sunday 18:15–19:15 NSE/CMTR/59124 no row
2024-11-01 Friday 18:00–19:00 NSE/CMTR/64628 0.41%
2025-10-21 Tuesday 13:45–14:45 NSE/CMTR/70319 0.1%

The file has rows for only 6 of the 18 sessions, all on weekdays from 2017 on. The weekend sessions and the earlier weekday ones aren’t in this feed. We haven’t substituted the next day’s close for them, because that would measure a full trading day, not the Muhurat hour.

On those 6, the Nifty rose 5 times and averaged +0.32%. That matches the folklore. But:

  • Six is a very small number. In the shuffle test, 14% of random sets of six ordinary days had at least 5 rises. That’s far too common to call unusual.
  • The moves were small. An average size of 0.53%, against 0.86% on an ordinary day. That’s what you’d expect from about an hour of thin, ceremonial trading.
  • It’s one hour, then a new week. Even a reliable green hour wouldn’t be a reason to hold anything afterwards. The session is a tradition, and it’s worth enjoying as one.
🧒 Explain it like I'm 10 (optional — skip if this is already clear)

Imagine you notice your cricket team won the last five matches you watched wearing your lucky cap. Five wins in a row feels like proof.

But your team wins a lot of matches anyway. If you counted every match — cap or no cap — you might find they win just as often. And five matches is not many; a coin can land heads five times out of six more often than you’d think.

Budget day and Diwali trading are the market’s lucky caps. The only way to know if they matter is to count every one, and compare with all the ordinary days.

Doing it in Python

import pandas as pd

s = pd.read_csv("nifty50-price-index.csv", parse_dates=["date"]
                ).set_index("date").nifty50_pri_close
ret = s.pct_change().dropna()

budget_days = pd.to_datetime(["2021-02-01", "2022-02-01", "2023-02-01",
                              "2024-02-01", "2024-07-23", "2025-02-01"])
missing = budget_days.difference(ret.index)       # check before you trust it
print("not in file:", list(missing.date))
ev = ret.reindex(budget_days.intersection(ret.index))

print(f"Budget days: avg |move| {ev.abs().mean():.2%}, "
      f"all days {ret.abs().mean():.2%}, rises {(ev > 0).sum()} of {len(ev)}")
bigger = sum(ret.sample(len(ev), random_state=i).abs().mean() >= ev.abs().mean()
             for i in range(5000))
print(f"random sets as big: {bigger / 5000:.1%}")

Replace the six dates with the full verified list from the table above. The missing line is the important habit: a date that isn’t in your file must be dealt with openly, not skipped without a word.

Common mistakes

  • Using dates from memory. Budgets moved from late February to 1 February in 2017. Election years have two. Some fell on weekends. Muhurat dates move with the Hindu calendar. Get every date from a primary source.
  • Silently dropping days your data doesn’t have. A weekend session missing from a price feed can be one of the bigger moves (the 2020 Budget, a Saturday, is missing from this one). List what’s missing, and say why.
  • Treating “bigger” as “predictable”. Budget days moved more than ordinary days. That tells you volatility is higher, not which way it goes. Higher volatility cuts both ways.
  • Calling six observations a tradition that works. Five green sessions out of six sounds convincing. Random sets of six ordinary days did that 14% of the time.

Takeaway: On 18 years of Nifty data with verified dates, Budget days moved noticeably more than ordinary days, but not in a dependable direction. The “Muhurat closes green” belief rests on a handful of sessions, which random sets of days matched 14% of the time. Both dates say something about volatility, not about direction.