{
 "title": "Split-adjusted prices can change after ingestion \u2014 StockQL",
 "description": "Map raw and adjusted price semantics, detect stale split restatements, and use a second provider as an arithmetic arbiter.",
 "url": "https://stockql.ai/blog/split-adjusted-prices-can-change.html",
 "slug": "blog/split-adjusted-prices-can-change",
 "published": "2026-09-24",
 "site": "StockQL",
 "contact": "hello@stockql.ai",
 "body_text": "Market-data tradeoffs \u00b7 Price history\n\nSplit-adjusted prices can change after you ingest them\n\nA new corporate action can rewrite years of adjusted history. Appending today\u2019s bar is not enough when the basis of every earlier bar has changed.\n\nSeptember 13, 2026 \u00b7 6 minute read\n\nIn this article\n\nName each price series\n\nDetect silent restatement failures\n\nRefresh the full dependency\n\nUse a second source as an arbiter\n\nAdjusted 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.\n\nThe result often looks like alpha. Momentum jumps, drawdown spikes, and a backtest trades around a return that no shareholder experienced.\n\nDependency rule. If today\u2019s event changes the meaning of yesterday\u2019s adjusted close, the update boundary is the full history\u2014not today\u2019s row.\n\n1. Name each price series\n\nProvider field names are not a shared contract. EODHD serves printed OHLC values beside an adjusted_close . Financial Modeling Prep\u2019s 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.\n\nThat 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.\n\nStored fact Meaning Typical use\n\nRaw close The price printed for that session Execution, limit checks, corporate-action arithmetic\n\nSplit-adjusted close Earlier prices rebased for share-count changes Price momentum and continuity\n\nTotal-return close Split and distribution effects combined Return measurement when distributions are reinvested\n\n2. Detect silent restatement failures\n\nStockQL compared 55 labeled histories containing known corporate-action boundaries. FMP was arithmetically clean on the headline EODHD failures, including HAO\u2019s 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.\n\nThe comparison was not a blanket endorsement. FMP missed QH\u2019s 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.\n\nA 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.\n\n3. Refresh the full dependency\n\nStockQL treats a new corporate action as a full-history invalidation. The serving provider\u2019s 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.\n\nThat workflow also preserves point-in-time honesty. Raw bars remain the record of what traded, while adjusted values can reflect the provider\u2019s 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.\n\n4. Use a second source as an arbiter\n\nStockQL 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.\n\nThis 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.\n\nOperational checklist. Preserve raw prices; map semantics explicitly; scan for large adjusted seams; re-fetch all earlier adjusted rows after an action; recalculate dependents; quarantine unresolved contradictions.\nNext: why \u201ccoverage\u201d is not a single percentage \u2192"
}
