{"slug":"why-market-makers-lose-money","qid":"inventory_drift","label":"How far the price travels while a position waits: SPY and NVDA, May 2026","post_title":"Why Market Makers Lose Money: Adverse Selection","post_url":"/blog/why-market-makers-lose-money#q-inventory_drift","columns":["hold_horizon","spy_drift_bps","nvda_drift_bps"],"rows":[{"hold_horizon":"1 min","spy_drift_bps":1.9,"nvda_drift_bps":5.5},{"hold_horizon":"2 min","spy_drift_bps":2.7,"nvda_drift_bps":7.7},{"hold_horizon":"5 min","spy_drift_bps":4.2,"nvda_drift_bps":12},{"hold_horizon":"15 min","spy_drift_bps":7.1,"nvda_drift_bps":20.4},{"hold_horizon":"30 min","spy_drift_bps":10,"nvda_drift_bps":28.8},{"hold_horizon":"60 min","spy_drift_bps":14.1,"nvda_drift_bps":40.4}],"shape":"ranking","sql":"WITH\n  bars AS (\n    SELECT ticker, window_start,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,\n           toFloat64(close) AS px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('SPY', 'NVDA')\n      AND window_start >= '2026-05-01 00:00:00'\n      AND window_start <  '2026-06-01 00:00:00'\n      AND transactions >= 50\n      AND close > 0\n  ),\n  starts AS (\n    SELECT ticker, et_date, px, mins,\n           window_start + toIntervalMinute(mins) AS future_start\n    FROM (SELECT *, arrayJoin([1, 2, 5, 15, 30, 60]) AS mins FROM bars)\n  )\nSELECT\n  concat(toString(s.mins), ' min')                                AS hold_horizon,\n  round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'SPY'), 1)  AS spy_drift_bps,\n  round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'NVDA'), 1) AS nvda_drift_bps\nFROM starts AS s\nINNER JOIN bars AS f\n  ON f.ticker = s.ticker AND f.et_date = s.et_date AND f.window_start = s.future_start\nGROUP BY s.mins\nHAVING countIf(s.ticker = 'SPY') > 0 AND countIf(s.ticker = 'NVDA') > 0\nORDER BY s.mins","computed_at":"2026-08-13T16:08:12.626892+00:00","elapsed":1.583306376}