{"slug":"what-is-the-ttm-squeeze","qid":"forward_move_after_squeeze","label":"What the next ten sessions did, squeeze against no squeeze","post_title":"What Is the TTM Squeeze? Formula and Limits","post_url":"/blog/what-is-the-ttm-squeeze#q-forward_move_after_squeeze","columns":["label","observation_count","up_share_pct","avg_abs_move_pct"],"rows":[{"label":"In a squeeze","observation_count":558,"up_share_pct":55,"avg_abs_move_pct":3.52},{"label":"No squeeze","observation_count":3888,"up_share_pct":57.8,"avg_abs_move_pct":3.78}],"shape":"ranking","sql":"WITH\npx AS\n(\n    SELECT\n        ticker,\n        date,\n        toFloat64(any(close)) AS c,\n        toFloat64(any(high))  AS h,\n        toFloat64(any(low))   AS l\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')\n      AND date >= '2023-07-01'\n      AND date <  '2026-09-01'\n    GROUP BY ticker, date\n),\ntr AS\n(\n    SELECT\n        ticker,\n        date,\n        c,\n        h,\n        l,\n        lagInFrame(c) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_c\n    FROM px\n),\nstat AS\n(\n    SELECT\n        ticker,\n        date,\n        c,\n        stddevPop(c) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 19 PRECEDING AND CURRENT ROW) AS sd,\n        count()      OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 19 PRECEDING AND CURRENT ROW) AS bars,\n        avg(if(prev_c > 0, greatest(h - l, abs(h - prev_c), abs(l - prev_c)), h - l))\n                     OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 19 PRECEDING AND CURRENT ROW) AS atr\n    FROM tr\n),\nfwd AS\n(\n    SELECT\n        date,\n        c,\n        bars,\n        if(4 * sd < 3 * atr, 'In a squeeze', 'No squeeze') AS label,\n        leadInFrame(c, 10) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN CURRENT ROW AND 10 FOLLOWING) AS c_fwd\n    FROM stat\n)\nSELECT\n    label,\n    count()                                      AS observation_count,\n    round(100 * countIf(c_fwd > c) / count(), 1) AS up_share_pct,\n    round(100 * avg(abs(c_fwd / c - 1)), 2)      AS avg_abs_move_pct\nFROM fwd\nWHERE bars = 20\n  AND date >= '2023-09-01'\n  AND c_fwd > 0\nGROUP BY label\nORDER BY label","computed_at":"2026-09-27T16:13:38.082051+00:00","elapsed":0.009041752}