{"slug":"the-january-barometer","qid":"era_split","label":"era_split","post_title":"the-january-barometer","post_url":"/blog/the-january-barometer#q-era_split","columns":["era","years_in_sample","barometer_hit_pct","years_up_pct"],"rows":[{"era":"2000s","years_in_sample":6,"barometer_hit_pct":66.7,"years_up_pct":83.3},{"era":"2010s","years_in_sample":10,"barometer_hit_pct":50,"years_up_pct":70},{"era":"2020s","years_in_sample":6,"barometer_hit_pct":66.7,"years_up_pct":83.3}],"shape":"ranking","sql":"WITH yearly AS\n(\n    SELECT\n        toYear(date)                              AS y,\n        argMax(close, date)                       AS dec_close,\n        argMaxIf(close, date, toMonth(date) = 1)   AS jan_close,\n        countIf(toMonth(date) = 1)                AS jan_sessions,\n        countIf(toMonth(date) = 12)               AS dec_sessions\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n    GROUP BY y\n),\nscored AS\n(\n    SELECT\n        cur.y                                                   AS y,\n        toFloat64(cur.jan_close) / toFloat64(prev.dec_close) - 1 AS jan_ret,\n        toFloat64(cur.dec_close) / toFloat64(prev.dec_close) - 1 AS year_ret\n    FROM yearly AS cur\n    INNER JOIN yearly AS prev ON prev.y = cur.y - 1\n    WHERE cur.jan_sessions >= 15\n      AND cur.dec_sessions >= 15\n)\nSELECT\n    concat(toString(intDiv(y, 10) * 10), 's')          AS era,\n    count()                                            AS years_in_sample,\n    round(100 * avg((jan_ret > 0) = (year_ret > 0)), 1) AS barometer_hit_pct,\n    round(100 * avg(year_ret > 0), 1)                  AS years_up_pct\nFROM scored\nGROUP BY era\nORDER BY era","computed_at":"2026-10-02T15:44:31.799946+00:00","elapsed":0.004471403}