{"slug":"risk-free-rate-in-the-sharpe-ratio","qid":"constant_vs_matched","label":"Sharpe ratio on a matched rate series against one fixed rate","post_title":"Risk-free rate in the Sharpe ratio","post_url":"/blog/risk-free-rate-in-the-sharpe-ratio#q-constant_vs_matched","columns":["horizon","sharpe_matched_rf","sharpe_fixed_rf","abs_gap"],"rows":[{"horizon":"1-year","sharpe_matched_rf":1.55,"sharpe_fixed_rf":1.62,"abs_gap":0.07},{"horizon":"3-year","sharpe_matched_rf":0.26,"sharpe_fixed_rf":0.24,"abs_gap":0.01},{"horizon":"5-year","sharpe_matched_rf":0.61,"sharpe_fixed_rf":0.51,"abs_gap":0.1},{"horizon":"10-year","sharpe_matched_rf":0.64,"sharpe_fixed_rf":0.48,"abs_gap":0.16},{"horizon":"20-year","sharpe_matched_rf":0.49,"sharpe_fixed_rf":0.32,"abs_gap":0.18}],"shape":"ranking","sql":"WITH\n    monthly_px AS\n    (\n        SELECT\n            toStartOfMonth(date)           AS m,\n            argMax(toFloat64(close), date) AS month_close\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker = 'SPY'\n          AND date >= '2004-12-01'\n          AND date <  '2025-01-01'\n        GROUP BY m\n    ),\n    prior_px AS\n    (\n        SELECT\n            addMonths(m, 1) AS m,\n            month_close     AS prev_close\n        FROM monthly_px\n    ),\n    monthly_rf AS\n    (\n        SELECT\n            toStartOfMonth(date)                                       AS m,\n            pow(1 + avg(toFloat64(yield_3_month)) / 100, 1.0 / 12) - 1 AS rf_month\n        FROM global_markets.treasury_yields\n        WHERE date >= '2004-12-01'\n          AND date <  '2025-01-01'\n          AND yield_3_month IS NOT NULL\n        GROUP BY m\n    ),\n    excess AS\n    (\n        SELECT\n            cur.m                                AS m,\n            cur.month_close / prv.prev_close - 1 AS ret,\n            rf.rf_month                          AS rf_month\n        FROM monthly_px AS cur\n        INNER JOIN prior_px AS prv ON prv.m = cur.m\n        INNER JOIN monthly_rf AS rf ON rf.m = cur.m\n    )\nSELECT\n    concat(toString(intDiv(count(), 12)), '-year')                             AS horizon,\n    round(sqrt(12) * avg(ret - rf_month) / stddevSamp(ret - rf_month), 2)      AS sharpe_matched_rf,\n    round(sqrt(12) * avg(ret - rf_fixed) / stddevSamp(ret - rf_fixed), 2)      AS sharpe_fixed_rf,\n    round(abs(sqrt(12) * avg(ret - rf_month) / stddevSamp(ret - rf_month)\n            - sqrt(12) * avg(ret - rf_fixed) / stddevSamp(ret - rf_fixed)), 2) AS abs_gap\nFROM excess\nCROSS JOIN\n(\n    SELECT pow(1 + avg(toFloat64(yield_3_month)) / 100, 1.0 / 12) - 1 AS rf_fixed\n    FROM global_markets.treasury_yields\n    WHERE date >= '2024-12-01'\n      AND date <  '2025-01-01'\n      AND yield_3_month IS NOT NULL\n) AS fixed_rate\nCROSS JOIN (SELECT arrayJoin([1, 3, 5, 10, 20]) AS years) AS hz\nWHERE m >= subtractYears(toDate('2025-01-01'), years)\nGROUP BY years\nORDER BY years","computed_at":"2026-08-14T15:41:55.053386+00:00","elapsed":0.174881693}