Market-data tradeoffs · Price history

Split-adjusted prices can change after you ingest them

A new corporate action can rewrite years of adjusted history. Appending today’s bar is not enough when the basis of every earlier bar has changed.

Adjusted prices are derived data. When a company executes a split, reverse split, distribution, ADS ratio change, or reorganization, the provider may restate every earlier observation. A database that only appends new rows can keep two incompatible adjustment bases in one series.

The result often looks like alpha. Momentum jumps, drawdown spikes, and a backtest trades around a return that no shareholder experienced.

1. Name each price series

Provider field names are not a shared contract. EODHD serves printed OHLC values beside an adjusted_close. Financial Modeling Prep’s historical-price-eod/full endpoint serves split-adjusted OHLC and no dividend-adjusted close; its dividend-adjusted endpoint adds distribution effects; its non-split-adjusted endpoint serves printed values under adjOpen, adjClose, and similarly prefixed names.

That means a faithful mapping may require two requests and a date join. Copying fields by spelling can place a raw price in an adjusted column or treat a split-adjusted close as the exchange print.

Stored factMeaningTypical use
Raw closeThe price printed for that sessionExecution, limit checks, corporate-action arithmetic
Split-adjusted closeEarlier prices rebased for share-count changesPrice momentum and continuity
Total-return closeSplit and distribution effects combinedReturn measurement when distributions are reinvested

2. Detect silent restatement failures

StockQL compared 55 labeled histories containing known corporate-action boundaries. FMP was arithmetically clean on the headline EODHD failures, including HAO’s 1-for-128 reverse split and BAIG, whose stale adjustment basis produced a roughly 97,634-fold discontinuity. FMP also reconstructed NXTT and SMX cleanly across their recorded split histories.

The comparison was not a blanket endorsement. FMP missed QH’s 1-for-30 ADS ratio change on April 27, 2026, and served a stale series around an AREB halt. Each provider failed in a different part of the same domain.

A useful detector compares the raw close ratio around every declared action with the action factor, then checks whether the adjusted series remains continuous. A broader seam scan catches ticker reuse, reorganizations, and off-by-one action dates that a split table alone cannot explain.

3. Refresh the full dependency

StockQL treats a new corporate action as a full-history invalidation. The serving provider’s complete history is downloaded again; existing adjusted closes are restated, missing bars are inserted, and dependent indicators are recalculated. If the evidence remains contradictory, the symbol can be quarantined from screens without deleting its prices.

That workflow also preserves point-in-time honesty. Raw bars remain the record of what traded, while adjusted values can reflect the provider’s current corporate-action knowledge. Research that needs a vintage-specific adjusted series should snapshot the derived basis or store the action ledger needed to reproduce it.

4. Use a second source as an arbiter

StockQL keeps the broad primary feed, then asks a second provider a narrow question when continuity or an action factor looks wrong. Agreement at the raw boundary supports the event math; disagreement triggers inspection rather than majority rule. A clean alternate history can repair a stale adjustment, while an unresolved case stays visible as unavailable or quarantined.

This is composition at its most useful: the second subscription does not need to serve every query. It needs to be independent enough, in the tested domain, to make silent arithmetic observable.

Next: why “coverage” is not a single percentage →