Corporate Actions and Price Adjustment
Splits, dividends and other corporate actions create artificial jumps in a raw price series. A price feed engineer applies backward-looking adjustment factors so that a return computed across the jump reflects what an investor actually earned, not a data artifact.
Prerequisites: Tick Data vs Bar Data
A stock closes at $200 on Friday. Over the weekend the company does a 2-for-1 split — every shareholder now holds twice as many shares, each worth half as much. Monday it opens at $100. If you feed a raw, unadjusted price series into a return calculation across that boundary, you get a −50% return that never happened to any shareholder's wealth. Corporate action adjustment is the process of rewriting historical prices (and volumes) so that computed returns match economic reality, not bookkeeping noise from splits, dividends, and similar events.
The idea: an adjustment factor per event, applied backward
Every corporate action produces a ratio: for a split, the ratio of new shares to old shares; for a cash dividend, the ratio of (price minus dividend) to price on the day before the ex-dividend date. To adjust history, you multiply every price before the event date by that event's factor — and the factors compound, so a stock with three splits in its history has every price before the earliest split multiplied by the product of all three ratios.
In words: to adjust a historical price, multiply it by the adjustment factor of every corporate action that happened after that date, walking backward from today. Prices on or after the most recent event are untouched; prices further back accumulate more factors.
Worked example: one split, one dividend
A stock's raw closes: Jan 1: 200, Jan 2: 202 (day before a 2-for-1 split), Jan 3: 101 (post-split open), Jan 4: 103. Then on Jan 5 it goes ex-dividend for $1, closing at 102.
Adjustment factors, computed at each event date:
- Split on Jan 3: factor = new shares / old shares = 1/2 = 0.5, applied to every price before Jan 3.
- Dividend on Jan 5: factor = (pre-div close − dividend) / pre-div close = (103 − 1) / 103 ≈ 0.9903, applied to every price before Jan 5.
Adjusted prices, walking backward from the most recent date:
raw = {"Jan1": 200, "Jan2": 202, "Jan3": 101, "Jan4": 103, "Jan5": 102}
events = [("Jan3", 0.5), ("Jan5", 103/103)] # split factor, then dividend factor below
# split factor 0.5 applies to all dates strictly before Jan 3
# dividend factor 0.9903 applies to all dates strictly before Jan 5
adj = {}
for date, price in raw.items():
factor = 1.0
if date in ("Jan1", "Jan2"):
factor *= 0.5
if date in ("Jan1", "Jan2", "Jan3", "Jan4"):
factor *= (103 - 1) / 103
adj[date] = price * factor
Result: Jan1 ≈ 99.03, Jan2 ≈ 99.99, Jan3 ≈ 100.02 (dividend factor only), Jan4 ≈ 102.01, Jan5 = 102 (unadjusted, it's the anchor). Now a return from Jan 1 to Jan 5 is 102 / 99.03 − 1 ≈ +3.0% — a sensible number, instead of the raw series's nonsensical 102/200 − 1 ≈ −49% that a naive calculation would produce across the split.
Adjustment is always applied to the past, never the present — today's raw price is always the true, tradeable price. As new corporate actions occur, the entire adjustment factor series is recomputed and history shifts again, which is why a "point-in-time" adjusted price is only valid as of the date it was computed.
Where it shows up
Interview questions ask you to implement exactly the loop above: given a list of raw prices and a list of (date, ratio) events, produce an adjusted series, and explain why the adjustment runs backward rather than forward. A common follow-up is what happens to volume (it gets adjusted by the inverse ratio, since share count and price move oppositely, so dollar volume stays consistent).
In a real data pipeline, this logic sits in the layer between the raw vendor feed and everything else — backtests, factor models, screens — because every one of those consumers needs return-consistent prices. Point-in-time correctness matters here too: a backtest run "as of" a date in the past must use the adjustment factors known at that time, not factors that include splits announced later (see Point-in-Time Databases).
The classic bug is adjusting only price and forgetting volume, or adjusting in the wrong direction (forward instead of backward), which silently corrupts every return computed across the event. Always test corporate action adjustment against a known case — a well-documented historical split — before trusting it on a full universe.
Related concepts
Practice in interviews
Further reading
- CRSP, Data Description Guide (adjustment factor methodology)