Strasmore Research
Learn Matt ConnorBy Matt Connor

When Is the COT Report Released?

The CFTC releases the COT report every Friday at 3:30 pm ET, measured as of Tuesday's close. See the schedule, the three-day lag, and how to read it.

The Commitments of Traders report, the COT report, is released every Friday at 3:30 p.m. Eastern time by the U.S. Commodity Futures Trading Commission, and it counts positions as of the close of business on the preceding Tuesday. Three days sit between the measurement and the publication. That gap, along with a reporting threshold that captures only the largest traders, defines what this free weekly file can honestly tell you.

When is the COT report released each week?

Friday at 3:30 p.m. Eastern, published by the regulator itself. The CFTC's Commitments of Traders page posts the files at no cost, as viewable tables and as downloadable text.

Two details on the calendar matter more than the clock time:

  • The data date is Tuesday, not Friday. Every figure in Friday's file describes where positions stood at Tuesday's close of business.
  • Federal holidays move the release. A holiday inside the reporting week delays publication by a day or two, and the CFTC posts a release schedule carrying each week's actual date. The Friday rule holds in a normal week and bends around federal holiday weeks.

The same Tuesday also arrives in more than one file: a futures-only version and an options-and-futures-combined version, where option positions are converted to a futures-equivalent basis using delta factors supplied by the exchanges. Two people quoting different numbers for the same market on the same day are often reading different versions.

Why is the COT report three days old when you read it?

The snapshot-to-release gap is the most important thing to know about positioning data. Whatever the largest traders did on Wednesday, Thursday, or Friday morning is absent from the file that publishes at 3:30. To size that blind spot, the panels here measure exchange-traded funds that track the markets the COT covers: stocks, Treasuries, metals, and energy. The funds are not the futures contracts. They are a fair ruler for how far these markets travel over three days.

QueryHow far seven markets travel between Tuesday's 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's close to Friday's 3:30 p.m. print ran from 2.97% in UNG down to 0.66% in TLT, measured over 97 weeks. Half the weeks came in under those medians. The tail is what makes a Tuesday snapshot stale: one week in ten moved 8.68% or more in UNG, and 68% of its weeks cleared two percent.

One market, week by week, shows how uneven that gap is.

QuerySPY: the move from Tuesday's 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 in the year to July 31, 2026, the first week charted, ending Aug 8, 2025, carried a 1.45% gap, and the last, ending Jul 31, 2026, carried 0.86%. Some weeks the file is nearly current. Some weeks it describes a market that has already moved on. Nothing printed in the file tells you which week you are in. Short interest has the same shape of problem on a longer clock: when short interest is released walks that calendar, and why short interest is two weeks old explains the lag.

What happens at 3:30 p.m. on a Friday?

The file lands half an hour before the U.S. stock market closes at 4:00 p.m. Eastern. Here is how a full Friday session spreads its trading across the clock, in fifteen-minute buckets.

QueryWhere Friday volume sits on the clock: SPY, 15-minute buckets, full Friday sessions over the 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 in a U.S. session is shaped like a smile. The first quarter hour takes 6.98% of the day's shares, the 12:00 bucket thins to 2.72%, and the final quarter hour of continuous trading takes 13.17%. The 15:30 bucket, the one the report drops into, carries 4.92%. The release arrives inside the closing ramp on the last day of the trading week. That is a fact about the calendar, not a claim about what trades on the file.

Legacy, disaggregated, or TFF: which COT report is which?

Four reports carry the COT name and slice the same Tuesday open interest differently.

  • Legacy splits each market into commercial, non-commercial, and nonreportable positions. It is the oldest format and the one most people mean by "the COT report".
  • Supplemental covers 13 agricultural commodities and breaks out index traders as their own category.
  • Disaggregated covers physical commodity markets, from agriculture and petroleum to natural gas, electricity, and metals, using four categories: producer/merchant/processor/user, swap dealers, managed money, and other reportables.
  • Traders in Financial Futures, the TFF report, covers financial contracts including currencies, Treasury securities, stock indices, and volatility. Its categories are dealer/intermediary on the sell side, then asset manager/institutional, leveraged funds, and other reportables on the buy side.

When a headline says hedge funds hold their largest short position in crude oil in years, the underlying series is usually managed money in the disaggregated report. The same sentence about the S&P 500 means leveraged funds in the TFF. The labels are not interchangeable.

Who is actually counted in the COT report?

Large traders, and nobody else. Clearing members, futures commission merchants, and foreign brokers file daily reports on every trader whose position sits at or above the reporting level set by CFTC regulation, and a market appears in the COT only when 20 or more traders hold positions at those levels. Reportable positions usually cover 70 to 90 percent of open interest in a market. The rest lands in a single nonreportable line, with no category and no trader count attached.

The categories are declared occupations, not strategies. A commercial, or producer/merchant/processor/user, is a firm whose business activity the futures position hedges, as stated on its CFTC Form 40. Managed money is pooled speculative capital: advisors, pool operators, and funds trading on behalf of clients. A grain elevator hedging inventory and a fund positioning for a price move can hold identical contracts in opposite columns. The report says who holds a position. It never says why.

Two ways the COT report gets misread

A record net long is not a timing tool. A net position is one number built from two, longs minus shorts, in contracts, within a single category. A record reading says that category's exposure stood at an extreme as of a Tuesday. It carries no information about when, or whether, that exposure unwinds. Crowd-position gauges share this limit across asset classes: the put/call ratio and FINRA short interest data both describe a stance already taken.

Raw contract counts do not compare across products. A COT table counts contracts, and a contract is a quantity of something. A COMEX gold contract covers 100 troy ounces. A NYMEX crude contract covers 1,000 barrels. Ranking markets by contract count ranks them by unit definitions the exchanges set decades ago. The same arithmetic runs through equities, where the share is the unit.

QueryUnits versus dollars: seven funds tracking the markets the 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 changed hands at an average of $744.99 in July 2026, against $10.52 for one unit of UNG. A thousand units of each are not the same amount of money. Across the seven funds, SPY took 31.75% of the units traded and 50.07% of the dollars, while UNG took 5.41% of the units and 0.12% of the dollars. A share of the units equals a share of the dollars only when every unit costs the same. Compare positioning within one market over time, or convert contracts to notional value before ranking anything.

COT report FAQ

What time is the COT report released?

3:30 p.m. Eastern time on Friday, on the CFTC website. Positions are measured as of the close of business the prior Tuesday, so the file is three days old at publication. A federal holiday in the reporting week delays it by a day or two.

Is the COT report free?

Yes. The CFTC publishes it at no charge, as viewable tables and as downloadable files. Commercial positioning products repackage the same public data with charts and history.

What is the difference between the legacy and disaggregated COT reports?

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

Does the COT report show every trader's position?

No. It counts traders at or above CFTC reporting levels, which usually covers 70 to 90 percent of a market's open interest, and a market is published only when 20 or more traders sit at those levels. Everyone below the threshold is pooled into one anonymous nonreportable line.

Can the COT report predict price moves?

It is a position census with a three-day lag, not a forecast. It records where large traders stood on a Tuesday, and an extreme reading carries no date for its own end.


Every number on this page is a stored query over minute-level price and volume history, with the SQL open under each panel. The COT file itself stays where it has always been, free, every Friday at 3:30. Run the same panels on the markets you follow on the Strasmore terminal.

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