{"slug":"learn-quant-trading-open-source-book","qid":"spread_curve","label":"Average quoted spread by ET half hour: AAPL and KO, Friday July 17, 2026","post_title":"Learn Quant Trading From an Open Source Book","post_url":"/blog/learn-quant-trading-open-source-book#q-spread_curve","columns":["et_time","aapl_spread_bps","ko_spread_bps"],"rows":[{"et_time":"09:00","aapl_spread_bps":10.53,"ko_spread_bps":28.87},{"et_time":"09:30","aapl_spread_bps":2.38,"ko_spread_bps":3.32},{"et_time":"10:00","aapl_spread_bps":1.9,"ko_spread_bps":2.41},{"et_time":"10:30","aapl_spread_bps":1.44,"ko_spread_bps":1.97},{"et_time":"11:00","aapl_spread_bps":1.27,"ko_spread_bps":1.78},{"et_time":"11:30","aapl_spread_bps":1.21,"ko_spread_bps":1.6},{"et_time":"12:00","aapl_spread_bps":1.35,"ko_spread_bps":1.58},{"et_time":"12:30","aapl_spread_bps":1.42,"ko_spread_bps":1.49},{"et_time":"13:00","aapl_spread_bps":1.17,"ko_spread_bps":1.43},{"et_time":"13:30","aapl_spread_bps":1.02,"ko_spread_bps":1.44},{"et_time":"14:00","aapl_spread_bps":0.94,"ko_spread_bps":1.33},{"et_time":"14:30","aapl_spread_bps":1.05,"ko_spread_bps":1.43},{"et_time":"15:00","aapl_spread_bps":0.88,"ko_spread_bps":1.35},{"et_time":"15:30","aapl_spread_bps":1.01,"ko_spread_bps":1.34},{"et_time":"16:00","aapl_spread_bps":4.54,"ko_spread_bps":8.47},{"et_time":"16:30","aapl_spread_bps":3.27,"ko_spread_bps":8.04}],"shape":"series","sql":"WITH quotes AS (\n    SELECT ticker,\n           toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE) AS bucket,\n           toFloat64(ask_price - bid_price) / toFloat64((ask_price + bid_price) / 2) * 10000 AS spread_bps\n    FROM global_markets.cache_stocks_quotes\n    WHERE ticker IN ('AAPL', 'KO')\n      AND sip_timestamp >= toDateTime('2026-07-17 13:00:00')\n      AND sip_timestamp < toDateTime('2026-07-17 21:00:00')\n      AND bid_price > 0\n      AND ask_price > bid_price\n)\nSELECT formatDateTime(bucket, '%H:%i') AS et_time,\n       round(avgIf(spread_bps, ticker = 'AAPL'), 2) AS aapl_spread_bps,\n       round(avgIf(spread_bps, ticker = 'KO'), 2) AS ko_spread_bps\nFROM quotes\nWHERE spread_bps > 0 AND spread_bps < 500\nGROUP BY et_time\nHAVING countIf(ticker = 'AAPL') > 0 AND countIf(ticker = 'KO') > 0\nORDER BY et_time","computed_at":"2026-08-02T08:19:52.509680+00:00","elapsed":0.003073419}