{"slug":"portfolio-analysis-from-the-free-sql-api","qid":"drawdown","label":"Weekly peak-to-trough drawdown of the blended portfolio","post_title":"Portfolio Analysis in SQL: Weights to Drawdown","post_url":"/blog/portfolio-analysis-from-the-free-sql-api#q-drawdown","columns":["week","drawdown_pct","worst_drawdown_pct","week_label"],"rows":[{"week":"2025-10-06","drawdown_pct":-2.23,"worst_drawdown_pct":-7.48,"week_label":"Oct 6, 2025"},{"week":"2025-10-13","drawdown_pct":-1.86,"worst_drawdown_pct":-7.48,"week_label":"Oct 13, 2025"},{"week":"2025-10-20","drawdown_pct":-0.15,"worst_drawdown_pct":-7.48,"week_label":"Oct 20, 2025"},{"week":"2025-10-27","drawdown_pct":-1.01,"worst_drawdown_pct":-7.48,"week_label":"Oct 27, 2025"},{"week":"2025-11-03","drawdown_pct":-2.78,"worst_drawdown_pct":-7.48,"week_label":"Nov 3, 2025"},{"week":"2025-11-10","drawdown_pct":-0.94,"worst_drawdown_pct":-7.48,"week_label":"Nov 10, 2025"},{"week":"2025-11-17","drawdown_pct":-2.45,"worst_drawdown_pct":-7.48,"week_label":"Nov 17, 2025"},{"week":"2025-11-24","drawdown_pct":-1.39,"worst_drawdown_pct":-7.48,"week_label":"Nov 24, 2025"},{"week":"2025-12-01","drawdown_pct":-1.42,"worst_drawdown_pct":-7.48,"week_label":"Dec 1, 2025"},{"week":"2025-12-08","drawdown_pct":-1.06,"worst_drawdown_pct":-7.48,"week_label":"Dec 8, 2025"},{"week":"2025-12-15","drawdown_pct":-2.19,"worst_drawdown_pct":-7.48,"week_label":"Dec 15, 2025"},{"week":"2025-12-22","drawdown_pct":-1.4,"worst_drawdown_pct":-7.48,"week_label":"Dec 22, 2025"},{"week":"2025-12-29","drawdown_pct":-1.22,"worst_drawdown_pct":-7.48,"week_label":"Dec 29, 2025"},{"week":"2026-01-05","drawdown_pct":-2.68,"worst_drawdown_pct":-7.48,"week_label":"Jan 5, 2026"},{"week":"2026-01-12","drawdown_pct":-1.67,"worst_drawdown_pct":-7.48,"week_label":"Jan 12, 2026"},{"week":"2026-01-19","drawdown_pct":-2.52,"worst_drawdown_pct":-7.48,"week_label":"Jan 19, 2026"},{"week":"2026-01-26","drawdown_pct":-1.04,"worst_drawdown_pct":-7.48,"week_label":"Jan 26, 2026"},{"week":"2026-02-02","drawdown_pct":-0.57,"worst_drawdown_pct":-7.48,"week_label":"Feb 2, 2026"},{"week":"2026-02-09","drawdown_pct":-2.88,"worst_drawdown_pct":-7.48,"week_label":"Feb 9, 2026"},{"week":"2026-02-16","drawdown_pct":-2.25,"worst_drawdown_pct":-7.48,"week_label":"Feb 16, 2026"},{"week":"2026-02-23","drawdown_pct":-1.4,"worst_drawdown_pct":-7.48,"week_label":"Feb 23, 2026"},{"week":"2026-03-02","drawdown_pct":-3.1,"worst_drawdown_pct":-7.48,"week_label":"Mar 2, 2026"},{"week":"2026-03-09","drawdown_pct":-3.37,"worst_drawdown_pct":-7.48,"week_label":"Mar 9, 2026"},{"week":"2026-03-16","drawdown_pct":-5.05,"worst_drawdown_pct":-7.48,"week_label":"Mar 16, 2026"},{"week":"2026-03-23","drawdown_pct":-4.35,"worst_drawdown_pct":-7.48,"week_label":"Mar 23, 2026"},{"week":"2026-03-30","drawdown_pct":-4.26,"worst_drawdown_pct":-7.48,"week_label":"Mar 30, 2026"},{"week":"2026-04-06","drawdown_pct":-3.63,"worst_drawdown_pct":-7.48,"week_label":"Apr 6, 2026"},{"week":"2026-04-13","drawdown_pct":-3.23,"worst_drawdown_pct":-7.48,"week_label":"Apr 13, 2026"},{"week":"2026-04-20","drawdown_pct":-2.3,"worst_drawdown_pct":-7.48,"week_label":"Apr 20, 2026"},{"week":"2026-04-27","drawdown_pct":-1.07,"worst_drawdown_pct":-7.48,"week_label":"Apr 27, 2026"},{"week":"2026-05-04","drawdown_pct":-0.87,"worst_drawdown_pct":-7.48,"week_label":"May 4, 2026"},{"week":"2026-05-11","drawdown_pct":0,"worst_drawdown_pct":-7.48,"week_label":"May 11, 2026"},{"week":"2026-05-18","drawdown_pct":-0.32,"worst_drawdown_pct":-7.48,"week_label":"May 18, 2026"},{"week":"2026-05-25","drawdown_pct":-1.22,"worst_drawdown_pct":-7.48,"week_label":"May 25, 2026"},{"week":"2026-06-01","drawdown_pct":-1.86,"worst_drawdown_pct":-7.48,"week_label":"Jun 1, 2026"},{"week":"2026-06-08","drawdown_pct":-3.18,"worst_drawdown_pct":-7.48,"week_label":"Jun 8, 2026"},{"week":"2026-06-15","drawdown_pct":-5.1,"worst_drawdown_pct":-7.48,"week_label":"Jun 15, 2026"},{"week":"2026-06-22","drawdown_pct":-7.48,"worst_drawdown_pct":-7.48,"week_label":"Jun 22, 2026"},{"week":"2026-06-29","drawdown_pct":-5.29,"worst_drawdown_pct":-7.48,"week_label":"Jun 29, 2026"},{"week":"2026-07-06","drawdown_pct":-1.91,"worst_drawdown_pct":-7.48,"week_label":"Jul 6, 2026"},{"week":"2026-07-13","drawdown_pct":-0.8,"worst_drawdown_pct":-7.48,"week_label":"Jul 13, 2026"},{"week":"2026-07-20","drawdown_pct":-1.15,"worst_drawdown_pct":-7.48,"week_label":"Jul 20, 2026"},{"week":"2026-07-27","drawdown_pct":-1.56,"worst_drawdown_pct":-7.48,"week_label":"Jul 27, 2026"},{"week":"2026-08-03","drawdown_pct":-1.3,"worst_drawdown_pct":-7.48,"week_label":"Aug 3, 2026"},{"week":"2026-08-10","drawdown_pct":-0.63,"worst_drawdown_pct":-7.48,"week_label":"Aug 10, 2026"},{"week":"2026-08-17","drawdown_pct":-0.77,"worst_drawdown_pct":-7.48,"week_label":"Aug 17, 2026"},{"week":"2026-08-24","drawdown_pct":-1.22,"worst_drawdown_pct":-7.48,"week_label":"Aug 24, 2026"},{"week":"2026-08-31","drawdown_pct":-1.42,"worst_drawdown_pct":-7.48,"week_label":"Aug 31, 2026"},{"week":"2026-09-07","drawdown_pct":-2.46,"worst_drawdown_pct":-7.48,"week_label":"Sep 7, 2026"},{"week":"2026-09-14","drawdown_pct":-1.71,"worst_drawdown_pct":-7.48,"week_label":"Sep 14, 2026"},{"week":"2026-09-21","drawdown_pct":-0.69,"worst_drawdown_pct":-7.48,"week_label":"Sep 21, 2026"},{"week":"2026-09-28","drawdown_pct":-1.36,"worst_drawdown_pct":-7.48,"week_label":"Sep 28, 2026"},{"week":"2026-10-05","drawdown_pct":-0.63,"worst_drawdown_pct":-7.48,"week_label":"Oct 5, 2026"}],"shape":"series","sql":"WITH holdings AS\n(\n    SELECT 'AAPL' AS ticker, 120 AS shares\n    UNION ALL SELECT 'MSFT', 45\n    UNION ALL SELECT 'NVDA', 80\n    UNION ALL SELECT 'KO',   300\n    UNION ALL SELECT 'JNJ',  90\n    UNION ALL SELECT 'XOM',  150\n),\npx AS\n(\n    SELECT\n        ticker,\n        date,\n        max(toFloat64(close)) AS close\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'KO', 'JNJ', 'XOM')\n      AND date >= today() - 400\n      AND date <  today()\n    GROUP BY ticker, date\n),\ndaily AS\n(\n    SELECT\n        p.date                      AS date,\n        sum(h.shares * p.close)     AS portfolio_value,\n        count()                     AS names_priced\n    FROM px AS p\n    INNER JOIN holdings AS h ON h.ticker = p.ticker\n    GROUP BY p.date\n    HAVING names_priced = 6\n),\ncurve AS\n(\n    SELECT\n        date,\n        portfolio_value,\n        max(portfolio_value) OVER (ORDER BY date\n            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak\n    FROM daily\n),\nweekly AS\n(\n    SELECT\n        toMonday(date)                                            AS week_start,\n        round(min(100 * (portfolio_value / running_peak - 1)), 2)  AS drawdown_pct\n    FROM curve\n    WHERE date >= today() - 365\n    GROUP BY week_start\n)\nSELECT\n    toString(week_start)                    AS week,\n    drawdown_pct,\n    round(min(drawdown_pct) OVER (), 2)     AS worst_drawdown_pct,\n    formatDateTime(week_start, '%b %e, %Y') AS week_label\nFROM weekly\nORDER BY week","computed_at":"2026-10-07T15:11:31.136611+00:00","elapsed":0.184419105}