{"slug":"bullish-vs-bearish-meaning","qid":"daily_split","label":"daily_split","post_title":"bullish-vs-bearish-meaning","post_url":"/blog/lang/pcm/bullish-vs-bearish-meaning#q-daily_split","columns":["label","sessions","share_pct","history_from","history_to"],"rows":[{"label":"Up day","sessions":3167,"share_pct":54.7,"history_from":"Sep 2003","history_to":"Sep 2026"},{"label":"Down day","sessions":2609,"share_pct":45,"history_from":"Sep 2003","history_to":"Sep 2026"},{"label":"Flat day","sessions":16,"share_pct":0.3,"history_from":"Sep 2003","history_to":"Sep 2026"}],"shape":"table","sql":"WITH bars AS\n(\n    SELECT\n        date,\n        toFloat64(any(close)) AS close_price\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n      AND close > 0\n    GROUP BY date\n),\nmoves AS\n(\n    SELECT\n        date,\n        close_price,\n        lagInFrame(close_price, 1) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close\n    FROM bars\n),\ntotals AS\n(\n    SELECT\n        countIf(close_price > prev_close)    AS up_days,\n        countIf(close_price < prev_close)    AS down_days,\n        countIf(close_price = prev_close)    AS flat_days,\n        count()                              AS all_days,\n        formatDateTime(min(date), '%b %Y')   AS history_from,\n        formatDateTime(max(date), '%b %Y')   AS history_to\n    FROM moves\n    WHERE prev_close > 0\n)\nSELECT\n    label,\n    sessions,\n    round(100 * sessions / all_days, 1) AS share_pct,\n    history_from,\n    history_to\nFROM totals\nARRAY JOIN\n    ['Up day', 'Down day', 'Flat day'] AS label,\n    [up_days, down_days, flat_days]    AS sessions","computed_at":"2026-09-20T15:27:30.366014+00:00","elapsed":0.003414849}