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.
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:
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:
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:
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
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
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.
forecastis 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.parquetrecords 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.
