{"slug":"why-relative-volume-differs-between-platforms","qid":"basis_curves","label":"Same session, same 10-session lookback: same-time basis vs full-day basis through the day","post_title":"Why Relative Volume Differs Between Platforms","post_url":"/blog/why-relative-volume-differs-between-platforms#q-basis_curves","columns":["et_time","same_time_basis_ratio","full_day_basis_ratio"],"rows":[{"et_time":"09:45","same_time_basis_ratio":3.1,"full_day_basis_ratio":0.26},{"et_time":"10:00","same_time_basis_ratio":2.48,"full_day_basis_ratio":0.35},{"et_time":"10:30","same_time_basis_ratio":1.92,"full_day_basis_ratio":0.46},{"et_time":"11:00","same_time_basis_ratio":1.88,"full_day_basis_ratio":0.6},{"et_time":"11:30","same_time_basis_ratio":1.88,"full_day_basis_ratio":0.74},{"et_time":"12:00","same_time_basis_ratio":2.02,"full_day_basis_ratio":0.92},{"et_time":"12:30","same_time_basis_ratio":2.01,"full_day_basis_ratio":1.04},{"et_time":"13:00","same_time_basis_ratio":2.16,"full_day_basis_ratio":1.21},{"et_time":"13:30","same_time_basis_ratio":2.12,"full_day_basis_ratio":1.3},{"et_time":"14:00","same_time_basis_ratio":2.16,"full_day_basis_ratio":1.43},{"et_time":"14:30","same_time_basis_ratio":2.09,"full_day_basis_ratio":1.51},{"et_time":"15:00","same_time_basis_ratio":2,"full_day_basis_ratio":1.59},{"et_time":"15:30","same_time_basis_ratio":1.98,"full_day_basis_ratio":1.69},{"et_time":"16:00","same_time_basis_ratio":1.87,"full_day_basis_ratio":1.87}],"shape":"series","sql":"WITH\n    toDate('2026-09-10') AS session_day,\n    [585, 600, 630, 660, 690, 720, 750, 780, 810, 840, 870, 900, 930, 960] AS checkpoints\nSELECT\n    formatDateTime(toDateTime(session_day, 'UTC') + checkpoints[i] * 60, '%H:%i', 'UTC') AS et_time,\n    round(session_cums[i] / typical_cums[i], 2)                                            AS same_time_basis_ratio,\n    round(session_cums[i] / typical_cums[14], 2)                                           AS full_day_basis_ratio\nFROM\n(\n    SELECT\n        arrayJoin(arrayEnumerate(checkpoints)) AS i,\n        session_cums,\n        arrayMap(k -> arrayAvg(x -> arrayElement(tupleElement(x, 2), k), arraySlice(prior, 1, 10)),\n                 arrayEnumerate(checkpoints)) AS typical_cums\n    FROM\n    (\n        SELECT\n            anyIf(cums, d = session_day)                                                        AS session_cums,\n            arrayReverseSort(x -> tupleElement(x, 1), groupArrayIf((d, cums), d < session_day)) AS prior\n        FROM\n        (\n            SELECT\n                d,\n                arrayMap(cp -> arraySum(x -> if(tupleElement(x, 1) <= cp, tupleElement(x, 2), 0), mv),\n                         checkpoints) AS cums\n            FROM\n            (\n                SELECT d, groupArray((minute_of_day, vol)) AS mv\n                FROM\n                (\n                    SELECT\n                        toDate(toTimeZone(window_start, 'America/New_York'))      AS d,\n                        toHour(toTimeZone(window_start, 'America/New_York')) * 60\n                          + toMinute(toTimeZone(window_start, 'America/New_York')) AS minute_of_day,\n                        max(toFloat64(volume))                                     AS vol\n                    FROM global_markets.delayed_stocks_minute_aggs\n                    WHERE ticker = 'AAPL'\n                      AND window_start >= toDateTime(session_day - 20, 'America/New_York')\n                      AND window_start <  toDateTime(session_day + 1, 'America/New_York')\n                    GROUP BY d, minute_of_day\n                    HAVING minute_of_day >= 570 AND minute_of_day <= 960\n                )\n                GROUP BY d\n            )\n        )\n        HAVING length(session_cums) = 14 AND length(prior) >= 10\n    )\n)\nORDER BY i","computed_at":"2026-09-16T14:57:17.556369+00:00","elapsed":0.107811654}