← All studies · askamerica.ai

Weekly EIA inventory reports move oil and gas prices within minutes, but the move is a few percent and mostly fades within about a week

EIA Weekly Petroleum Status Report (crude, Wed 10:30am ET) and Weekly Natural Gas Storage Report (Thu 10:30am ET)

How long does an inventory-report price move last? Henry Hub daily spot price, 1997-2026; correlation of the report-day return with later cumulative returns Typical daily |move| on report days ~2.7-3.0% Henry Hub, Wed/Thu vs. 2.4-3.8% on other weekdays — not clearly larger in daily close-to-close data Correlation of Thursday's move with returns 5 trading days later 0.08 down from 0.20-0.27 at +1 to +3 days Decays toward zero by about a trading week; non-report days show flat/negative correlation instead Persistence of Henry Hub price move after Thursday storage report vs. oth… -0.05 0.00 0.05 0.10 0.15 0.20 0.25 0.30 Days after the move Corr. with day-0 return +1 trading day +2 days +3 days +5 days (~1 wk) Thursday (report day) Tuesday (non-report day) corr() of the report-day log return with the cumulative log return over the following N trading days, computed separately by day-of-week… Daily closing-price data cannot see the intraday burst academic tick-data studies document; it can only show whether the day's net move persists or reverts over subsequent days. Correlation, not a causal estimate; uncontrolled for weather/macro co-movers. AskAmerica · askamerica.ai
SVG

Summary

Energy prices react to the weekly EIA inventory reports (the Weekly Petroleum Status Report for crude/products, released Wednesdays at 10:30am ET, and the Weekly Natural Gas Storage Report, released Thursdays at 10:30am ET) immediately and mechanically — the published literature on tick-by-tick futures data is unanimous that these are the single most-watched scheduled releases in each market, with the bulk of the price and volume response concentrated in the first 20-30 minutes after the number crosses the wires. The size of the move scales with how far the actual number surprises the market's prior expectation: a meaningful surprise (roughly a 3-5 million barrel unexpected draw or build in crude) has historically been associated with moves on the order of a few tenths of a dollar up to a few percent in the underlying futures within that opening window; small, in-line prints barely move the tape at all. As for how long the move lasts: the academic literature finds the EIA report's shock is more persistent than the API report's, but neither this literature nor our own daily-data analysis below finds the move locks in permanently. Our own event-style analysis of daily Henry Hub natural gas prices (1997-2026) finds a distinct signature specific to the Thursday storage-report day: the day's price move keeps a positive correlation (r ≈ 0.20-0.27) with the market's direction over the following 1-3 trading days — a pattern absent on other weekdays, which instead show flat or negative (mean-reverting) serial correlation — and that correlation decays to near zero (r ≈ 0.08) by the fifth trading day, roughly one calendar week later. In short: the initial jolt is a matter of minutes; the informational content behind it keeps nudging the price for a few trading days; by about a week later the market has fully digested it and the report-day signature is gone.

What the published research says (magnitude and mechanism)

Multiple tick-data event studies of the crude oil futures market (e.g. the intraday evidence literature on API/EIA inventory announcements, ScienceDirect 2016/2014) find that unexpected inventory changes have an immediate, statistically significant inverse effect on crude futures returns (a surprise draw pushes price up, a surprise build pushes it down) and a positive effect on realized volatility, concentrated tightly around the 10:30am ET release. Both API's Tuesday-evening estimate and EIA's Wednesday number move the market, but the EIA shock is found to be larger in magnitude and longer in duration than the API shock — consistent with EIA's status as the mandatory, audited federal survey versus API's voluntary trade-association estimate. Industry market-microstructure commentary describes surprise draws/builds of 3-5 million barrels producing intraday WTI moves on the order of a few tenths of a dollar to several percent, with most of that move completed within about 20-30 minutes of the release; we were not able to independently verify that specific figure against a peer-reviewed primary source (the ScienceDirect papers with the underlying tick-data coefficients are paywalled — HTTP 403 on direct fetch — so this magnitude figure is reported as an industry-commentary estimate, not a verified academic one). For natural gas, a peer-reviewed study of storage-announcement surprises (heating oil and natural gas futures, 2003-2006, GARCH framework) confirms the storage announcement significantly affects both near- and far-month natural gas futures returns, but that particular paper does not itself quantify the move in cents/percent or state a duration in minutes/hours/days.

Our own analysis: does the report-day move persist, and for how long?

Because the peer-reviewed tick-by-tick coefficients were not fetchable, we ran our own event-style check on the one long, continuous daily price series available in this connector's warehouse: energy.eia_natural_gas_price (EIA API v2 Henry Hub spot, daily, 1997-2026, ~7,500 observations). Every query below applied the filter value_dollars_per_mmbtu IS NOT NULL (excluding rows with no recorded spot price — markets closed / no print, a structural gap, not a value-based selection) and, downstream of that, logret IS NOT NULL / r0 IS NOT NULL (excluding the very first row of the series, which has no prior day to difference against and so cannot produce a return). These exclusions remove a small, fixed number of rows for a structural reason and do not change which weekday looks largest in either result below.

Same-day size: average |daily log return| by weekday (after the value_dollars_per_mmbtu IS NOT NULL / logret IS NOT NULL exclusions above) is fairly flat — Mon 3.8%, Tue 3.4%, Wed 2.9%, Thu 3.0%, Fri 3.7% — so at the whole-day level the Thursday storage report does not stand out as unusually large versus other weekdays (Monday's larger figure is the mechanical weekend-gap effect, not report-related). This is consistent with the report's effect being a short, sharp intraday burst that is often similar in size to, or smaller than, the day's other price drivers (weather, macro news) once the whole trading day is netted out — daily data is simply too coarse to isolate it cleanly.

Persistence: computing corr(day-0 return, cumulative return over the next N trading days), after the same value_dollars_per_mmbtu IS NOT NULL and r0 IS NOT NULL exclusions, separately by weekday shows a distinct pattern on Thursdays that does not appear on any other day: r = 0.20 at +1 day, 0.27 at +2 days, 0.24 at +3 days, decaying to 0.08 at +5 days (about one trading week). Every other weekday's correlation is either flat/near-zero or negative (e.g. Friday shows strong negative/mean-reverting correlation, -0.33 to -0.43) — the opposite signature. The natural reading: a genuine informational shock lands on the storage-report day and keeps partially pushing the price the same direction for 2-3 more trading days before it is fully absorbed into the price by about a week out — whereas moves on non-report days behave more like noise that reverses.

Our own analysis, continued: crude oil

We also pulled 2026 daily WTI crude closes (econ.fred_indicators, series DCOILWTICO, with the same "value" IS NOT NULL exclusion applied for the same structural reason) to run the same weekday-volatility check for the Wednesday WPSR. That series only has ~180 days loaded (2026 only — a real coverage gap in this connector, not a design choice) and 2026 itself was an unusually volatile year for oil (WTI ran from the high-$50s to over $114 and back to the high-$90s), so a single Wednesday-vs-other-days comparison on that window is dominated by macro/geopolitical moves rather than the weekly report and is not reported as a headline finding here; the persistence test above therefore relies on the much longer and steadier natural gas series.

Caveats

Every query behind this report

7 warehouse calls ran in this session, in order. Each is reproducible against the same snapshot.

query — 1 rows — 6623 ms
SELECT MIN("date") as min_d, MAX("date") as max_d, COUNT(*) as n FROM econ.fred_indicators WHERE series='DCOILWTICO'
query — 180 rows — 4630 ms
SELECT "date", value FROM econ.fred_indicators WHERE series='DCOILWTICO' ORDER BY "date"
query — 5000 rows — 2289 ms
SELECT report_date, value_dollars_per_mmbtu FROM energy.eia_natural_gas_price ORDER BY report_date
query — 5 rows — 1046 ms

WITH px AS (
  SELECT CAST(report_date AS DATE) AS d, value_dollars_per_mmbtu AS p
  FROM energy.eia_natural_gas_price
  WHERE value_dollars_per_mmbtu IS NOT NULL
),
ret AS (
  SELECT d, p,
    LN(p) - LN(LAG(p) OVER (ORDER BY d)) AS logret,
    EXTRACT(DOW FROM d) AS dow
  FROM px
)
SELECT dow, COUNT(*) n, AVG(ABS(logret)) avg_abs_ret, STDDEV_SAMP(logret) sd_ret
FROM ret
WHERE logret IS NOT NULL
GROUP BY dow
ORDER BY dow
query — 5 rows — 2898 ms

WITH px AS (
  SELECT "date" AS d, "value" AS p
  FROM econ.fred_indicators
  WHERE series='DCOILWTICO' AND "value" IS NOT NULL
),
ret AS (
  SELECT d, p,
    LN(p) - LN(LAG(p) OVER (ORDER BY d)) AS logret,
    EXTRACT(DOW FROM d) AS dow
  FROM px
)
SELECT dow, COUNT(*) n, AVG(ABS(logret)) avg_abs_ret, STDDEV_SAMP(logret) sd_ret
FROM ret
WHERE logret IS NOT NULL
GROUP BY dow
ORDER BY dow
query — 1 rows — 932 ms

-- persistence: for Thursday (gas storage day) shocks, correlate day-0 return with cumulative return over next 1-5 days
WITH px AS (
  SELECT CAST(report_date AS DATE) AS d, value_dollars_per_mmbtu AS p
  FROM energy.eia_natural_gas_price
  WHERE value_dollars_per_mmbtu IS NOT NULL
),
ret AS (
  SELECT d, p,
    LN(p) - LN(LAG(p) OVER (ORDER BY d)) AS r0,
    EXTRACT(DOW FROM d) AS dow,
    (LN(LEAD(p,1) OVER (ORDER BY d)) - LN(p)) AS r1,
    (LN(LEAD(p,2) OVER (ORDER BY d)) - LN(p)) AS r2,
    (LN(LEAD(p,3) OVER (ORDER BY d)) - LN(p)) AS r3,
    (LN(LEAD(p,5) OVER (ORDER BY d)) - LN(p)) AS r5
  FROM px
)
SELECT
  corr(r0, r1) AS corr_1d_after,
  corr(r0, r2) AS corr_2d_after,
  corr(r0, r3) AS corr_3d_after,
  corr(r0, r5) AS corr_5d_after,
  COUNT(*) n
FROM ret
WHERE dow=4 AND r0 IS NOT NULL
query — 5 rows — 839 ms

WITH px AS (
  SELECT CAST(report_date AS DATE) AS d, value_dollars_per_mmbtu AS p
  FROM energy.eia_natural_gas_price
  WHERE value_dollars_per_mmbtu IS NOT NULL
),
ret AS (
  SELECT d, p,
    LN(p) - LN(LAG(p) OVER (ORDER BY d)) AS r0,
    EXTRACT(DOW FROM d) AS dow,
    (LN(LEAD(p,1) OVER (ORDER BY d)) - LN(p)) AS r1,
    (LN(LEAD(p,2) OVER (ORDER BY d)) - LN(p)) AS r2,
    (LN(LEAD(p,3) OVER (ORDER BY d)) - LN(p)) AS r3,
    (LN(LEAD(p,5) OVER (ORDER BY d)) - LN(p)) AS r5
  FROM px
)
SELECT dow,
  corr(r0, r1) AS corr_1d,
  corr(r0, r2) AS corr_2d,
  corr(r0, r3) AS corr_3d,
  corr(r0, r5) AS corr_5d,
  COUNT(*) n
FROM ret
WHERE r0 IS NOT NULL
GROUP BY dow ORDER BY dow

Sources

  1. EIA Weekly Petroleum Status Report — Release schedule: Wednesdays 10:30am ET
  2. EIA Weekly Natural Gas Storage Report — Release schedule: Thursdays 10:30am ET
  3. The informational content of inventory announcements: Intraday evidence from crude oil futures market — Abstract/search-summary only; full text returned HTTP 403 on direct fetch
  4. Effect of inventory announcements on crude oil price volatility — Abstract/search-summary only; full text returned HTTP 403 on direct fetch
  5. Effect of Temperature Shock and Inventory Surprises on Natural Gas and Heating Oil Futures Returns (PMC) — Peer-reviewed; confirms storage-announcement effect on NG futures returns but does not quantify magnitude/duration
  6. How EIA Reports Move Oil Prices (industry commentary) — Non-peer-reviewed trading-industry source for the ~20-30 minute burst and per-surprise magnitude estimates; treat as illustrative, not verified academic figures
  7. Henry Hub daily spot price persistence analysis
    Show SQL
    WITH px AS (SELECT CAST(report_date AS DATE) AS d, value_dollars_per_mmbtu AS p FROM energy.eia_natural_gas_price WHERE value_dollars_per_mmbtu IS NOT NULL), ret AS (SELECT d, EXTRACT(DOW FROM d) AS dow, LN(p)-LN(LAG(p) OVER (ORDER BY d)) AS r0, LN(LEAD(p,1) OVER (ORDER BY d))-LN(p) AS r1, LN(LEAD(p,2) OVER (ORDER BY d))-LN(p) AS r2, LN(LEAD(p,3) OVER (ORDER BY d))-LN(p) AS r3, LN(LEAD(p,5) OVER (ORDER BY d))-LN(p) AS r5 FROM px) SELECT dow, corr(r0,r1), corr(r0,r2), corr(r0,r3), corr(r0,r5), COUNT(*) FROM ret WHERE r0 IS NOT NULL GROUP BY dow ORDER BY dow
  8. Weekday |return| comparison, Henry Hub
    Show SQL
    SELECT EXTRACT(DOW FROM CAST(report_date AS DATE)) dow, AVG(ABS(LN(value_dollars_per_mmbtu)-LN(LAG(value_dollars_per_mmbtu) OVER (ORDER BY report_date)))) FROM energy.eia_natural_gas_price WHERE value_dollars_per_mmbtu IS NOT NULL GROUP BY dow
  9. WTI 2026 daily prices weekday comparison
    Show SQL
    SELECT EXTRACT(DOW FROM "date") dow, AVG(ABS(LN("value")-LN(LAG("value") OVER (ORDER BY "date")))) FROM econ.fred_indicators WHERE series='DCOILWTICO' AND "value" IS NOT NULL GROUP BY dow