{"slug":"why-market-makers-lose-money","qid":"markout_by_size","label":"AAPL fills by print size: credit at the fill and value 60 seconds later","post_title":"Why Market Makers Lose Money: Adverse Selection","post_url":"/blog/why-market-makers-lose-money#q-markout_by_size","columns":["size_bucket","fills_count","edge_at_fill_mils","edge_after_60s_mils"],"rows":[{"size_bucket":"under 100 shares","fills_count":283378,"edge_at_fill_mils":19.47,"edge_after_60s_mils":15.22},{"size_bucket":"100 to 499","fills_count":25710,"edge_at_fill_mils":21.44,"edge_after_60s_mils":22.27},{"size_bucket":"500 to 999","fills_count":1134,"edge_at_fill_mils":22.65,"edge_after_60s_mils":9.1},{"size_bucket":"1,000 or more","fills_count":722,"edge_at_fill_mils":36.26,"edge_after_60s_mils":21.34}],"shape":"ranking","sql":"WITH\n  qs AS (\n    SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,\n           avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid\n    FROM global_markets.cache_stocks_quotes\n    WHERE ticker = 'AAPL'\n      AND sip_timestamp >= '2026-05-14 14:00:00'\n      AND sip_timestamp <  '2026-05-14 17:06:00'\n      AND bid_price > 0 AND ask_price > bid_price\n    GROUP BY ts\n  ),\n  fills AS (\n    SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,\n           if(t.px > q.mid, 1, -1) AS taker_side\n    FROM (\n      SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,\n             toFloat64(price) AS px, toUInt64(size) AS shares\n      FROM global_markets.stocks_trades\n      WHERE ticker = 'AAPL'\n        AND sip_timestamp >= '2026-05-14 14:00:00'\n        AND sip_timestamp <  '2026-05-14 17:00:00'\n        AND size > 0\n    ) AS t\n    INNER JOIN qs AS q ON q.ts = t.ts\n    WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02\n  )\nSELECT\n  multiIf(s.shares < 100, 'under 100 shares',\n          s.shares < 500, '100 to 499',\n          s.shares < 1000, '500 to 999',\n          '1,000 or more')                                    AS size_bucket,\n  count()                                                     AS fills_count,\n  round(1000 * avg(s.taker_side * (s.px - s.mid_at_fill)), 2) AS edge_at_fill_mils,\n  round(1000 * avg(s.taker_side * (s.px - f.mid)), 2)         AS edge_after_60s_mils\nFROM (SELECT *, toUInt32(ts + 60) AS future_ts FROM fills) AS s\nINNER JOIN qs AS f ON f.ts = s.future_ts\nGROUP BY size_bucket\nORDER BY min(s.shares)","computed_at":"2026-08-13T16:08:10.948652+00:00","elapsed":0.005789798}