{"slug":"can-a-death-cross-be-bullish","qid":"covid_2020","label":"covid_2020","post_title":"can-a-death-cross-be-bullish","post_url":"/blog/can-a-death-cross-be-bullish#q-covid_2020","columns":["peak_day","peak_close","low_day","low_close","cross_day","cross_close","golden_day","golden_close","peak_to_low_drop_pct","sessions_peak_to_low","sessions_low_to_cross","low_to_cross_gain_pct","cross_off_peak_pct","sessions_cross_to_golden","cross_to_golden_gain_pct","fwd_12m_pct"],"rows":[{"peak_day":"Feb 19, 2020","peak_close":338.34,"low_day":"Mar 23, 2020","low_close":222.95,"cross_day":"Mar 30, 2020","cross_close":261.65,"golden_day":"Jul 9, 2020","golden_close":314.38,"peak_to_low_drop_pct":34.1,"sessions_peak_to_low":23,"sessions_low_to_cross":5,"low_to_cross_gain_pct":17.4,"cross_off_peak_pct":22.7,"sessions_cross_to_golden":70,"cross_to_golden_gain_pct":20.2,"fwd_12m_pct":50.9}],"shape":"scalar","sql":"WITH\nbars AS\n(\n    SELECT\n        date,\n        toFloat64(argMax(close, _ingest_time)) AS px\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n    GROUP BY date\n),\nsmas AS\n(\n    SELECT\n        date,\n        px,\n        row_number() OVER (ORDER BY date) AS rn,\n        avg(px) OVER (ORDER BY date ROWS BETWEEN 49 PRECEDING AND CURRENT ROW) AS avg_50,\n        avg(px) OVER (ORDER BY date ROWS BETWEEN 199 PRECEDING AND CURRENT ROW) AS avg_200,\n        max(px) OVER (ORDER BY date ROWS BETWEEN 251 PRECEDING AND CURRENT ROW) AS high_1y,\n        leadInFrame(px, 21) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS px_1m,\n        leadInFrame(px, 63) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS px_3m,\n        leadInFrame(px, 126) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS px_6m,\n        leadInFrame(px, 252) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS px_12m\n    FROM bars\n),\nstates AS\n(\n    SELECT\n        *,\n        (avg_50 < avg_200) AS below,\n        lagInFrame((avg_50 < avg_200), 1) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS prev_below\n    FROM smas\n),\nflags AS\n(\n    SELECT\n        *,\n        (rn >= 201 AND below = 1 AND prev_below = 0) AS is_death,\n        (rn >= 201 AND below = 0 AND prev_below = 1) AS is_golden\n    FROM states\n),\ncross_row AS\n(\n    SELECT date AS cross_date, px AS cross_px, rn AS cross_rn, px_12m AS cross_px_12m\n    FROM flags\n    WHERE is_death\n      AND date BETWEEN toDate('2020-02-01') AND toDate('2020-05-31')\n    ORDER BY date\n    LIMIT 1\n),\ngolden_row AS\n(\n    SELECT date AS golden_date, px AS golden_px, rn AS golden_rn\n    FROM flags\n    WHERE is_golden\n      AND date BETWEEN toDate('2020-04-01') AND toDate('2020-12-31')\n    ORDER BY date\n    LIMIT 1\n),\npeak_row AS\n(\n    SELECT date AS peak_date, px AS peak_px, rn AS peak_rn\n    FROM flags\n    WHERE date BETWEEN toDate('2020-01-01') AND toDate('2020-03-31')\n    ORDER BY px DESC\n    LIMIT 1\n),\nlow_row AS\n(\n    SELECT date AS low_date, px AS low_px, rn AS low_rn\n    FROM flags\n    WHERE date BETWEEN toDate('2020-02-01') AND toDate('2020-06-30')\n    ORDER BY px ASC\n    LIMIT 1\n)\nSELECT\n    concat(formatDateTime(peak_date, '%b'), ' ', toString(toDayOfMonth(peak_date)), ', ', toString(toYear(peak_date)))       AS peak_day,\n    round(peak_px, 2)                                  AS peak_close,\n    concat(formatDateTime(low_date, '%b'), ' ', toString(toDayOfMonth(low_date)), ', ', toString(toYear(low_date)))           AS low_day,\n    round(low_px, 2)                                   AS low_close,\n    concat(formatDateTime(cross_date, '%b'), ' ', toString(toDayOfMonth(cross_date)), ', ', toString(toYear(cross_date)))     AS cross_day,\n    round(cross_px, 2)                                 AS cross_close,\n    concat(formatDateTime(golden_date, '%b'), ' ', toString(toDayOfMonth(golden_date)), ', ', toString(toYear(golden_date))) AS golden_day,\n    round(golden_px, 2)                                AS golden_close,\n    round((1 - low_px / peak_px) * 100, 1)             AS peak_to_low_drop_pct,\n    toInt64(low_rn) - toInt64(peak_rn)                 AS sessions_peak_to_low,\n    toInt64(cross_rn) - toInt64(low_rn)                AS sessions_low_to_cross,\n    round((cross_px / low_px - 1) * 100, 1)            AS low_to_cross_gain_pct,\n    round((1 - cross_px / peak_px) * 100, 1)           AS cross_off_peak_pct,\n    toInt64(golden_rn) - toInt64(cross_rn)             AS sessions_cross_to_golden,\n    round((golden_px / cross_px - 1) * 100, 1)         AS cross_to_golden_gain_pct,\n    round((cross_px_12m / cross_px - 1) * 100, 1)      AS fwd_12m_pct\nFROM cross_row, peak_row, low_row, golden_row","computed_at":"2026-09-13T15:00:29.185165+00:00","elapsed":0.004087316}