Strasmore Research
Learn am Matt ConnorBy Matt Connor

When COT Report Dey Come Out?

CFTC dey release COT report every Friday by 3:30 pm ET, based on Tuesday close. Check the schedule, three-day lag, and how to read trader positions.

The Commitments of Traders report, wey dem dey call COT report, U.S. Commodity Futures Trading Commission dey release am every Friday by 3:30 p.m. Eastern time. E dey count positions as dem be when business close for the Tuesday before. Three days dey between the measurement and when dem publish am. That gap, together with reporting threshold wey only catch the biggest traders, na wetin define wetin this free weekly file fit honestly tell you.

When COT report dey come out every week?

Friday by 3:30 p.m. Eastern, and na the regulator itself dey publish am. CFTC Commitments of Traders page dey post the files free, both as tables wey person fit view and text wey person fit download.

Two calendar details matter pass the clock time:

  • Data date na Tuesday, no be Friday. Every figure for Friday file dey show where positions stand when business close on Tuesday.
  • Federal holidays fit move the release. Holiday inside the reporting week fit delay publication by one or two days, and CFTC dey post release schedule wey show the actual date for each week. Friday rule dey hold for normal week, but e fit bend when federal holiday enter the week.

That same Tuesday dey show inside more than one file: futures-only version and options-and-futures-combined version. For the combined version, dem convert option positions to futures-equivalent basis with delta factors wey exchanges provide. If two people quote different numbers for the same market on the same day, many times na because dem dey read different versions.

Why COT report don old reach three days when you read am?

The gap between snapshot and release na the most important thing to understand about positioning data. Anything wey the biggest traders do on Wednesday, Thursday, or Friday morning no dey inside the file wey come out by 3:30. To measure that blind spot, the panels here dey track exchange-traded funds wey follow the markets COT covers: stocks, Treasuries, metals, and energy. The funds no be the futures contracts. But dem be reasonable ruler for how far these markets fit move within three days.

QueryHow far seven markets dey travel between Tuesday close and Friday 3:30 pm ET, Aug 2024 to Jul 2026
The exact SQL behind every number
WITH raw AS (
    SELECT ticker,
           toTimeZone(window_start, 'America/New_York') AS et,
           close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'TLT', 'GLD', 'SLV', 'USO', 'UNG')
      AND window_start >= toDateTime('2024-08-01 00:00:00')
      AND window_start < toDateTime('2026-08-01 00:00:00')
),
bars AS (
    SELECT ticker,
           toDate(et) AS session_date,
           toDayOfWeek(et) AS day_of_week,
           toHour(et) * 60 + toMinute(et) AS minute_of_day,
           close
    FROM raw
    WHERE toDayOfWeek(et) IN (2, 5)
      AND (toHour(et) * 60 + toMinute(et)) BETWEEN 570 AND 959
),
tuesday_snapshot AS (
    SELECT ticker,
           toMonday(session_date) AS week_start,
           argMax(close, minute_of_day) AS tuesday_close
    FROM bars
    WHERE day_of_week = 2
    GROUP BY ticker, week_start
),
friday_release AS (
    SELECT ticker,
           toMonday(session_date) AS week_start,
           argMax(close, minute_of_day) AS friday_1530
    FROM bars
    WHERE day_of_week = 5
      AND minute_of_day BETWEEN 900 AND 930
    GROUP BY ticker, week_start
)
SELECT t.ticker AS ticker,
       count() AS weeks_counted,
       round(quantileDeterministic(0.5)(abs(toFloat64(f.friday_1530) / toFloat64(t.tuesday_close) - 1) * 100,
                                        cityHash64(toString(t.week_start))), 2) AS median_abs_move_pct,
       round(quantileDeterministic(0.9)(abs(toFloat64(f.friday_1530) / toFloat64(t.tuesday_close) - 1) * 100,
                                        cityHash64(toString(t.week_start))), 2) AS p90_abs_move_pct,
       round(100 * countIf(abs(toFloat64(f.friday_1530) / toFloat64(t.tuesday_close) - 1) * 100 >= 2) / count(), 1) AS pct_weeks_over_2pct
FROM tuesday_snapshot AS t
INNER JOIN friday_release AS f
        ON t.ticker = f.ticker AND t.week_start = f.week_start
GROUP BY t.ticker
ORDER BY median_abs_move_pct DESC
Run this yourself

Across two years of report weeks, the median distance from Tuesday close to Friday 3:30 p.m. print move from 2.97% for UNG down to 0.66% for TLT, based on 97 weeks. Half of the weeks come below those medians. The tail na wetin make Tuesday snapshot stale: one week out of ten move 8.68% or more for UNG, and 68% of the weeks pass two percent.

One market, week by week, show how uneven that gap fit be.

QuerySPY: di move from Tuesday close to Friday 3:30 pm ET, week by week, Aug 2025 to Jul 2026
The exact SQL behind every number
WITH raw AS (
    SELECT toTimeZone(window_start, 'America/New_York') AS et,
           close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2025-08-01 00:00:00')
      AND window_start < toDateTime('2026-08-01 00:00:00')
),
bars AS (
    SELECT toDate(et) AS session_date,
           toDayOfWeek(et) AS day_of_week,
           toHour(et) * 60 + toMinute(et) AS minute_of_day,
           close
    FROM raw
    WHERE toDayOfWeek(et) IN (2, 5)
      AND (toHour(et) * 60 + toMinute(et)) BETWEEN 570 AND 959
),
tuesday_snapshot AS (
    SELECT toMonday(session_date) AS week_start,
           argMax(close, minute_of_day) AS tuesday_close
    FROM bars
    WHERE day_of_week = 2
    GROUP BY week_start
),
friday_release AS (
    SELECT toMonday(session_date) AS week_start,
           max(session_date) AS friday_date,
           argMax(close, minute_of_day) AS friday_1530
    FROM bars
    WHERE day_of_week = 5
      AND minute_of_day BETWEEN 900 AND 930
    GROUP BY week_start
)
SELECT f.friday_date AS week,
       formatDateTime(f.friday_date, '%b %e, %Y') AS friday_label,
       round((toFloat64(f.friday_1530) / toFloat64(t.tuesday_close) - 1) * 100, 2) AS change_pct,
       round(abs(toFloat64(f.friday_1530) / toFloat64(t.tuesday_close) - 1) * 100, 2) AS abs_change_pct
FROM tuesday_snapshot AS t
INNER JOIN friday_release AS f ON t.week_start = f.week_start
ORDER BY week
Run this yourself

Across the 48 report weeks for the year wey end July 31, 2026, the first week wey chart show, ending Aug 8, 2025, get 1.45% gap, while the last one, ending Jul 31, 2026, get 0.86%. Some weeks the file almost current. Other weeks e dey describe market wey don already move on. Nothing for the file tell you which kind week you dey see. Short interest get the same problem, but on longer timeline: when dem dey release short interest follow that calendar, and why short interest don old reach two weeks explain the lag.

Wetin dey happen by 3:30 p.m. on Friday?

The file land half an hour before U.S. stock market close by 4:00 p.m. Eastern. This na how full Friday session spread trading across the clock, inside fifteen-minute buckets.

QueryWhere Friday volume dey for di clock: SPY, 15-minute buckets, full Friday sessions for di past year
The exact SQL behind every number
WITH raw AS (
    SELECT toTimeZone(window_start, 'America/New_York') AS et,
           volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2025-08-01 00:00:00')
      AND window_start < toDateTime('2026-08-01 00:00:00')
),
bars AS (
    SELECT toDate(et) AS session_date,
           toHour(et) * 60 + toMinute(et) AS minute_of_day,
           intDiv((toHour(et) * 60 + toMinute(et)) - 570, 15) AS bucket,
           volume AS shares
    FROM raw
    WHERE toDayOfWeek(et) = 5
      AND (toHour(et) * 60 + toMinute(et)) BETWEEN 570 AND 959
),
full_sessions AS (
    SELECT session_date
    FROM bars
    GROUP BY session_date
    HAVING sumIf(shares, minute_of_day >= 930) >= 0.05 * sum(shares)
)
SELECT formatDateTime(toDateTime(toDate('2026-01-02')) + (570 + b.bucket * 15) * 60, '%H:%i') AS et_time,
       round(100 * sum(b.shares) / sum(sum(b.shares)) OVER (), 2) AS share_of_session_pct,
       round(sum(b.shares) / uniqExact(b.session_date) / 1000000, 2) AS avg_volume_millions
FROM bars AS b
INNER JOIN full_sessions AS s ON b.session_date = s.session_date
GROUP BY b.bucket
ORDER BY b.bucket
Run this yourself

Volume for U.S. session get smile shape. The first quarter hour carry 6.98% of the day's shares, the 12:00 bucket thin reach 2.72%, and the final quarter hour of continuous trading carry 13.17%. The 15:30 bucket, wey na the one report enter, carry 4.92%. The release come during the closing ramp on the last trading day of the week. Na calendar fact this one, no be claim about the trades wey dey inside the file.

Legacy, disaggregated, or TFF: which COT report be which one?

Four reports carry COT name, and each one divide the same Tuesday open interest in different ways.

  • Legacy divide each market into commercial, non-commercial, and nonreportable positions. Na the oldest format, and na the one most people mean when dem talk about “the COT report”.
  • Supplemental cover 13 agricultural commodities and show index traders as their own category.
  • Disaggregated cover physical commodity markets, from agriculture and petroleum reach natural gas, electricity, and metals. E use four categories: producer/merchant/processor/user, swap dealers, managed money, and other reportables.
  • Traders in Financial Futures, wey be the TFF report, cover financial contracts including currencies, Treasury securities, stock indices, and volatility. For sell side, category na dealer/intermediary. For buy side, dem get asset manager/institutional, leveraged funds, and other reportables.

When headline talk say hedge funds hold their biggest short position in crude oil for years, the series underneath normally na managed money for disaggregated report. That same sentence about S&P 500 mean leveraged funds for TFF. The labels no be interchangeable.

Who COT report really dey count?

Na large traders, nobody else. Clearing members, futures commission merchants, and foreign brokers dey file daily reports for every trader wey position reach or pass the reporting level wey CFTC regulation set. A market go enter COT only when 20 or more traders hold positions for those levels. Reportable positions usually cover 70 to 90 percent of open interest for a market. The remaining part enter one nonreportable line, with no category and no trader count attached.

The categories na declared occupations, no be strategies. Commercial, or producer/merchant/processor/user, na firm wey business activity the futures position dey hedge, as the firm state for CFTC Form 40. Managed money na pooled speculative capital: advisors, pool operators, and funds wey trade for clients. Grain elevator wey dey hedge inventory and fund wey dey position for price move fit hold identical contracts for opposite columns. The report tell you who hold position. E no ever tell you why.

Two ways people dey misread COT report

Record net long no be timing tool. Net position na one number wey come from two numbers, longs minus shorts, in contracts, inside one category. Record reading mean the category exposure dey at extreme level as of one Tuesday. E no tell you when, or whether, that exposure go unwind. Crowd-position gauges get this same limit across asset classes: the put/call ratio and FINRA short interest data both describe stance wey person don already take.

Raw contract counts no fit compare products across board. COT table dey count contracts, and contract na quantity of something. One COMEX gold contract cover 100 troy ounces. One NYMEX crude contract cover 1,000 barrels. Ranking markets by contract count mean say you dey rank them by unit definitions wey exchanges set decades ago. The same arithmetic apply to equities, where share na the unit.

QueryUnits versus dollars: seven funds wey dey track di markets COT covers, July 2026
The exact SQL behind every number
WITH raw AS (
    SELECT ticker,
           toTimeZone(window_start, 'America/New_York') AS et,
           close,
           volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'TLT', 'GLD', 'SLV', 'USO', 'UNG')
      AND window_start >= toDateTime('2026-07-01 00:00:00')
      AND window_start < toDateTime('2026-08-01 00:00:00')
),
rth AS (
    SELECT ticker,
           volume AS shares,
           toFloat64(close) * volume AS dollars
    FROM raw
    WHERE (toHour(et) * 60 + toMinute(et)) BETWEEN 570 AND 959
)
SELECT ticker,
       round(sum(dollars) / sum(shares), 2) AS unit_size_usd,
       round(100 * sum(shares) / sum(sum(shares)) OVER (), 2) AS share_of_units_pct,
       round(100 * sum(dollars) / sum(sum(dollars)) OVER (), 2) AS share_of_dollars_pct
FROM rth
GROUP BY ticker
ORDER BY unit_size_usd DESC
Run this yourself

One unit of SPY change hand at average price of $744.99 for July 2026, against $10.52 for one unit of UNG. One thousand units of each no be the same amount of money. Across the seven funds, SPY carry 31.75% of the units traded and 50.07% of the dollars, while UNG carry 5.41% of the units and 0.12% of the dollars. Share of units go equal share of dollars only when every unit cost the same. Compare positioning inside one market over time, or convert contracts to notional value before you rank anything.

COT report FAQ

What time COT report dey come out?

3:30 p.m. Eastern time on Friday, for CFTC website. Dem measure positions as of business close on the Tuesday before, so file don old reach three days when dem publish am. Federal holiday inside reporting week fit delay am by one or two days.

COT report free?

Yes. CFTC dey publish am free of charge, as tables wey person fit view and files wey person fit download. Commercial positioning products dey package the same public data again with charts and history.

Wetin be the difference between legacy and disaggregated COT reports?

Legacy divide market into commercial, non-commercial, and nonreportable positions. Disaggregated divide physical commodity markets into producer/merchant/processor/user, swap dealers, managed money, and other reportables. Financial markets get similar treatment for Traders in Financial Futures report.

COT report dey show every trader position?

No. E dey count traders wey position reach or pass CFTC reporting levels. This normally cover 70 to 90 percent of a market open interest, and dem publish market only when 20 or more traders dey for those levels. Everybody wey dey below the threshold enter one anonymous nonreportable line.

COT report fit predict price moves?

Na position census wey get three-day lag, no be forecast. E record where large traders stand on Tuesday, and extreme reading no carry date for when e go end by itself.


Every number for this page na stored query over minute-level price and volume history, and the SQL dey open under each panel. The COT file still dey where e always dey: free, every Friday by 3:30. Run the same panels for the markets wey you dey follow on Strasmore terminal.

#cot report#cftc#positioning#futures#release schedule