Municipal BMA swaps¶
BMAIndex, AverageBMACoupon, BMASwap and BMASwapRateHelper are available
in Rust, Python and Go. They model the weekly SIFMA municipal rate, its
calendar-day average, and swaps exchanging that average for a fraction of Ibor.
Build and price¶
- Create both indexes with the same settings. Supply a forecast curve to the Ibor index; a BMA index may start without a curve when used by a helper.
- Add the required historical BMA fixings. Fixings fall on Wednesday or the first subsequent US Government Bond business day. Missing history is an error; it is never replaced silently by a forecast.
- Build the Ibor and BMA schedules with their respective calendars and payment
conventions, then construct
BMASwap. Payer pays BMA and receives Ibor. - Attach a discount curve. Python uses
swap.set_engine(curve, settings); Go usesswap.SetEngine(curve, settings). Rust usesDiscountingSwapEnginethrough the standard instrument interface. - Read NPV, fair Ibor fraction/spread and signed leg NPV/BPS. Leg zero is Ibor; leg one is BMA. Results retain their market inputs and invalidate on updates.
Fit a municipal curve¶
Construct BMASwapRateHelper with a live fraction quote, maturity tenor,
settlement/calendar conventions, BMA payment period/day counter, and both
indexes. Feed the helpers into an existing piecewise yield-curve constructor.
The fitted curve forecasts BMA; the supplied Ibor curve forecasts and discounts
the helper's swap. Fraction quotes use decimal units: 67.56% means 0.6756.
The helper extends its pillar to the next BMA value date after swap maturity, so the final weekly fixing can be forecast. It uses a weak, unobserved link to the fitted curve and explicitly refreshes pricing during bootstrap. Quote, fixing and evaluation-date changes invalidate the curve; invalid dates or missing history propagate errors and recover when corrected.
Coupon and history access¶
AverageBMACoupon exposes rate, payment amount, accrual period and copied fixing
dates. Its arithmetic average weights each weekly fixing by the actual number
of accrual days it covers, then applies gearing and spread. Reference dates
support irregular accrual periods. A preceding-adjusted payment may occur before
the unadjusted accrual end.
BMA indexes expose fixing-calendar, valid-fixing, value-date, maturity-date and bracketing fixing-schedule queries, plus historical-fixing reads, writes and clearing. Python and Go retain native dependencies when the originating wrapper is released; Go handles still follow the owning session's lifetime.
The independent oracle
contains QuantLib 1.43 prices for ten maturities from 1Y through 30Y. Iterative
bootstrap reprices the original fractions within 1e-9; Rust's local-bootstrap
acceptance retains QuantLib's 1e-6 tolerance. These APIs cover plain municipal
swaps and averaged coupons; they do not add a municipal option model.