STRASMORE/EXPLORE 2,985 QUERIES

gap_percentiles

Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-10-03, from how-stock-splits-are-announced.

as of ranking 5×2read in context →
gap_percentiles — 5 rows by 2 columns, computed from US exchange, SIP and OPRA data.
percentilegap_days
p10 quickest9
p2514
p50 median40
p75170
p90 slowest295
Rows × columns
5 × 2
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for gap_percentiles, derived from the stored result.
ColumnTypeRangeNotes
percentile text 5 distinct values (p10 quickest, p25, p50 median…)
gap_days number 9 to 295

Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.

Run it yourself

This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.

WITH
split_events AS (
    SELECT
        ticker,
        execution_date,
        max(toFloat64(split_to))   AS to_shares,
        max(toFloat64(split_from)) AS from_shares
    FROM global_markets.stocks_splits
    WHERE execution_date >= today() - 730
      AND execution_date <  today()
      AND toFloat64(split_to) > toFloat64(split_from)
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker, execution_date
),
split_stories AS (
    SELECT
        arrayJoin(tickers)    AS story_ticker,
        toDate(published_utc) AS story_date
    FROM global_markets.stocks_news
    WHERE published_utc >= today() - 1140
      AND positionCaseInsensitive(title, 'split') > 0
),
gaps AS (
    SELECT
        e.ticker                                             AS ticker,
        e.execution_date                                     AS execution_date,
        dateDiff('day', min(s.story_date), e.execution_date)  AS gap_days
    FROM split_events AS e
    INNER JOIN split_stories AS s ON s.story_ticker = e.ticker
    WHERE s.story_date <  e.execution_date
      AND s.story_date >= e.execution_date - 400
    GROUP BY e.ticker, e.execution_date
)
SELECT
    p.1 AS percentile,
    p.2 AS gap_days
FROM
(
    SELECT arrayJoin([
        ('p10 quickest', toUInt32(round(quantileDeterministic(0.10)(toFloat64(gap_days), cityHash64(ticker, execution_date))))),
        ('p25',          toUInt32(round(quantileDeterministic(0.25)(toFloat64(gap_days), cityHash64(ticker, execution_date))))),
        ('p50 median',   toUInt32(round(quantileDeterministic(0.50)(toFloat64(gap_days), cityHash64(ticker, execution_date))))),
        ('p75',          toUInt32(round(quantileDeterministic(0.75)(toFloat64(gap_days), cityHash64(ticker, execution_date))))),
        ('p90 slowest',  toUInt32(round(quantileDeterministic(0.90)(toFloat64(gap_days), cityHash64(ticker, execution_date)))))
    ]) AS p
    FROM gaps
)
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.

More from this analysishow-stock-splits-are-announced
pending_splits table 33×5 → gap_by_month series 19×6 → fastest_slowest table 10×5 → Top 25 weekly-options underlyings by distinct contracts traded, with expiration weekdays ranking 25×4 → Annualized volatility vs total return, 25 large caps, calmest to wildest (~2 years) ranking 25×3 → SPY options median spread by expiration date, near-the-money strikes only ranking 25×4 → See all 2,985 queries →