Pin a meeting schedule
You'll give a market a central-bank meeting schedule of your own, so a quote on a meeting past the shipped decisions can mark a curve instead of being refused.
Before you start
- helixio installed: see installing.
- The decision dates you want to assume, beyond the ones helixio ships.
Steps
- Take the shipped schedule with
MeetingSchedule.seeded("FED")and see that a quote on its last decision is refused: no later decision closes that window. - Build a schedule of your own with the shipped decisions plus your provisional one.
- Give it to the market with
with_meetingsbefore marking the quotes.
The comments in the program match these steps.
Rust
use chrono::NaiveDate;
use helixrs::{CentralBank, CollateralSpec, MarketContext, MeetingSchedule, QuoteSheet};
type Outcome<T> = Result<T, Box<dyn std::error::Error>>;
const SOFR_CLOSE_DATE: (i32, u32, u32) = (2026, 10, 1);
fn date((year, month, day): (i32, u32, u32)) -> NaiveDate {
NaiveDate::from_ymd_opt(year, month, day).expect("a real calendar date")
}
fn main() -> Outcome<()> {
let close = date(SOFR_CLOSE_DATE);
let usd = CollateralSpec::Currency("USD".parse()?);
// A quote on the last shipped Fed decision is refused: no later decision
// closes its window.
let fed = MeetingSchedule::seeded(CentralBank::Fed).expect("a seeded bank");
let last = fed.decisions()[fed.decisions().len() - 1];
let spelled = last.to_string();
let sheet = QuoteSheet::from_rows([
("USD-SOFR-MeetingOIS", spelled.as_str(), 0.0360),
("USD-SOFR-OIS", "2Y", 0.0459),
("USD-SOFR-OIS", "5Y", 0.0471),
])?;
let refusal = match MarketContext::as_of(close).with_recipe_quotes(&usd, &sheet) {
Ok(_) => String::new(),
Err(refused) => refused.to_string(),
};
println!(
"a quote on the last shipped decision, {last}, is {}",
if refusal.is_empty() { "accepted" } else { "refused" }
);
// Add a provisional decision after the shipped ones and give the market that
// schedule. The date is your assumption, not a published one.
let mut decisions = fed.decisions().to_vec();
decisions.push(date((2028, 1, 26)));
let extended = MeetingSchedule::new(CentralBank::Fed, &decisions);
let last_effective = extended.effective_dates()[extended.effective_dates().len() - 1];
let market = MarketContext::as_of(close).with_meetings(extended).with_recipe_quotes(&usd, &sheet)?;
let (curve, _) = market.curve(&"discount(USD)".parse()?).expect("the USD curve");
let pillars = curve.parameter_count();
println!("last effective date {last_effective}");
println!("pillars with a provisional 2028 decision pinned {pillars}");
Ok(())
}Python
import datetime as dt
import helixio as hlx
SOFR_CLOSE_DATE = dt.date(2026, 10, 1)
dates = hlx.dates
# A quote on the last shipped Fed decision is refused: no later decision
# closes its window.
fed = dates.MeetingSchedule.seeded("FED")
last = fed.decisions()[-1]
sheet = {"USD-SOFR-MeetingOIS": {last.isoformat(): 0.0360}, "USD-SOFR-OIS": {"2Y": 0.0459, "5Y": 0.0471}}
try:
hlx.MarketContext(SOFR_CLOSE_DATE).with_recipe_quotes("USD", sheet)
refusal = ""
except ValueError as refused:
refusal = str(refused)
print(f"a quote on the last shipped decision, {last}, is {'refused' if refusal else 'accepted'}")
# Add a provisional decision after the shipped ones and give the market that
# schedule. The date is your assumption, not a published one.
extended = dates.MeetingSchedule("FED", [*fed.decisions(), dt.date(2028, 1, 26)])
market = hlx.MarketContext(SOFR_CLOSE_DATE).with_meetings(extended).with_recipe_quotes("USD", sheet)
pillars = market.curve("discount(USD)").parameter_count()
print(f"last effective date {extended.effective_dates()[-1]}")
print(f"pillars with a provisional 2028 decision pinned {pillars}")a quote on the last shipped decision, 2027-12-08, is refused
last effective date 2028-01-27
pillars with a provisional 2028 decision pinned 3
Check it worked
- The extended schedule's last decision takes effect on the bank's rule (the Fed's, the next business day).
- The sheet that was refused now marks a curve, with one pillar per quote.
- Your provisional date is your assumption; replace it when the bank publishes its calendar.
Related
- Meeting schedules, the reference for schedules and each bank's effective-date rule.
- Step curves, for curves that move on meeting dates.
From the 0.0 line at revision bf7f2e2. Every printed number is that revision's own output.