{"slug":"how-much-slippage-to-assume-in-a-backtest","qid":"trade_distance_by_size","label":"Distance from the prevailing mid by trade size, AAPL, one midday hour","post_title":"How Much Slippage to Assume in a Backtest","post_url":"/blog/how-much-slippage-to-assume-in-a-backtest#q-trade_distance_by_size","columns":["size_bucket","avg_distance_bps","pct_outside_touch"],"rows":[{"size_bucket":"1 to 99 shares","avg_distance_bps":0.552,"pct_outside_touch":14.31},{"size_bucket":"100 to 499","avg_distance_bps":0.401,"pct_outside_touch":14.21},{"size_bucket":"500 to 999","avg_distance_bps":0.63,"pct_outside_touch":16.91},{"size_bucket":"1,000 to 4,999","avg_distance_bps":0.523,"pct_outside_touch":15.38},{"size_bucket":"5,000 or more","avg_distance_bps":4.638,"pct_outside_touch":36.36}],"shape":"ranking","sql":"WITH\n    quotes AS\n    (\n        SELECT\n            ticker,\n            sip_timestamp,\n            toFloat64(bid_price + ask_price) / 2 AS mid,\n            toFloat64(ask_price - bid_price) / 2 AS half_spread\n        FROM global_markets.cache_stocks_quotes\n        WHERE ticker = 'AAPL'\n          AND sip_timestamp >= toDateTime('2026-09-16 14:00:00', 'UTC')\n          AND sip_timestamp <  toDateTime('2026-09-16 15:00:00', 'UTC')\n          AND bid_price > 0\n          AND ask_price > bid_price\n    ),\n    fills AS\n    (\n        SELECT\n            ticker,\n            sip_timestamp,\n            toFloat64(price) AS fill_price,\n            size\n        FROM global_markets.stocks_trades\n        WHERE ticker = 'AAPL'\n          AND sip_timestamp >= toDateTime('2026-09-16 14:00:00', 'UTC')\n          AND sip_timestamp <  toDateTime('2026-09-16 15:00:00', 'UTC')\n          AND price > 0\n          AND size > 0\n    )\nSELECT\n    multiIf(f.size < 100,  '1 to 99 shares',\n            f.size < 500,  '100 to 499',\n            f.size < 1000, '500 to 999',\n            f.size < 5000, '1,000 to 4,999',\n                           '5,000 or more')                                      AS size_bucket,\n    round(avg(abs(f.fill_price - q.mid) / q.mid) * 10000, 3)                      AS avg_distance_bps,\n    round(100 * countIf(abs(f.fill_price - q.mid) > q.half_spread) / count(), 2)  AS pct_outside_touch\nFROM fills AS f\nASOF JOIN quotes AS q ON f.ticker = q.ticker AND f.sip_timestamp >= q.sip_timestamp\nGROUP BY size_bucket\nORDER BY min(f.size)","computed_at":"2026-10-08T16:10:23.961201+00:00","elapsed":0.005427768}