Bloomberg SWPM vs a transparent request
Bloomberg is the reference on most desks. This post compares a SWPM output with the same instrument priced from a fully explicit Quantra request.
Instrument: 1M x 10Y payer swaption on USD SOFR OIS. Settlement: cash (par yield curve). Model: normal (Bachelier), vol 102.67bp. As of: 2024-08-14.
The goal is not to reverse-engineer every Bloomberg detail. It is to show that a pricing number only exists together with its assumptions, and if the assumptions are hidden, the number cannot really be validated.
Result at a glance
| Metric | Bloomberg | Quantra |
|---|---|---|
| Fair rate | 3.367463% | 3.3724% (ATM forward) |
| Premium (NPV) | 10,359.49 | 10,585.40 |
| DV01 (1bp) | -414.86 | 430.13 |
| Gamma (1bp) | 10.34 | 10.94 |
| Vega (1bp) | 100.90 | 101.07 |
| Theta (1d) | -156.66 | -131.55 |
The Quantra column is what the linked request
returns with bump-and-reprice greeks (pricing.options.swaption_pricing_rebump: true).
Last re-run on engine 0.15.0 against the public API (October 2026), identical to the
earlier runs on 0.8.2. Engines before 0.8.0 did not return theta for this request,
because the one-day roll did not move the curve's own reference date. An earlier
version of this page showed numbers from a run whose inputs were never published (NPV
10,387.60); they could not be reproduced from the request and were replaced.

Why matching Bloomberg is harder than it looks
A swaption price is not a formula. It is a model plus a curve, plus conventions, plus a definition for each greek:
- Curve construction: helpers, settlement days, calendars and day counts.
- Settlement conventions: cash settled, par yield curve method.
- Volatility convention: normal (Bachelier) or lognormal (Black).
- Greek definitions: DV01, gamma, vega and theta are usually bump and reprice, not analytic model greeks.
To match SWPM greeks you usually need to reproduce Bloomberg's definitions, not just its pricing model.
Why theta usually diverges
Theta is the change in value after one day passes, and that definition is ambiguous, so different systems can legitimately disagree:
- Frozen-curve theta: advance the evaluation date and keep the curve shape fixed (time decay only).
- Roll-down theta: rebuild the curve one day later from the same quotes, so time decay and roll-down both appear.
Quantra defines theta as npvTomorrow - npv with a one-day roll of the evaluation date and
of every curve and volatility reference date. You can read it in the code:
src/domain/swaption_rebump.h.
Bloomberg's definition is not published, which is the usual source of the gap in that row.
DV01 sign conventions
DV01 can flip sign depending on whether a system applies the trade direction (payer or receiver) or reports the raw rate-bump sensitivity. Bloomberg appears to apply a signed convention for this trade; Quantra reports the direct bump-and-reprice change.
Key settings in the request
- Curve: OIS rate helpers on the SOFR overnight index, annual fixed leg.
- Interpolation: backward flat, forward-rate bootstrap.
- Settlement: cash, par yield curve.
- Analytics: bump-and-reprice greeks.
Where the market data comes from
The Bloomberg screens come from a public question on Quantitative Finance Stack Exchange: quantlib-swaption-pricing. The second screenshot is the SWPM Curve Data tab. It is cropped at 8 years, so it cannot price a 10-year underlying on its own.

The 32 rates in the request (1 week to 50 years) are the table the author posted as "copied from Bloomberg", not the values on the screenshot. The two are different snapshots of the same curve: at every visible tenor the table sits 0.3 to 1.5bp below the screen's market rate column. The request feeds those numbers as continuously compounded zero rates.
Read instead as SOFR OIS par rates and bootstrapped, the same numbers give an NPV of about 9,730 and a forward of 3.352%. Read as zero rates they give 10,585.40 and a forward of 3.372%. Bloomberg's own forward, 3.367463%, sits between the two. The forward is the whole difference: repricing with the strike set at the engine's own ATM gives 10,382, within 0.2% of Bloomberg's 10,359.49. An independent QuantLib reproduction in the same thread, reading the table as par rates, reports 9,745.84.
Reproduce it
- Send the request to the engine API, or to a local container.
- Or paste the 32 rates from the source post into an AI agent connected to the Quantra MCP server (mcp.quantra.io) and ask it to price the trade. It builds the curve, prices, and can reprice under either reading of the rates.
Bloomberg is useful because it is consistent. Open implementations are useful because they can be explained: every definition is explicit, reproducible and auditable.