Adjust a split one session late and the backtest buys at a price that never traded
The short answer
Look-ahead bias is the use, at time t, of anything that could not have been known at t. Corporate actions leak it two ways. A factor applied on the wrong session puts prices into the history that never traded: across the 426 split and bonus ex-dates found in the exchange's own files from 2022 to 2026, adjusting one session late lifted the mean trade of a plain 20-session breakout rule from 0.85 to 1.79 per cent, almost entirely through 19 trades that bought the ex-date open after the factor had cut it twice. At the prices that actually traded those trades averaged a loss of 7.4 per cent; the test showed +392 per cent. A back-adjusted series carries factors that did not exist yet: a ₹100 minimum-price filter run on one disagreed with the quoted prices on 56,520 name-sessions, typically more than a year before the split or bonus behind it. And the ex-date itself moved: since the move to T+1 on 27 January 2023 it falls on the record date, where under T+2 it fell one session before, so the old shortcut of subtracting a session now adjusts one session early. Measured, gross of costs, not a forecast.
This page is about leakage inside a test. The arithmetic of each factor is worked in the guide to adjusting a price series, and the guide to backtesting integrity catalogues the failure modes in general. What follows measures two specific leaks on real events from the exchange's files and says which checks catch them and which do not.
Look-ahead is a timestamp error, and a corporate action carries two timestamps
A backtest simulates decisions taken one session at a time. Look-ahead bias is any input used at session t that did not exist, or was not public, at t. Better statistics cannot fix it, because it is not a modelling error. It is a clock error: the right number read at the wrong time.
A split or bonus enters a price history through two different timestamps. The first is the ex-date, the session on which the quoted price starts to reflect the new share count. Put the step on the wrong session and the history contains prices that never traded. The second is the date the adjusted history was built. A back-adjusted file multiplies every earlier price by the factor of every action up to the day it was built, so a 2022 price in a file built in 2026 contains factors from 2023, 2024 and 2025. Read that price as a level and the decision uses the future, even though every date in the file is right.
The ex-date moved in January 2023, and the one-session shortcut moved with it
The ex-date is not an independent fact. It is derived from the record date by the settlement cycle: the last cum day is the last session whose purchase settles by the record date, and the ex-date is the session after it. Under T+2 a purchase settled two sessions later, so the ex-date fell one session before the record date. Under T+1 it settles the next session, so the last cum day is the session before the record date and the ex-date is the record date itself.
India moved in phases. SEBI circular SEBI/HO/MRD2/DCAP/P/CIR/2021/628 of 7 September 2021 let an exchange offer T+1 on any scrip from 1 January 2022, with a month's notice and a six-month minimum before switching back. Under the market infrastructure institutions' joint roadmap of 8 November 2021, the first list of securities moved on 25 February 2022, per BSE notice 20220125-56, and every remaining security, including every stock with derivatives, moved on 27 January 2023, per BSE notice 20221226-37. The exchange's own corporate actions list shows the convention change directly.
| Ex-date period | Record date a trading session | Ex-date on the record date | Ex-date one session earlier | Other gap | Record date not a session |
|---|---|---|---|---|---|
| Before the first T+1 phase, to 24 February 2022 | 177 | 0 | 177 | 0 | 20 |
| During the phase-in, 25 February 2022 to 26 January 2023 | 664 | 58 | 585 | 21 | 35 |
| After full migration, from 27 January 2023 | 5,154 | 5,004 | 150 | 0 | 344 |
Before the first phase, all 177 actions whose record date was a trading session went ex one session earlier. Since full migration, 5,004 of 5,154, 97.1 per cent, went ex on the record date itself. Of the 150 that went ex one session before a record date that was a trading session, 94 fall on just five record dates and all 150 on 23, the clustering a settlement holiday would produce. Another 344 had a record date on a weekend or holiday, where the ex-date is the last session before it. Many explainers still describe the ex-date as one working day before the record date. That was the T+2 rule.
The consequence for a data pipeline is exact. Code that derives the ex-date by subtracting one session from the record date was right in 2021 and has adjusted one session early on 5,004 of the 5,498 actions since January 2023. Code that uses the record date itself was one session late on every action before the phase-in, and is still wrong on 494 of 5,498 actions since, about one in eleven, because the record date was not a session or was not the ex-date. No fixed offset from the record date is right across a history that spans 2022. The only safe key is the exchange's own ex-date field.
The boundary itself is written down. For stock derivatives the exchange carries out corporate action adjustments after the close of trading on the last day the security trades cum-benefit, per its page on adjustments for corporate actions. A price history needs the same boundary: the factor applies to every price up to and including the last cum close, and to nothing after it. The exchanges also suspend the optional same-day settlement segment on the ex-date of any corporate action, per the T+0 trading FAQs of both exchanges, which removes the one cycle under which a purchase on the ex-date would settle on the record date.
Finding the events in the tape, and why the tape alone cannot decide
The events here were found in the bhavcopy before they were looked up. Across 3,486 symbols and 1,164 sessions there are 615 closes at least 20 per cent below the previous session's close, counting only sessions with nothing missing between them. 426 fall on the exact ex-date of a split or bonus in the exchange's list, and in all 426 the size of the step agrees with the listed factor. Quantity confirms it: the median traded quantity over the 20 sessions from the ex-date was 2.76 times its level over the previous 20, and quantity multiplied by the factor had a median of 0.85, so the share count stepped up by close to the factor while rupee turnover barely moved.
The other 189 are the warning. 55 fall on a listed demerger, rights issue or dividend date. Of the 134 with no listed action at all, 80 are falls of 20 to 30 per cent, the range of a genuine collapse, 63 of them closing exactly 20 per cent down, where a 20 per cent price band stops a fall, and 54 are deeper steps that only an action produces, including unit splits in exchange-traded funds, which this list does not carry. A detector that adjusts every large step would erase real losses from the history, and a quantity test does not rescue it: 41 of the 80 genuine falls showed a quantity step of 1.5 times or more, against 322 of the 426 real events. A detector that confirms a split by the quantity traded over the next 20 sessions is also reading 20 sessions of the future, which is acceptable when building a research file after the fact and fatal inside a simulation that must decide on the day.
Nor does the file's own previous-close field help. On the ex-date it carried the unadjusted close in 425 of these 426 events, so a gap computed as the open over that field is the phantom step itself. The field guide to the bhavcopy documents the column.
One history, four versions
Every affected stock's full history from 2022 to 2026, 365 stocks, was built four ways that differ only in where the factor's boundary falls. The correct version multiplies every price before the ex-date by the factor m. The unadjusted version leaves the tape as quoted. The late version also multiplies the ex-date bar itself, which is what happens when the record date is used as the ex-date on T+2-era data, or when code scales everything up to the ex-date with an inclusive slice: label slicing with .loc in pandas includes both endpoints, per its indexing documentation, so df.loc[:ex_date] *= m scales the ex-date as well. The early version leaves the last cum bar unscaled, which is what subtracting a session from a T+1-era record date does.
| Factor m | Events | Most common terms | Unadjusted, on the ex-date | One session late, ex-date then next | One session early, last cum then ex-date |
|---|---|---|---|---|---|
| 0.5 | 144 | bonus 1:1; split 10 to 5 | -50% | -50%, then +100% | +100%, then -50% |
| 0.2 | 90 | split 10 to 2; split 5 to 1 | -80% | -80%, then +400% | +400%, then -80% |
| 0.1 | 76 | split 10 to 1; split 10 to 2 and bonus 1:1 | -90% | -90%, then +900% | +900%, then -90% |
| 0.6667 | 30 | bonus 1:2 | -33% | -33%, then +50% | +50%, then -33% |
| 0.3333 | 27 | bonus 2:1; bonus 1:2 and split 10 to 5 | -67% | -67%, then +200% | +200%, then -67% |
| 0.25 | 15 | bonus 3:1; bonus 1:1 and split 10 to 5 | -75% | -75%, then +300% | +300%, then -75% |
| 0.4 | 10 | split 5 to 2; bonus 3:2 | -60% | -60%, then +150% | +150%, then -60% |
| 0.75 | 6 | bonus 1:3 | -25% | -25%, then +33% | +33%, then -25% |
| 0.1667 | 5 | bonus 5:1; split 6 to 1 | -83% | -83%, then +500% | +500%, then -83% |
| Other factors | 23 | smaller and combined actions | the same pattern, sized by each factor | ||
The phantom is set by the factor, not by the market. A one-session error produces a pair of phantom moves of opposite sign, and across the pair the arithmetic cancels exactly: a drop to m followed by a rise of 1/m is no change. That is why the error survives a glance at an equity curve. It damages only positions that sit on one side of the pair, and a trading rule decides which positions those are.
The phantom trades, counted
The rule is deliberately plain and stated before any result: when a session closes above the highest high of the previous 20 sessions, buy at the next session's open and sell at the open ten sessions after that, one position per stock at a time. A signal is skipped if its window crosses a session missing from the files or a suspension. Fills are at the next open, so nothing below is the same-close leak.
| Version | Trades | Mean trade | Median trade | Win rate | Largest trade | Against the correct version |
|---|---|---|---|---|---|---|
| Adjusted on the ex-date | 7,261 | +0.85% | -0.53% | 47.3% | +105% | the reference |
| As quoted, unadjusted | 7,137 | -0.36% | -0.68% | 46.7% | +105% | 12 added, 136 lost, 133 repriced |
| Adjusted one session late | 7,256 | +1.79% | -0.51% | 47.5% | +918% | 48 added, 53 lost, 32 repriced |
| Adjusted one session early | 7,351 | +1.27% | -0.59% | 47.0% | +1002% | 225 added, 135 lost, 21 repriced |
The late version bears out the common claim that a misdated adjustment hands a breakout rule profits it could never have made, and shows exactly where they come from. 19 trades bought the ex-date open after the factor had been applied to it a second time, at between 10 and 75 per cent of a price that traded. Held ten sessions into the correctly scaled prices that follow, they show an average of +392 per cent. The same fills at the prices that actually traded averaged a loss of 7.4 per cent, and only 4 of the 19 made money. They are 0.26 per cent of the late version's trades and more than account for its whole excess over the correct one.
The signal behind each of them was genuine. The last cum close was a real 20-session high in both versions, and stocks break out into their ex-dates far more often than on an ordinary session: 57 of the 434 ex-dates here, 13.1 per cent, against 5.3 per cent of all sessions. A breakout rule is therefore disproportionately likely to be placing an order for the ex-date open. What is fictional is the fill.
| Version, and what happened | Trades | Mean in the test | Mean at traded prices |
|---|---|---|---|
| Unadjusted: position held across an ex-date | 133 | -66% | +4.7% |
| Unadjusted: real trade that disappears | 136 | never taken | -5.6% |
| Late: bought at the ex-date open | 19 | +392% | -7.4% |
| Late: sold at the ex-date open | 13 | -68% | +5.6% |
| Late: new signal after the phantom low | 48 | -4.7% | a real trade on a signal that never fired |
| Early: sold at the unscaled last cum open | 9 | +477% | +3.1% |
| Early: new signal on the phantom spike | 213 | -5.1% | a real trade on a signal that never fired |
The unadjusted version reverses the sign. 133 positions held across an ex-date were marked down by the factor, showing a loss of 66 per cent against a gain of 4.7 per cent at the prices that traded, and 136 real trades vanished, 45 of them breakouts on the ex-date close that the raw tape cannot register because the pre-split highs still tower over it. The early version produces both kinds: 213 signals on the last cum session that the correct history does not have, fired by the phantom spike, which bought the real ex-date open and averaged a loss of 5.1 per cent, and 9 trades sold at a last cum open the error left unscaled, showing +477 per cent against a real +3.1.
Two readings of the summary table matter more than any single number. The win rate barely moves, 47.3 per cent correct against 47.5 late, and neither does the median trade, so a reviewer who checks those sees nothing. The damage sits in the mean and in the tail, which is where the headline figures of a backtest are computed. And it does not stay inside the affected stocks: run on all 3,081 stocks in the files, 43,597 trades, the same 19 phantom fills lift the mean trade of the whole test from 0.225 to 0.382 per cent, 1.7 times the correct figure, while the unadjusted version cuts it to 0.025.
The same error changes sign with the execution convention
Run the same four histories through the other common form of backtest, the vectorised test in which a signal on the close of one session earns the close-to-close return of the next, and the late version stops flattering the rule.
The correct history earns 64.9 basis points a session in the market. The late version earns 44.9, the unadjusted 45.4 and the early 33.8, and compounded the early version loses 177 basis points a session. It is the same phantom pair seen through a different fill. In the trade test the fill lands on the phantom low and rides the phantom rebound. In the vectorised test the phantom low on the ex-date close switches the position off, so it takes the fall and misses the recovery. No rule of thumb of the form "a misdated adjustment flatters breakout rules" survives a change of convention. What survives is that the test is wrong, by an amount set by the factor, in a direction set by the plumbing.
Back-adjustment leaks next year's news into every level
The second leak needs no error at all. A back-adjusted file is exact for returns, because a factor multiplies both ends of any return that does not span an action and cancels. It is wrong for levels: every price before the latest action is a traded price times factors from actions that happened later. A rule that asks whether a price is above a threshold, whether a stock is too cheap to trade, or how many shares a rupee amount buys, asks it of a number that did not exist on the day.
Measured: a minimum-price filter of ₹100 on the close, applied to every stock on every session twice, once to the quoted close and once to the same close back-adjusted on 18 September 2026 for splits and bonuses only. Rights issues and dividends are left out, so these counts are a floor for a fully adjusted file.
| Minimum close | Name-sessions passing as quoted | Failing once adjusted | Share | Names | Median sessions to the action | Next 60: wrongly excluded | Next 60: the rest |
|---|---|---|---|---|---|---|---|
| ₹20 | 2,298,458 | 23,613 | 1.03% | 90 | 257 | +14.2% | +5.0% |
| ₹50 | 2,015,859 | 42,415 | 2.10% | 147 | 281 | +13.3% | +5.2% |
| ₹100 | 1,704,154 | 56,520 | 3.32% | 210 | 283 | +12.5% | +5.1% |
| ₹500 | 773,867 | 54,782 | 7.08% | 201 | 263 | +10.6% | +4.1% |
| ₹1,000 | 425,778 | 41,372 | 9.72% | 150 | 277 | +8.0% | +4.1% |
At ₹100, 1,704,154 name-sessions passed on the quoted close and 56,520 of them, 3.3 per cent, failed on the adjusted one: 210 different names, 49 on an average session and 99 on the worst, 22 June 2022. The median wrongly excluded session sits 283 sessions before the action that caused it, and 54 per cent sit more than 250 sessions, about a year, ahead of it. The filter is reading news from a year ahead.
The names it removes are not a random sample. By construction they are the companies that will split or issue bonus shares, and in these files they rose 12.5 per cent on average over the next 60 sessions against 5.1 per cent for names that passed on both closes; the medians were 5.1 and 1.7 per cent, and the excluded names were ahead in 4 of 5 calendar years. Taking one average per name, so that overlapping windows are not counted many times, the median excluded name returned 11.5 per cent against 3.3. A minimum price on an adjusted file therefore removes some of the test's future winners, a leak that happens to cost. Reverse the rule and it flatters: a cap of ₹500 on the adjusted close, the mirror image of the ₹500 row above, wrongly admits 54,779 name-sessions in 201 names that were really priced above it, and those rose 10.6 per cent over the next 60 sessions against 5.1. Same mechanism, opposite sign, set by which side of the threshold the rule sits on.
This is a different point from reproducibility. The adjustment guide shows one filter giving different answers on one date depending on when the file was downloaded; here, the answer given on any date is itself a function of the future. The fix is the working rule stated there: compute returns on the adjusted series, and every level, filter, quantity and cost on the price that traded that day.
Four more leaks with the same shape
The close you cannot trade. A signal computed on a close and filled at that same close uses a price known only once it could no longer be traded at. On the correct histories of all 3,081 stocks, the open after one of the rule's breakout closes was higher on 73 per cent of occasions, by 1.00 per cent on average, median 0.56. Filling at the signal close lifts the mean trade of the whole test from 0.225 to 0.86 per cent, 3.2 times the largest shift any misdated history produced. The fix is to hold the position one bar behind the signal, which the integrity guide works through.
Fundamentals stamped with the wrong date. Under Regulation 33(3) of SEBI's Listing Obligations and Disclosure Requirements Regulations, a listed company submits quarterly results within 45 days of the quarter's end, other than the last quarter, and audited annual results within 60 days of the year's end. A database that stamps earnings on the quarter-end date gives the test up to 45 or 60 days of foresight, and one that stores the latest restated figure gives it the restatement as well. Point-in-time means the first published number, on the day it was published.
Index membership known in advance. The Nifty 50 is reviewed twice a year on six months of average data to 31 January and 31 July, with four weeks' notice before a change takes effect, per its factsheet of 31 August 2026. A test that uses today's constituent list for 2022 has chosen its universe with more than four years of hindsight. Use the announcement date for what was known and the effective date for what was held.
Shares that had not arrived. For bonus issues announced on or after 1 October 2024, SEBI's circular of 16 September 2024 has the new shares allotted the working day after the record date and tradable the working day after that. A test that sells the bonus shares on the ex-date sells shares its holder did not yet have.
The one-bar shift test, and what it cannot see
The standard check is to delay every signal by one more bar and see what survives. A result built on a same-bar leak collapses; a real effect degrades gently. Measured on the four histories, it does exactly that for the leak it was designed for and nothing for the others.
| Check | Catches | Misses | Measured here |
|---|---|---|---|
| Delay every signal one more bar | A fill at the signal close | A misdated factor; any level read from an adjusted file | Correct history: 1.54% a trade at the close, 0.85% one bar later. Late history: 1.79%, then 1.17%, still above correct |
| Reconcile each trade to quoted prices and the action list | Every fill on a misdated or missing factor | Signals that should never have fired | Trades that fail: 0 correct, 133 unadjusted, 32 late, 21 early |
| Read the twenty largest trades | The large phantoms, by inspection | Small factors that hide in the body of the distribution | Touching an ex-date: 5 correct, 18 unadjusted, 18 late, 15 early |
| Compute every level on the quoted price of the day | The back-adjusted filter, lot and stop leak | Fundamentals and index membership, which need their own dates | Removes the 56,520 disagreements at ₹100 by construction |
| Key every action on the exchange's ex-date field | Offsets derived from the record date | Nothing it is asked to do | Since 27 January 2023 a record-date key is wrong on 494 of 5,498 actions and a record-date-minus-one key on 5,004 |
Filling at the signal close gives 1.54 per cent a trade on the correct history; one bar later, 0.85; two, 0.74. The shift exposes that leak. On the late history the mean trade is 1.79, 1.17 and 1.48 per cent at delays of one, two and three sessions, above the correct history's 0.85, 0.74 and 1.03 every time, because the phantom does not belong to one signal: shift the signals and a different trade lands its fill on the ex-date bar. A filter computed on a back-adjusted close is wrong at every shift. The shift test is one line of a checklist, not the checklist.
The reconciliation is the check that does the most work. Rebuild every trade from the prices quoted on its entry and exit sessions, scaling the share count by each action between them, with no adjusted series involved at all. The correct history reconciled on all 7,261 of its trades, which is the proof the instrument measures the right thing, and the three misdated histories failed on 133, 32 and 21 trades.
What a leak-proof history keeps
A history that cannot leak stores three things rather than one: the prices as quoted, the exchange's action list with its ex-dates, and the date on which each fact became public. Adjusted prices are then computed from those as of each decision, and used for returns and nothing else. The reason to keep inputs rather than outputs is the one the guide to publishing a checkable result makes for reproducibility, and it has a second edge here: a search across many rule variants on a leaky history rewards whichever variant lands its fills on the phantom bars most often, which is the problem of choosing the best of many backtests with a data error supplying the winner.
Treating every input as something with a date on which it became knowable is the discipline the curriculum's research volumes are built around, because a backtest simulates what could have been known, and its data has to meet that standard before any rule is tested on it.
Frequently asked questions
What exactly counts as look-ahead bias in a backtest?
Any input used at a simulated session that did not exist, or was not public, at that session. A corporate action creates two such inputs: a step placed on the wrong session, which puts prices into the history that never traded, and a back-adjusted level, which multiplies a past price by factors from actions that came later. Both leave every date in the file looking correct, which is why they survive a casual review.
Is the ex-date the same as the record date in India now?
For almost every action since all securities moved to T+1 settlement on 27 January 2023, yes. In the exchange's own corporate actions list, 5,004 of the 5,154 equity actions since then whose record date was a trading session went ex on the record date itself. Under T+2 the ex-date was one session before the record date, and explainers written then still describe that rule.
Why is a one-session error in the adjustment date enough to matter?
Because the size of the phantom move is set by the factor, not by the market. A factor applied one session late turns the ex-date into a drop to a fraction m of the traded price followed by a rise of 1/m the next session, which for a ten-for-one split is a phantom rebound of 900 per cent. Any fill on that bar books the whole factor. In these files 19 such fills turned an average real result of -7.4 per cent into an apparent +392 per cent.
Does unadjusted data always make a backtest look worse?
No. It marks down any long position held across an ex-date, which it did to 133 breakout trades here, and it would flatter a short position held across one. A late adjustment flattered the trade-based test and hurt the vectorised one. The direction depends on the error and on how the test turns signals into positions; only the fact of the distortion is certain.
Can splits and bonuses be found from the price data alone?
Found, yes; confirmed, no. Of 615 falls of 20 per cent or more between adjacent sessions, 426 were listed splits or bonuses, but 80 were falls with no corporate action at all, and 41 of those also showed a jump in traded quantity. A detector that uses the quantity traded after the step is also reading the future. Use the exchange's action list and treat the tape as the cross-check.
If back-adjustment leaves returns unchanged, why is it a look-ahead problem?
Because rules also read levels: a minimum price, a round number, a lot size, a stop written in rupees. Every level before the latest action in a back-adjusted file is a traded price multiplied by factors from later actions. A ₹100 minimum-price filter on such a file disagreed with the quoted prices on 56,520 name-sessions here, a median of 283 sessions before the action responsible.
Which way does the price-filter leak push a result?
It depends on which side of the threshold the rule sits. A minimum price on an adjusted file excludes names that will later split or issue bonus shares, and here those rose 12.5 per cent on average over the next 60 sessions against 5.1 per cent for the rest, so it removed future winners. A maximum price admits them, which flatters. Neither is an edge; both are a universe chosen by the future.
What is the one-bar shift test, and what does it catch?
Delay every signal by one more bar and compare. It exposes the same-close leak: on the correct history the mean trade fell from 1.54 per cent filled at the signal close to 0.85 per cent filled at the next open. It did not expose the misdated factor, which stayed above the correct history at delays of one, two and three sessions, and it cannot see a filter computed on adjusted levels.
Which bhavcopy fields are safe for a gap rule across an ex-date?
The ex-date open against the last cum close multiplied by the factor. The file's own previous-close field carried the unadjusted close on the ex-date in 425 of the 426 split and bonus events here, so a gap computed from that field is the corporate action, not the market.
Does any of this apply to dividends?
Yes. A dividend factor applied on the wrong session creates a smaller phantom pair, and a dividend-adjusted back-adjusted file restates every earlier level again at each dividend. The filter counts on this page adjust for splits and bonuses only, so they are a floor for a file that also adjusts dividends and rights issues.
As at 23 September 2026. The settlement cycle, the ex-date convention, the T+0 segment rule, the bonus-credit timeline, the results-filing deadlines and the index review schedule are stated as verified on that date. Confirm the current circulars and the exchanges' current practice before relying on any of it, and re-pull the source files before relying on any figure.
How the figures were produced. Security bhavcopies from 3 January 2022 to 18 September 2026, keyed on the DATE1 column inside each file: 53 holiday copies discarded, the Saturday sessions of 20 January 2024 and 18 May 2024 kept, 1,164 sessions, EQ and BE series. The session calendar adds the daily index close files; 8 August 2022 and four weekend special sessions absent from the bhavcopy cache are treated as gaps, and no trade, return or event is computed across one. Split and bonus terms, ex-dates and record dates come from the exchange's corporate actions list for equities, 11,508 rows fetched month by month on 23 September 2026. An event is a close at or below 0.80 of the previous calendar-adjacent close, on the exact listed ex-date, with the step between 0.7 and 1.35 times the listed factor; 8 smaller listed actions in the same stocks are adjusted identically. Versions: the factor applied to bars before the ex-date (correct), to none (unadjusted), to bars up to and including the ex-date (late), and to bars before the last cum session (early). Rule: a close above the highest high of the previous 20 sessions buys the next open and sells the open ten sessions later, one position at a time, skipping any window that crosses a gap. Vectorised test: in the market on a session when the previous close broke the prior 20-session high, earning the close-to-close return. Filter: quoted close against the close multiplied by every listed split and bonus factor with a later ex-date up to 18 September 2026; forward returns over 60 gap-free sessions on split and bonus adjusted closes. No random numbers are used, so there is no seed and no replication count; running tools/build-article-138.py on the same files reproduces every figure. All results are gross of costs and taxes and describe past data only.
Not verified this session. A circular stating in words that the ex-date equals the record date under T+1 could not be retrieved, because the regulator's site was unreachable from here; the convention is stated from the settlement arithmetic, SEBI circular SEBI/HO/MRD2/DCAP/P/CIR/2021/628, BSE notices 20220125-56 and 20221226-37, the T+0 FAQs of both exchanges and the measured list. Reading the 150 post-migration exceptions as settlement holidays is an inference from their clustering, not a checked fact. The forward-return gap in the filter measurement is an association in one sample of under five years, not a tested or persistent effect. Whether any particular data vendor or platform places adjustments on the wrong session was not examined, and nothing here says one does.
Bharath Shiksha is an educational publisher and not a SEBI-registered investment adviser or research analyst. Nothing on this page is a recommendation, a forecast or an offer of any product or return.
Ready to go deeper than this article?
Bharath Shiksha is a 90-volume curriculum across 6 stages, from chart reading at ₹14,999 through capital raising, or the full bundle at ₹1,49,999. Building a price history as a function of what was knowable on each date, before any rule is tested on it, is taught as research method here, not as a data-cleaning afterthought.
Take the free diagnostic →