BMA (SIFMA municipal) swap curve - a deferred 4-piece vertical
Carved out of #343 (which is now otherwise complete: BondHelper/FixedRateBondHelper +
bond arm, FraRateHelper, FuturesRateHelper all landed). BMASwapRateHelper is the last
unported member of the rate-helper family, but it is not leftover cleanup - it is a whole
municipal-rate vertical with an unported dependency chain, so it gets its own tracker.
Dependency chain (nothing below is ported today - verified grep, 2026-07-25)
| layer |
piece |
QuantLib source |
| L7 cashflow |
AverageBMACoupon + its pricer |
ql/cashflows/averagebmacoupon.{hpp,cpp} |
| L6 index |
BMAIndex (InterestRateIndex subclass: fixingSchedule, maturityDate) |
ql/indexes/bmaindex.{hpp,cpp} (69 + 97 LOC) |
| L8 instrument |
BMASwap |
ql/instruments/bmaswap.{hpp,cpp} |
| L4b helper |
BMASwapRateHelper (RelativeDateRateHelper, holds a BMASwap) |
ql/termstructures/yield/ratehelpers.hpp:294-327 |
Oracle
testBMACurveConsistency (QuantLib/test-suite/piecewiseyieldcurve.cpp:566+), a separate
test from testCurveConsistency. Fixture bmaData (:154-166, 10 tenors 1Y-30Y, the
liborFraction quotes 67.56-73.81). The bootstrapped curve must reprice the BMA swap quotes
within tolerance.
Suggested ticket split when picked up (dependency order)
AverageBMACoupon + pricer (L7) - the cashflow the swap is built from.
BMAIndex (L6) - averaged index with its own fixing schedule.
BMASwap (L8) - the instrument.
BMASwapRateHelper + testBMACurveConsistency (L4b) - the payoff.
Priority
Low. BMA/SIFMA is a niche US municipal-rate product; no other ported code depends on it,
and the mixed-strip bootstrap (deposits + futures + FRA + swaps) already exercises the
bootstrapper end-to-end. Deferred visibly rather than silently. Epic: EPIC-4b (#337), touches
EPIC-6 (#68) / EPIC-7 (#69) / EPIC-8 (#70).
BMA (SIFMA municipal) swap curve - a deferred 4-piece vertical
Carved out of #343 (which is now otherwise complete:
BondHelper/FixedRateBondHelper+bond arm,
FraRateHelper,FuturesRateHelperall landed).BMASwapRateHelperis the lastunported member of the rate-helper family, but it is not leftover cleanup - it is a whole
municipal-rate vertical with an unported dependency chain, so it gets its own tracker.
Dependency chain (nothing below is ported today - verified
grep, 2026-07-25)AverageBMACoupon+ its pricerql/cashflows/averagebmacoupon.{hpp,cpp}BMAIndex(InterestRateIndexsubclass:fixingSchedule,maturityDate)ql/indexes/bmaindex.{hpp,cpp}(69 + 97 LOC)BMASwapql/instruments/bmaswap.{hpp,cpp}BMASwapRateHelper(RelativeDateRateHelper, holds aBMASwap)ql/termstructures/yield/ratehelpers.hpp:294-327Oracle
testBMACurveConsistency(QuantLib/test-suite/piecewiseyieldcurve.cpp:566+), a separatetest from
testCurveConsistency. FixturebmaData(:154-166, 10 tenors 1Y-30Y, theliborFraction quotes 67.56-73.81). The bootstrapped curve must reprice the BMA swap quotes
within tolerance.
Suggested ticket split when picked up (dependency order)
AverageBMACoupon+ pricer (L7) - the cashflow the swap is built from.BMAIndex(L6) - averaged index with its own fixing schedule.BMASwap(L8) - the instrument.BMASwapRateHelper+testBMACurveConsistency(L4b) - the payoff.Priority
Low. BMA/SIFMA is a niche US municipal-rate product; no other ported code depends on it,
and the mixed-strip bootstrap (deposits + futures + FRA + swaps) already exercises the
bootstrapper end-to-end. Deferred visibly rather than silently. Epic: EPIC-4b (#337), touches
EPIC-6 (#68) / EPIC-7 (#69) / EPIC-8 (#70).