CoolFace
Datasetpublic

ZipLime/fomc-events

FOMC Events Everything the Federal Open Market Committee made public — and, for each of it, the instant it became public. 571 information arrivals · 184 meetings · 1 862 point-in-time rows · 1 530 dots · 1 599 votes · 1.38 million words of policy text · January 2007 to today, plus the meetings already scheduled to December 2027 The pipeline lives in recipe/ at the same revision as the data. See PIPELINE.md for the method. A meeting is not an event Nothing becomes… See the full description on the dataset page: https://huggingface.co/datasets/ZipLime/fomc-events.

sourceHugging Faceapache-2.0updated 15h agoView on Hugging Face
0likes435downloads
Dataset Card

FOMC Events

Everything the Federal Open Market Committee made public — and, for each of it, the instant it became public.

571 information arrivals · 184 meetings · 1 862 point-in-time rows · 1 530 dots · 1 599 votes · 1.38 million words of policy text · January 2007 to today, plus the meetings already scheduled to December 2027

The pipeline lives in `recipe/` at the same revision as the data. See PIPELINE.md for the method.

A meeting is not an event

Nothing becomes knowable because a meeting happened. Four separate things become knowable, at four separate instants:

When
Statement2:00 p.m. Eastern on the last daythe rate, the decision, the votes
Implementation notethe same afternooninterest on reserves, ON RRP, the discount rate
Projectionsthe same minute, four times a yearthe SEP and the dot plot
Minutesthree weeks laterwhat was actually said

157 sets of minutes, a median of 21 days after their meeting. The shortest gap is 19 days and the longest 60 — the January 2019 minutes, delayed by the government shutdown. A rule of "three weeks" would have been wrong twice, in both directions.

That last row is where most FOMC datasets go wrong. The minutes are filed under the meeting date, and a backtest reading them acts three weeks early on the most detailed account of the Committee's thinking that exists.

Here they are their own row, with their own knowledge_at, taken from the release date the Federal Reserve states on its calendar page — because the minutes document itself carries no date at all.

Where every timestamp comes from

knowledge_time_precision says, on every row:

PrecisionMeaning
exactthe document printed its own embargo: For release at 2:00 p.m. EDT
dateonly the day is known; the instant is 23:59:59 in Washington
modeled_conservativea stated rule, documented, and always later than the truth
Events
exact, read from the document141
date, end of day in Washington430

Statements split 86 exact to 76 date: the Federal Reserve began printing the embargo line on the statement page in 2013, and before that it wrote For immediate release and nothing more. The minutes, the implementation note and the press conference page have never carried a time at all.

Nothing is assumed. A statement is at 2:00 p.m. and the minutes three weeks later are at 2:00 p.m. too — but the emergency cut of 15 March 2020 was at 5:00 p.m. on a Sunday, and a rule would have put it four hours before it happened. Where only the date is known the instant becomes the end of that day in Washington: late by up to a day, never early.

Daylight saving is never computed. Every instant goes through America/New_York in the timezone database, because a March statement and a June statement are on opposite sides of the change.

The decision is the Committee's verb

decision is raise, cut, hold or other, and it is read from the sentence where the Committee says what it decided — never inferred from comparing this meeting's rate with the last one, and never from what the market expected.

That distinction has teeth. In October 2015 the Committee held rates while writing whether it will be appropriate to raise the target range; reading any verb near the word target turns that meeting into a rate rise. In December 2008 it established a range of 0 to 1/4 percent, coming from 1 percent; the arithmetic says cut, the statement says establish, and this dataset says other.

Four phrasings are in use across the backfill, and one of them puts the range before the noun:

EraWritten as
before Dec 2008target for the federal funds rate at 5-1/4 percent
Dec 2008target range for the federal funds rate of 0 to 1/4 percent
2012-2015the current 0 to 1/4 percent target range for the federal funds rate
2015 onwardtarget range for the federal funds rate to 4 to 4-1/4 percent

Across 162 statements: 119 holds, 20 rises, 18 cuts, one `other`, and four that name no funds-rate target because they are conference-call announcements about swap lines and the discount window.

The dot plot is a table, not a picture

The Federal Reserve publishes the Summary of Economic Projections twice: as a PDF of charts, and as an accessible version in which every chart is also a data table. The policy path chart is one of those tables — rate level down the side, projection years across the top, the number of participants in each cell.

1 530 cells, 4 444 dots, 57 releases from January 2012 to today — every one of them a number the Federal Reserve published as a number. Between 15 and 19 participants in each release, and the gate rejects any release whose years disagree with each other about how many there were, because that is what reading the wrong column looks like.

No image was read, no chart was measured, and extraction_method records which table each number came from. The check that says so: from September 2015 the Committee publishes its own median for the funds rate, and computing the median from the dot counts reproduces it on all 43 releases where both exist, to within the one decimal the Federal Reserve rounds its figure to. Medians are not invented for the releases that predate them: the Committee began publishing medians in September 2015, and before that median is null while central_tendency_* and range_* are not.

Votes and dissents

1 599 votes by 57 people, of which 80 are dissents. Esther L. George dissented 15 times, Jeffrey M. Lacker 10. Each dissent carries preferred_action_text — what the member wanted instead, in the Committee's own words.

April 2026 is the case that shaped the parser: four members dissented for two different reasons, written as two semicolon-separated groups, the second of which is itself a list of three names. Cutting that sentence at its first who loses three of the four.

From 2026 the Committee stopped printing the full roster and prints only its dissenters plus a tally — approved … by a 12 - 0 vote. Both forms are read, and a statement that names neither leaves the counts unknown rather than zero.

What is in it

ConfigRowsWhat one row is
pit1 862one number becoming public: entity, date, instant — plus a Delta table
events571one public information arrival
meetings184one gathering, indexed on the first thing published about it
documents414the full text of one document
sep1 280one variable and one horizon of one Summary of Economic Projections
dot_plot1 530one cell of the policy path chart
votes1 599one member's vote on one policy action
calendar184one meeting as the published schedule announced it

173 meetings have been held and 11 are still to come. 167 were scheduled, 16 were conference calls and one was a notation vote — a distinction worth keeping, because the conference call of 7 October 2008 moved rates as surely as any scheduled meeting did.

pit holds 35 series. The target range and its midpoint, the three administered rates from the implementation note, and the SEP medians and median dot keyed by horizon rather than by year: US_FOMC_SEP_MEDIAN_PCE_INFLATION_Y1 runs from 2010 to today, where a series named for 2019 would be five rows that stop.

Using it

python
import polars as pl

pit = pl.read_parquet("data/pit/*.parquet")

# The target range as it was actually announced
rate = pit.filter(pl.col("entity_id") == "US_FOMC_TARGET_RATE_MID").select(
    "event_date", "knowledge_date", "actual", "change", "decision"
)

# Where the Committee thought rates would be a year out, as of each meeting
dots = pit.filter(pl.col("entity_id") == "US_FOMC_DOT_MEDIAN_Y1")

# Everything a strategy could have known on a given morning
known = pit.filter(
    pl.col("knowledge_date") <= pl.lit("2026-07-01").str.to_datetime(time_zone="UTC")
)

That last filter is the one that matters. Run it against 1 July 2026 and the minutes of the June meeting are correctly absent — they came out on 8 July.

What is deliberately not here

  • Consensus forecasts. forecast is always null. Estimates are licensed data and none are included.
  • Sentiment, hawkishness, embeddings. The canonical tables carry the text and nothing derived from it by a model. A tone score is an opinion about the text, not a fact the Committee published, and mixing the two makes neither auditable.
  • Anything read off a chart. Where the Federal Reserve publishes only an image, this dataset publishes nothing.
  • Documents before 2007. Statements reach back to 1994 on the Board's historical pages. The backfill starts at the first Summary of Economic Projections so the subsets are comparable; metadata/coverage.parquet records what each one actually spans.

Provenance

Every row carries source_url and raw_sha256 — the digest of the exact bytes the Federal Reserve served — so any number can be traced to the document it came from. Failures are not gaps: a document that cannot be parsed lands in metadata/quarantine.parquet with the reason, and the next run tries it again.

Source: the Board of Governors of the Federal Reserve System, a US Government work in the public domain. The Federal Reserve does not endorse, certify or verify this dataset. The additions here — the release instants, the normalised projection tables, the validation — are Apache-2.0.