Calendar Events
Summary
A diary is populated with two kinds of entries: holidays for a given
country or currency, and events, which may affect one or more
currencies without being holidays themselves. This document covers
what an event entry, specifically, looks like, stopping short of the
effects half of The
Diary/Effects Model. An event is modelled as a diary entry anchored to a time point (an
interval, strictly, though a single instant is the degenerate case),
carrying a name, the currencies or markets it touches, and a kind —
public holiday, central-bank policy meeting, scheduled data release,
or an open-ended "other" — that lets the calendar_event table hold
heterogeneous entries without collapsing their distinct provenance. It also surveys where genuine,
citable event data can be sourced to seed data-quality test fixtures:
the official calendar pages published by the G10 central banks (the
Federal Reserve, the European Central Bank, the Bank of England, the
Bank of Japan, the Bank of Canada, the Reserve Bank of Australia, and
the Swiss National Bank) for their respective policy-setting
committees.
Detail
The landed model: calendar_event + diary_entry_types (decided 2026-08-09)
The FOMC analysis closed the open design questions this document left open. The decided shape (story * Decisions D1, D4):
- One table for all event kinds. A new
calendar_evententity (ores.refdata, codegen'd, bitemporal, sibling ofcalendar_rules=/=calendar_exceptions):id(uuid),calendar_code→calendars,event_date(date),diary_entry_type→ newdiary_entry_typesvocabulary,name,description(nullable),source(nullable provenance, e.g.'federalreserve.gov'), plus the standard audit/temporal columns. Never a table per calendar or per type. - The vocabulary.
diary_entry_typesseedsholiday,central_bank_meeting,data_release,other— open-ended; a future kind (earnings release, auction) costs one row. - Holidays keep their own machinery.
calendar_rules,calendar_exceptionsand thecalendar_dategrid stay as they are;calendar_eventholds the non-holiday kinds. Theholidayentry type stays in the vocabulary so the whole classification lives in one place. - Template/Instance. An event row is an instance; its template is
the (calendar, diary_entry_type, name) triple. FOMC meetings are
entered as a short run of instances. Formulaic recurrence generation
(e.g. Non-Farm Payrolls) is deferred;
calendar_rules's grammar can later feed a template link if a consumer needs it. - The worked case.
US.FOMCis a row incalendars(calendar_typecentral_bank_meeting,country_codeUS,sourcefederalreserve.gov,is_editabletrue);currency_calendarslinks USD to it; the 2025–2027 meeting dates are seeded ascentral_bank_meetingcalendar_eventrows, transcribed from federalreserve.gov/monetarypolicy/fomccalendars.htm withsource'federalreserve.gov'=. No formal feed exists — transcription with the citable source, per the survey below.
The code model is documented in Tenor and Curve Bootstrapping Architecture.
An event as a diary entry with a time point
An event's time is anchored as an interval — a start and an end, recorded in local time because the event is relative to a country or market. A captured event therefore needs, at minimum, a time zone, a start date/time, an end date/time (equal to the start for a point event such as a data release, distinct for something with genuine duration such as a public holiday observed as a full trading day), a computed UTC start/end pair derived from the two, and a name. The shape is deliberately minimal: an event entry records that something happens, when, and to which currencies, and stops there — no variance weighting, no deliverability-restriction typing, no P&L attribution. Those belong to the Effects side, per The Diary/Effects Model, attached by reference from whichever downstream consumer needs them (the FX vol surface, most plausibly).
Distinguishing kinds of entry: a diary_entry_type
The calendar entity needs a type discriminator: is a given entry a public holiday, a central-bank meeting, or an "event" in some more generic sense? A single worked example makes the need for classification concrete: a Non-Farm Payrolls release, a central-bank policy decision (itself a recurring, dated, well-known fixture — the FOMC, the ECB Governing Council and the Bank of England MPC all publish their meeting calendars a year or more in advance), and an unscheduled, market-moving announcement are all qualitatively different kinds of "event." Collapsing all of these into a bare "Event" with no further classification would lose information a consumer might reasonably want to filter on (a trader wanting only central-bank meetings visible on a date picker, say, without every scheduled data release cluttering the view).
The natural shape is a small, open-ended diary_entry_type code —
holiday, central_bank_meeting, data_release, other as a
plausible starting enumeration — rather than a hard boolean split
between "holiday" and "event." This keeps the classification open to
extension (a future earnings_release or auction type costs nothing
to add), and lets a central_bank_meeting entry carry the same shape
as every other event while still being filterable and reportable on
its own. The layout question is settled (2026-08-09): holidays keep the
recurrence machinery (calendar_rules, calendar_exceptions,
calendar_date) and events live in one calendar_event table — the
holiday type remains in the diary_entry_types vocabulary so the
classification is unified even though the physical homes differ. See
"the landed model" above.
Recurrence: Template/Instance, not a general recurrence grammar
Events inherit the same Template/Instance pairing as holidays (see Holiday Calendar Administration): templates for events are instantiated as the events occur, following the same recurring-appointment principle described there. A central-bank meeting is, in this respect, the clean textbook case for a template: the FOMC holds eight regularly scheduled meetings a year, on dates announced well in advance but not reducible to a single closed-form recurrence rule (the exact dates shift year to year for scheduling reasons), so in practice each year's calendar is entered as a short run of instances against a lightweight "FOMC meeting" template, rather than computed from a formula. Non-Farm Payrolls, by contrast, is formulaic (first Friday of the month) and could be templated more tightly. Both are accommodated by the same Template/Instance mechanism without requiring the system to distinguish "formula-derivable" from "externally announced" events at the schema level.
Sourcing central-bank meeting dates for DQ seed data
Populating the events table with real, citable data — rather than purely synthetic fixtures — is straightforward for the major central banks, each of which publishes its policy-meeting calendar as an official, machine-consultable web page (none currently offers a formal iCal/ICS feed directly from the central bank itself, so ingestion means scraping or hand-transcribing the published table rather than subscribing to a feed):
- The Federal Reserve publishes the FOMC's meeting calendar, including links to the resulting policy statements and minutes, at federalreserve.gov/monetarypolicy/fomccalendars.htm. The FOMC holds eight regularly scheduled meetings a year, with additional unscheduled meetings held as needed — the latter a reminder that even a "regularly scheduled" central-bank calendar can admit ad hoc, out-of-template instances.
- The European Central Bank publishes the schedule of Governing Council and General Council meetings, including monetary-policy decision and press-conference timings, at ecb.europa.eu/press/calendars/mgcgc.
- The Bank of England publishes upcoming Monetary Policy Committee dates — the announcement of the Bank Rate decision and the publication of MPC minutes — at bankofengland.co.uk/monetary-policy/upcoming-mpc-dates.
- The Bank of Japan publishes the scheduled dates of its Monetary Policy Meetings, held eight times a year over two consecutive days each, at boj.or.jp/en/mopo/mpmsche_minu.
- The Bank of Canada publishes its full-year schedule of policy interest rate announcements (eight per year, each at a fixed 9:45am ET slot) the preceding August, at bankofcanada.ca/press/upcoming-events.
- The Reserve Bank of Australia publishes its Monetary Policy Board meeting schedule (eight two-day meetings a year, decision announced 2:30pm AEDT/AEST on the second day) at rba.gov.au/schedules-events/board-meeting-schedules.html.
- The Swiss National Bank publishes its quarterly monetary policy assessment dates (March, June, September, December; decision at 9:30am CET) at snb.ch/en/the-snb/mandates-goals/monetary-policy/decisions.
Together these seven sources cover the G10 policy calendars (Fed, ECB, BoE, BoJ, BoC, RBA, SNB); none publishes a formal iCal/ICS feed, so populating a table from them means manual or scripted transcription rather than an automatable ongoing sync.
See also
- Calendars, Holidays and Events — the hub.
- Tenor and Curve Bootstrapping Architecture — the
calendar_evententity in the code model. - The Diary/Effects Model — why this document stops at the diary and does not model effects.
- Holiday Calendar Administration — the Template/Instance pairing this document reuses for events.
- RFC 5545: Internet Calendaring and Scheduling Core Object Specification (iCalendar) — the standardised recurrence/exception mechanism the Template/Instance pairing mirrors.
- Martins & Lopes (2024), "What events matter for exchange rate volatility?" — the source of the Non-Farm-Payrolls-style worked example: which macro events carry a measurable FX volatility effect.
- Federal Reserve: FOMC meeting calendars
- ECB: Governing Council and General Council meeting calendars
- Bank of England: upcoming MPC dates
- Bank of Japan: Monetary Policy Meeting schedule
- Bank of Canada: upcoming events
- Reserve Bank of Australia: Board Meeting Schedules
- Swiss National Bank: monetary policy decisions