{"slug":"iron-condor-win-rate-and-expectancy","qid":"touch_vs_itm","label":"Short strikes touched versus short strikes finishing in the money","post_title":"Iron Condor Win Rate and Expectancy","post_url":"/blog/iron-condor-win-rate-and-expectancy#q-touch_vs_itm","columns":["month","touched_strike_pct","finished_itm_pct","touch_to_itm_ratio","tracked_count"],"rows":[{"month":"2026-02","touched_strike_pct":25,"finished_itm_pct":14.3,"touch_to_itm_ratio":1.75,"tracked_count":56},{"month":"2026-03","touched_strike_pct":40.3,"finished_itm_pct":30.6,"touch_to_itm_ratio":1.32,"tracked_count":62},{"month":"2026-04","touched_strike_pct":50,"finished_itm_pct":48.1,"touch_to_itm_ratio":1.04,"tracked_count":52},{"month":"2026-05","touched_strike_pct":20.7,"finished_itm_pct":1.7,"touch_to_itm_ratio":12,"tracked_count":58},{"month":"2026-07","touched_strike_pct":37.1,"finished_itm_pct":12.9,"touch_to_itm_ratio":2.88,"tracked_count":62}],"shape":"series","sql":"WITH shorts AS\n(\n    SELECT\n        date                                                   AS entry_date,\n        expiration_date                                        AS expiry,\n        if(delta < 0, 'put', 'call')                           AS side,\n        argMin(toFloat64(strike_price), abs(abs(delta) - 0.16)) AS short_strike\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol = 'SPY'\n      AND date >= '2026-01-02'\n      AND date <  '2026-08-01'\n      AND iv_converged = 1\n      AND volume > 100\n      AND days_to_expiry BETWEEN 28 AND 35\n      AND abs(delta) BETWEEN 0.13 AND 0.19\n    GROUP BY entry_date, expiry, side\n),\ntape AS\n(\n    SELECT\n        date,\n        toFloat64(high)  AS high,\n        toFloat64(low)   AS low,\n        toFloat64(close) AS close\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n      AND date >= '2026-01-02'\n      AND date <= '2026-09-30'\n),\noutcomes AS\n(\n    SELECT\n        s.entry_date            AS entry_date,\n        s.expiry                AS expiry,\n        s.side                  AS side,\n        s.short_strike          AS short_strike,\n        max(t.high)             AS path_high,\n        min(t.low)              AS path_low,\n        argMax(t.close, t.date) AS final_close\n    FROM shorts AS s\n    CROSS JOIN tape AS t\n    WHERE t.date >  s.entry_date\n      AND t.date <= s.expiry\n    GROUP BY entry_date, expiry, side, short_strike\n)\nSELECT\n    formatDateTime(toStartOfMonth(entry_date), '%Y-%m') AS month,\n    round(100 * avg(if(side = 'put', path_low <= short_strike,\n                                     path_high >= short_strike)), 1) AS touched_strike_pct,\n    round(100 * avg(if(side = 'put', final_close < short_strike,\n                                     final_close > short_strike)), 1) AS finished_itm_pct,\n    round(avg(if(side = 'put', path_low <= short_strike, path_high >= short_strike))\n        / avg(if(side = 'put', final_close < short_strike, final_close > short_strike)), 2)\n                                                                      AS touch_to_itm_ratio,\n    count()                                                           AS tracked_count\nFROM outcomes\nGROUP BY month\nHAVING countIf(if(side = 'put', final_close < short_strike, final_close > short_strike)) > 0\nORDER BY month","computed_at":"2026-10-05T15:06:03.234306+00:00","elapsed":0.007334304}