Contango and Roll Yield in Commodity ETFs
Two listed crude oil funds, calendar year price changeranking ·
2026-08-10 · 5×4
Both funds rebased to 100 at the start of the window, month by monthseries ·
2026-08-10 · 60×4
The financing leg: 3 month and 1 year Treasury yields by monthseries ·
2026-08-10 · 91×4
Two listed crude oil funds, calendar year price change
Two listed crude oil funds, calendar year price change
| year | uso_pct | usl_pct | gap_pct |
|---|---|---|---|
| 2021 | 67.88 | 65.27 | 2.62 |
| 2022 | 27.87 | 25.84 | 2.02 |
| 2023 | -1.46 | 2.16 | -3.62 |
| 2024 | 14.87 | 9.35 | 5.52 |
| 2025 | -10.1 | -13.51 | 3.41 |
the exact SQL behind every number
SELECT
toString(toYear(date)) AS year,
round((argMaxIf(toFloat64(close), date, ticker = 'USO')
/ argMinIf(toFloat64(close), date, ticker = 'USO') - 1) * 100, 2) AS uso_pct,
round((argMaxIf(toFloat64(close), date, ticker = 'USL')
/ argMinIf(toFloat64(close), date, ticker = 'USL') - 1) * 100, 2) AS usl_pct,
round(((argMaxIf(toFloat64(close), date, ticker = 'USO')
/ argMinIf(toFloat64(close), date, ticker = 'USO'))
- (argMaxIf(toFloat64(close), date, ticker = 'USL')
/ argMinIf(toFloat64(close), date, ticker = 'USL'))) * 100, 2) AS gap_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('USO', 'USL')
AND date >= '2021-01-01'
AND date < '2026-01-01'
GROUP BY toYear(date)
HAVING countIf(ticker = 'USO') > 100
AND countIf(ticker = 'USL') > 100
ORDER BY year
More from this analysisContango and Roll Yield in Commodity ETFs
The financing leg: 3 month and 1 year Treasury yields by month
series 91×4
→
Both funds rebased to 100 at the start of the window, month by month
series 60×4
→
A 15% cap and 9% buffer, seen from three entry points
ranking 21×4
→
When Q1 2026 13F reports landed, by week after quarter end
ranking 13×2
→
See all 2,173 queries →