Start with the simplest and most dramatic case. A company executes a 2-for-1 stock split: every shareholder who held 100 shares at ₹1,200 now holds 200 shares at ₹600. Check the arithmetic that matters: 100 × ₹1,200 = ₹120,000 before; 200 × ₹600 = ₹120,000 after. Not one rupee of value moved. Nothing about the company's earnings, assets, cash flow, or competitive position changed between the close of business the day before and the open of business the day after, the board simply decided to represent the same ownership stake with twice as many, half-as-expensive, pieces of paper. Companies do this for reasons that are almost entirely about optics and liquidity (a lower per-share price is psychologically more approachable to retail investors, and finer share granularity can improve trading liquidity), never because the split itself creates or destroys value.
What happens if a return series ignores the split?
Now watch what happens if your pipeline does not know this. Take a small illustrative NSE-style series for a fictional company, NILAM (Nilam Software Ltd, ₹, synthetic, illustrative seed 501): six raw closes [1200.00, 1180.00, 1220.00, 610.00, 605.00, 615.00], with a 2-for-1 split taking effect so that the fourth value onward (index 3, zero-based) is already on the new, post-split basis. A day-over-day return calculation that does not know about the split computes, for that one boundary day, (610.00 − 1220.00) / 1220.00 = −0.50, a reported −50% single-day crash. Nothing crashed. The share count doubled and the per-share price halved, and a naive return function, which only ever sees a list of numbers with no memory of what a share represents, reports the mechanical bookkeeping change as if it were a catastrophic loss of value. This single example is worth holding as the module's canonical illustration: the fix is to express every price on a single, consistent, current-equivalent share basis before you ever compute a return across the boundary, divide every price before the split by the split ratio, so [1200, 1180, 1220] become [600, 590, 610], landing exactly on the post-split series's own opening level and making the boundary-day return read, correctly, as (610 − 610) / 610 = 0%. This is split adjustment, and it is Exercise 1 of this module's code pack: adjust_for_split(closes, split_index, ratio).
Advertisement
Another example: a 3-for-1 split in the US
A companion US example makes the same point with a different ratio: a fictional BRPEAK (Borealis Peak Technologies Inc, $, synthetic, illustrative seed 502) executes a 3-for-1 split. Raw closes [300.00, 306.00, 294.00, 99.00, 101.00, 97.00] show a raw boundary return of (99.00 − 294.00) / 294.00 ≈ −66.3%, an even more dramatic-looking phantom crash, because a 3-for-1 split moves the price by a larger factor than a 2-for-1 one. Adjusted, the pre-split prices divide by 3 to [100.00, 102.00, 98.00], and the boundary return reads a modest, real (99.00 − 98.00) / 98.00 ≈ +1.02%, the actual overnight move, with the mechanical 3× rescaling correctly stripped out. The ratio changes; the discipline does not.