{"slug":"off-the-run-vs-on-the-run-treasuries","qid":"tenor_steps","label":"tenor_steps","post_title":"off-the-run-vs-on-the-run-treasuries","post_url":"/blog/off-the-run-vs-on-the-run-treasuries#q-tenor_steps","columns":["tenor_pair","avg_gap_bps","abs_bps_per_year"],"rows":[{"tenor_pair":"2-year to 10-year","avg_gap_bps":38.6,"abs_bps_per_year":4.8},{"tenor_pair":"10-year to 30-year","avg_gap_bps":47.9,"abs_bps_per_year":2.4}],"shape":"ranking","sql":"SELECT\n    tenor_pair,\n    round(avg(gap_pct) * 100, 1)                   AS avg_gap_bps,\n    round(abs(avg(gap_pct)) * 100 / max(years), 1) AS abs_bps_per_year\nFROM\n(\n    SELECT\n        step.1 AS tenor_pair,\n        step.2 AS gap_pct,\n        step.3 AS years,\n        step.4 AS step_order\n    FROM\n    (\n        SELECT arrayJoin([\n            ('2-year to 10-year',  toFloat64(yield_10_year) - toFloat64(yield_2_year),   8.0, 1),\n            ('10-year to 30-year', toFloat64(yield_30_year) - toFloat64(yield_10_year), 20.0, 2)\n        ]) AS step\n        FROM global_markets.treasury_yields\n        WHERE date >= today() - 120\n          AND yield_2_year > 0\n          AND yield_10_year > 0\n          AND yield_30_year > 0\n    )\n)\nGROUP BY tenor_pair\nHAVING count() > 0\nORDER BY max(step_order)","computed_at":"2026-09-29T14:50:44.220807+00:00","elapsed":0.025915519}