{"slug":"market-recap-week-2026-07-20","qid":"week_spread_clock","label":"SPY median quoted spread and NBBO updates per session, regular hours, July 20-24","post_title":"Market Recap: Week of July 20, 2026","post_url":"/blog/market-recap-week-2026-07-20#q-week_spread_clock","columns":["date","median_spread_bps","quote_updates_m","one_sided_quote_count","crossed_quote_count"],"rows":[{"date":"2026-07-20","median_spread_bps":0.27,"quote_updates_m":3.89,"one_sided_quote_count":0,"crossed_quote_count":1084},{"date":"2026-07-21","median_spread_bps":0.27,"quote_updates_m":2.29,"one_sided_quote_count":0,"crossed_quote_count":333},{"date":"2026-07-22","median_spread_bps":0.27,"quote_updates_m":2.51,"one_sided_quote_count":0,"crossed_quote_count":747},{"date":"2026-07-23","median_spread_bps":0.27,"quote_updates_m":5.1,"one_sided_quote_count":0,"crossed_quote_count":5906},{"date":"2026-07-24","median_spread_bps":0.27,"quote_updates_m":4.4,"one_sided_quote_count":0,"crossed_quote_count":2777}],"shape":"series","sql":"SELECT toString(toDate(sip_timestamp)) AS date,\n       round(quantileExactIf(0.5)(\n           10000 * (toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2),\n           bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price), 2) AS median_spread_bps,\n       round(count() / 1e6, 2) AS quote_updates_m,\n       countIf(bid_price <= 0 OR ask_price <= 0) AS one_sided_quote_count,\n       countIf(bid_price > ask_price AND bid_price > 0 AND ask_price > 0) AS crossed_quote_count\nFROM global_markets.cache_stocks_quotes\nWHERE ticker = 'SPY'\n  AND sip_timestamp >= '2026-07-20 13:30:00'\n  AND sip_timestamp < '2026-07-24 20:00:00'\n  AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199\nGROUP BY toDate(sip_timestamp)\nHAVING countIf(bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price) > 0\nORDER BY toDate(sip_timestamp)","computed_at":"2026-08-12T14:47:57.224993+00:00","elapsed":0.003115522}