{"slug":"why-market-makers-lose-money","qid":"quote_distance_and_volume","label":"AAPL prints by distance from the midpoint: share of volume and 60 second markout","post_title":"Why Market Makers Lose Money: Adverse Selection","post_url":"/blog/why-market-makers-lose-money#q-quote_distance_and_volume","columns":["distance_from_mid","share_of_volume_pct","edge_after_60s_mils"],"rows":[{"distance_from_mid":"0.5 cents or less","share_of_volume_pct":27.58,"edge_after_60s_mils":0.95},{"distance_from_mid":"0.5 to 1 cent","share_of_volume_pct":18.05,"edge_after_60s_mils":7.56},{"distance_from_mid":"1 to 2 cents","share_of_volume_pct":21.18,"edge_after_60s_mils":12.49},{"distance_from_mid":"over 2 cents","share_of_volume_pct":33.19,"edge_after_60s_mils":46.86}],"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.cents <= 0.5, '0.5 cents or less',\n          s.cents <= 1.0, '0.5 to 1 cent',\n          s.cents <= 2.0, '1 to 2 cents',\n          'over 2 cents')                                  AS distance_from_mid,\n  round(100 * sum(s.shares) / sum(sum(s.shares)) OVER (), 2) AS share_of_volume_pct,\n  round(1000 * avg(s.taker_side * (s.px - f.mid)), 2)        AS edge_after_60s_mils\nFROM (\n  SELECT *, toUInt32(ts + 60) AS future_ts, abs(px - mid_at_fill) * 100 AS cents\n  FROM fills\n) AS s\nINNER JOIN qs AS f ON f.ts = s.future_ts\nGROUP BY distance_from_mid\nORDER BY min(s.cents)","computed_at":"2026-08-13T16:08:12.721282+00:00","elapsed":0.005175523}