DocsData & MethodologyStock price adjustments
Data & MethodologyGuide

Stock price adjustments

The platform computes four versions of every underlying stock series: one raw and three corrected for corporate actions. Splits and dividends put artificial jumps into a raw price series, and the three adjusted modes remove different subsets of those jumps. All four are derived on read from the raw close and a small set of precomputed factors.

Updated Jul 20265 min read

The bar.* accessor returns the backward-adjusted series by default: splits and dividends are both removed. Two switches control the read, split_adjusted and dividend_adjusted, both defaulting true; setting both false recovers the raw series. One correction below carries a genuine look-ahead trap, so read the trap section before you threshold on any adjusted level.

The four adjustment modes

Each mode strips a different set of corporate-action jumps out of the raw close.

Mode
What it gives you
Raw
The true historical price, exactly what printed on the date. No adjustment.
Split-adjusted
The raw price with split jumps removed, restated into current share units. Dividends left in.
Backward-adjusted
Splits and dividends both removed. The industry-standard "adjusted close."
Total return
Splits removed and every past dividend reinvested back into the series.

Raw is the series option pricing uses (see below). Split-adjusted is safe for level comparisons because a split is a mechanical restatement. Backward-adjusted matches what most charting and data vendors label "adjusted close." Total return is the series you want for compounding, since it folds reinvested distributions back in.

How the factors work

Four quantities do the work, all keyed to a bar's date T.

Split factor. The product of split_to / split_from over every split with an execution date strictly after T. It is at least 1 for forward splits. Divide prices by it and multiply volume by it to restate an older bar into current share units.

Dividend factor. The product of (P_cum − D) / P_cum over every dividend with an ex-date after T, where P_cum is the raw close on the trading day immediately before the ex-date and D is the cash amount. Each term is at most 1 for a positive dividend, so the factor shrinks the further back you go.

Backward-adjust factor. The dividend factor divided by the split factor. Multiply the raw close by it to get the backward-adjusted level, which removes both splits and dividends in one step.

Reinvested-dividend sum. The sum of D_i / split_factor(ex_date_i) over every dividend with an ex-date at or before T, each past dividend expressed in current share units. It grows monotonically forward in time. Total return is the split-adjusted close plus this sum.

All factor arithmetic is done in exact decimal, not floating point, so a multi-decade series with dozens of corporate actions does not accumulate rounding drift.

What bar.* returns

bar.open(), bar.high(), bar.low(), bar.close(), and bar.volume() return the backward-adjusted series by default, the industry-standard "adjusted close," so a continuous price series is the normal case rather than something you assemble yourself. Two boolean parameters on every bar.* method control the read: split_adjusted governs split adjustment and dividend_adjusted governs dividend adjustment, both defaulting true. Setting both false recovers the raw series, the true historical print. Leaving split_adjusted=true and setting dividend_adjusted=false gives the split-only series, which carries no look-ahead. The total-return series is computed internally and is not reachable through a bar.* switch.

The look-ahead trap, and when it bites

Dividend adjustment uses the forward-looking convention: the adjusted level for a past date reflects every dividend known when the factor set was last built, including dividends with ex-dates after that date. This is the same convention most charting vendors use, and it has two consequences.

Adjusted levels are not point-in-time. The backward-adjusted or total-return level for 2020-01-02, read today, is scaled by every dividend paid since. Add one new dividend and every earlier adjusted level shifts. A backtest run today and the same backtest run in six months see different adjusted levels for the same historical date if dividends were paid in between. The level you would have seen live on that date is not the adjusted level you see now, so anything that thresholds on a price level ("enter when price is above $400") implicitly consumes future-dividend information.

Return series are clean. For any interval, the ratio of two adjusted levels cancels every dividend with an ex-date after the later endpoint, so returns, volatility, and any statistic built on the return series are unaffected by the convention. Split adjustment alone also carries no look-ahead, because a split is mechanical and visible on the split date.

So the rule is: derive returns from an adjusted series, but threshold on the raw or split-only level. Because bar.* returns the dividend-adjusted level by default, a level threshold on a default bar.close() read implicitly consumes future-dividend information. When a rule compares price against a level, set dividend_adjusted=false and keep split_adjusted=true: the split-only series keeps a continuous, split-safe level without pulling future dividends into the past.

Why options pricing still uses the raw close

Independent of what bar.* hands you, the option pricing pipeline uses the raw, unadjusted close as spot, never an adjusted level. When a stock splits, the OCC adjusts every open contract's strike by the same ratio, so the raw spot and the raw strike stay in the same unit and stay contemporaneous. Feed an adjusted spot against a raw strike and every IV and greek downstream is corrupted. The data inputs and point-in-time guarantees page covers the raw-basis principle in full; the adjusted series exist for continuous return work, not for option pricing.

The stock series includes all dividend types

The backward-adjusted and total-return stock series include every distribution type: regular cash, special, and capital-gains. That is the opposite of the options basis, where the dividend escrow uses regular cash only. Both are correct for their instrument. A shareholder receives every distribution, so a total-return stock series has to fold all of them in. Option contract terms absorb specials through the OCC adjustment, so the options-side dividend stream stays regular-cash-only. Reading the same word ("dividend") across the two surfaces, expect the stock series to be broader.

Was this page helpful?