Trade Markouts Explained: Execution Quality
Effective spread split into realized spread and adverse selection, by half hourseries ·
2026-08-15 · 13×5
INTC markout curve, June 10 2026, measured from two reference basesranking ·
2026-08-15 · 5×4
The same curve, split by print size: small fills against blocksranking ·
2026-08-15 · 5×4
Effective spread split into realized spread and adverse selection, by half hour
Effective spread split into realized spread and adverse selection, by half hour
| et_time | effective_spread_bps | realized_spread_bps | adverse_selection_bps | fill_count |
|---|---|---|---|---|
| 09:30 | 10.651 | 2.338 | 8.313 | 156976 |
| 10:00 | 8.053 | 1.892 | 6.161 | 93545 |
| 10:30 | 7.573 | -9.091 | 16.665 | 95266 |
| 11:00 | 7.079 | 1.666 | 5.414 | 87234 |
| 11:30 | 7.704 | -4.864 | 12.568 | 69850 |
| 12:00 | 5.624 | 3.918 | 1.707 | 48500 |
| 12:30 | 5.151 | 0.038 | 5.112 | 45567 |
| 13:00 | 4.667 | 0.932 | 3.735 | 39236 |
| 13:30 | 5.598 | -0.034 | 5.632 | 43249 |
| 14:00 | 4.59 | -1.134 | 5.723 | 38018 |
| 14:30 | 4.504 | 1.256 | 3.249 | 48662 |
| 15:00 | 5.29 | -1.615 | 6.905 | 64389 |
| 15:30 | 6.184 | -1.08 | 7.265 | 69101 |
the exact SQL behind every number
WITH
mid_by_second AS
(
SELECT
dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'INTC'
AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 20:00:00', 'UTC')
AND bid_price > 0
AND ask_price > bid_price
GROUP BY sec
),
signed_fills AS
(
SELECT
t.sec + 60 AS future_sec,
t.et_time AS et_time,
t.fill_price AS fill_price,
q.mid AS ref_mid,
if(t.fill_price > q.mid, 1, -1) AS side
FROM
(
SELECT
dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
sec - 1 AS ref_sec,
toFloat64(price) AS fill_price,
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), toIntervalMinute(30)), '%H:%i') AS et_time
FROM global_markets.stocks_trades
WHERE ticker = 'INTC'
AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 19:55:00', 'UTC')
AND price > 0
AND size > 0
) AS t
INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
WHERE t.fill_price != q.mid
)
SELECT
f.et_time AS et_time,
round(avg(2 * f.side * (f.fill_price - f.ref_mid) / f.ref_mid) * 10000, 3) AS effective_spread_bps,
round(avg(2 * f.side * (f.fill_price - fut.mid) / f.ref_mid) * 10000, 3) AS realized_spread_bps,
round(avg(2 * f.side * (fut.mid - f.ref_mid) / f.ref_mid) * 10000, 3) AS adverse_selection_bps,
count() AS fill_count
FROM signed_fills AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.et_time
ORDER BY f.et_time
More from this analysisTrade Markouts Explained: Execution Quality
INTC markout curve, June 10 2026, measured from two reference bases
ranking 5×4
→
The same curve, split by print size: small fills against blocks
ranking 5×4
→
How much of the spread survives: AAPL markout curve, 1 second to 5 minutes
ranking 6×3
→
How far the price travels while a position waits: SPY and NVDA, May 2026
ranking 6×3
→
See all 2,173 queries →