{"slug":"trade-markouts-explained","qid":"markout_curve","label":"INTC markout curve, June 10 2026, measured from two reference bases","post_title":"Trade Markouts Explained: Execution Quality","post_url":"/blog/trade-markouts-explained#q-markout_curve","columns":["horizon","mid_basis_bps","fill_basis_bps","fill_count"],"rows":[{"horizon":"1 sec","mid_basis_bps":3.068,"fill_basis_bps":-0.488,"fill_count":900593},{"horizon":"5 sec","mid_basis_bps":2.856,"fill_basis_bps":-0.692,"fill_count":899654},{"horizon":"15 sec","mid_basis_bps":2.778,"fill_basis_bps":-0.778,"fill_count":899918},{"horizon":"1 min","mid_basis_bps":3.806,"fill_basis_bps":0.249,"fill_count":899593},{"horizon":"5 min","mid_basis_bps":2.977,"fill_basis_bps":-0.579,"fill_count":899207}],"shape":"ranking","sql":"WITH\n    mid_by_second AS\n    (\n        SELECT\n            dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,\n            argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp)    AS mid\n        FROM global_markets.cache_stocks_quotes\n        WHERE ticker = 'INTC'\n          AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')\n          AND sip_timestamp <  toDateTime('2026-06-10 20:00:00', 'UTC')\n          AND bid_price > 0\n          AND ask_price > bid_price\n        GROUP BY sec\n    ),\n    signed_fills AS\n    (\n        SELECT\n            t.sec        AS sec,\n            t.fill_price AS fill_price,\n            q.mid        AS ref_mid,\n            if(t.fill_price > q.mid, 1, -1) AS side\n        FROM\n        (\n            SELECT\n                dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,\n                sec - 1          AS ref_sec,\n                toFloat64(price) AS fill_price\n            FROM global_markets.stocks_trades\n            WHERE ticker = 'INTC'\n              AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')\n              AND sip_timestamp <  toDateTime('2026-06-10 19:55:00', 'UTC')\n              AND price > 0\n              AND size > 0\n        ) AS t\n        INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec\n        WHERE t.fill_price != q.mid\n    )\nSELECT\n    multiIf(f.horizon_s < 60,\n            concat(toString(f.horizon_s), ' sec'),\n            concat(toString(intDiv(f.horizon_s, 60)), ' min'))              AS horizon,\n    round(avg(f.side * (fut.mid - f.ref_mid) / f.ref_mid) * 10000, 3)       AS mid_basis_bps,\n    round(avg(f.side * (fut.mid - f.fill_price) / f.fill_price) * 10000, 3) AS fill_basis_bps,\n    count()                                                                 AS fill_count\nFROM\n(\n    SELECT\n        sec,\n        fill_price,\n        ref_mid,\n        side,\n        horizon_s,\n        sec + horizon_s AS future_sec\n    FROM signed_fills\n    ARRAY JOIN [1, 5, 15, 60, 300] AS horizon_s\n) AS f\nINNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec\nGROUP BY f.horizon_s\nORDER BY f.horizon_s","computed_at":"2026-08-15T16:21:16.551692+00:00","elapsed":0.005582723}