Esc

    The API is under testing and may change before release.

    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

    1. 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.
    2. Build a schedule of your own with the shipped decisions plus your provisional one.
    3. Give it to the market with with_meetings before 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.
    • 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.