{"slug":"what-is-the-sharpe-ratio","qid":"sharpe_by_frequency","label":"One year of SPY, three sampling frequencies, one annualized Sharpe ratio","post_title":"What Is the Sharpe Ratio? Formula and Math","post_url":"/blog/what-is-the-sharpe-ratio#q-sharpe_by_frequency","columns":["sampling","per_period_sharpe","annualized_sharpe"],"rows":[{"sampling":"Daily","per_period_sharpe":0.0431,"annualized_sharpe":0.68},{"sampling":"Weekly","per_period_sharpe":0.0915,"annualized_sharpe":0.66},{"sampling":"Monthly","per_period_sharpe":0.3009,"annualized_sharpe":1.04}],"shape":"ranking","sql":"WITH\n    daily AS\n    (\n        SELECT\n            toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,\n            argMax(toFloat64(close), window_start)               AS close_px\n        FROM global_markets.delayed_stocks_minute_aggs\n        WHERE ticker = 'SPY'\n          AND window_start >= toDateTime('2024-12-24 00:00:00')\n          AND window_start <  toDateTime('2026-01-01 05:00:00')\n          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n             + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570\n          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n             + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960\n        GROUP BY session_date\n    ),\n    freqs AS\n    (\n        SELECT\n            arrayJoin([('Daily', 252), ('Weekly', 52), ('Monthly', 12)]) AS pair,\n            pair.1                                                       AS sampling,\n            pair.2                                                       AS periods_per_year\n    ),\n    bucketed AS\n    (\n        SELECT\n            f.sampling                         AS sampling,\n            f.periods_per_year                 AS periods_per_year,\n            multiIf(f.sampling = 'Daily',  d.session_date,\n                    f.sampling = 'Weekly', toMonday(d.session_date),\n                                           toStartOfMonth(d.session_date)) AS period_key,\n            argMax(d.close_px, d.session_date) AS period_close\n        FROM daily AS d\n        CROSS JOIN freqs AS f\n        GROUP BY sampling, periods_per_year, period_key\n    ),\n    stepped AS\n    (\n        SELECT\n            sampling,\n            periods_per_year,\n            period_key,\n            period_close,\n            lagInFrame(period_close, 1) OVER (PARTITION BY sampling ORDER BY period_key\n                                              ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close\n        FROM bucketed\n    ),\n    per_period AS\n    (\n        SELECT\n            sampling,\n            periods_per_year,\n            period_close / prev_close - 1 - 0.0425 / periods_per_year AS ex_ret\n        FROM stepped\n        WHERE prev_close > 0\n          AND period_key >= toDate('2025-01-01')\n    )\nSELECT\n    sampling,\n    round(avg(ex_ret) / stddevSamp(ex_ret), 4)                          AS per_period_sharpe,\n    round(avg(ex_ret) / stddevSamp(ex_ret) * sqrt(periods_per_year), 2) AS annualized_sharpe\nFROM per_period\nGROUP BY sampling, periods_per_year\nORDER BY periods_per_year DESC","computed_at":"2026-08-06T00:19:12.614433+00:00","elapsed":0.455495681}