{"slug":"contango-and-roll-yield-in-etfs","qid":"oil_fund_years","label":"Two listed crude oil funds, calendar year price change","post_title":"Contango and Roll Yield in Commodity ETFs","post_url":"/blog/contango-and-roll-yield-in-etfs#q-oil_fund_years","columns":["year","uso_pct","usl_pct","gap_pct"],"rows":[{"year":"2021","uso_pct":67.88,"usl_pct":65.27,"gap_pct":2.62},{"year":"2022","uso_pct":27.87,"usl_pct":25.84,"gap_pct":2.02},{"year":"2023","uso_pct":-1.46,"usl_pct":2.16,"gap_pct":-3.62},{"year":"2024","uso_pct":14.87,"usl_pct":9.35,"gap_pct":5.52},{"year":"2025","uso_pct":-10.1,"usl_pct":-13.51,"gap_pct":3.41}],"shape":"ranking","sql":"SELECT\n    toString(toYear(date)) AS year,\n    round((argMaxIf(toFloat64(close), date, ticker = 'USO')\n         / argMinIf(toFloat64(close), date, ticker = 'USO') - 1) * 100, 2) AS uso_pct,\n    round((argMaxIf(toFloat64(close), date, ticker = 'USL')\n         / argMinIf(toFloat64(close), date, ticker = 'USL') - 1) * 100, 2) AS usl_pct,\n    round(((argMaxIf(toFloat64(close), date, ticker = 'USO')\n          / argMinIf(toFloat64(close), date, ticker = 'USO'))\n         - (argMaxIf(toFloat64(close), date, ticker = 'USL')\n          / argMinIf(toFloat64(close), date, ticker = 'USL'))) * 100, 2) AS gap_pct\nFROM global_markets.stocks_daily_aggs\nWHERE ticker IN ('USO', 'USL')\n  AND date >= '2021-01-01'\n  AND date <  '2026-01-01'\nGROUP BY toYear(date)\nHAVING countIf(ticker = 'USO') > 100\n   AND countIf(ticker = 'USL') > 100\nORDER BY year","computed_at":"2026-08-10T15:47:34.986207+00:00","elapsed":0.003585602}