A weekend in March

On Tuesday 7 March 2023 the Fed chair told the Senate that rates were likely to peak higher than previously expected. On Friday Silicon Valley Bank was closed. On Sunday evening the authorities guaranteed all of its deposits and the Fed opened a new lending facility. Between Wednesday and Monday the two-year Treasury yield fell from 5.05 to 4.03 per cent. On 22 March the Fed raised by a quarter point.

Every curve built that Monday had to absorb a front end that had repriced a policy path in three sessions. A yield curve is never observed; it is fitted. On a day like that, how much of a curve’s error comes from the market, and how much from the way we fit it?

I measured it on USD, EUR and GBP overnight-index swap curves, comparing the standard bootstrap with an underdetermined fit built on the search Tom Hyer describes in Derivatives Algorithms, Volume 1: Bones (World Scientific). Asked to price quotes it was not given, the underdetermined fit’s median and tail errors are at or below both bootstraps’ in every window and currency. Where its lead is largest surprised me. On the front end it is not largest when markets are stressed; it is largest when the front end is pricing what central banks will do at their next scheduled meetings.

Two ways to fit a curve

The bootstrap puts one knot per instrument and solves them in maturity order, each quote fixing the curve out to its own maturity. It reprices every input exactly and it is fast, but the shape between quotes is whatever the interpolation says. I test two versions: flat forwards between pillars, the common default, and a smooth monotone Hermite interpolation, the stronger of the two.

The underdetermined fit uses many more knots than instruments, on purpose, so infinitely many curves reprice the market. Among them it picks the smoothest. Nothing in it comes from yesterday: each date is fitted from that day’s quotes and the meeting calendar alone. Each step is the minimum-norm Gauss-Newton step

$$ s = W^{-1} J^{\top} \left( J W^{-1} J^{\top} \right)^{-1} r $$

where $J$ is the Jacobian of the instruments with respect to the curve parameters, $r$ the mispricing, and $W$ the metric that measures roughness: it penalises the step between neighbouring forwards and, beyond the scheduled meetings, how sharply the forward curve bends. Because the metric lives in forward space, refining the grid does not change the answer.

Instruments no longer own knots, so the knots can sit where the overnight rate actually moves: on the dates the upcoming scheduled decisions take effect, then on a grid that fills the rest of the curve. A bootstrap cannot do this from pillars alone: it can step on a meeting date only if an instrument ends there. Desks that step the front end either fit meeting-dated swaps, the comparison in Exhibit 3, or spread each move over the meetings by a fixed rule, which is already a hand-made choice among the curves that reprice the market. I did not test the second. The front-end results below are a joint effect of the calendar and the freedom to use it.

The test

Every method sees the same twenty OIS pillars, one week to thirty years, on the same dates, with library defaults and no tuning per window. Leave one pillar out, refit, and price the missing pillar off the refitted curve against its market quote: how well does a curve know the rates it was not told?

The seven windows are a quiet first half of 2019 as the control, the September 2019 repo spike, COVID in 2020, the 2022 hiking cycle, SVB and Credit Suisse in 2023, the April 2025 tariff announcements, and the weak US payrolls of August 2025. EUR starts in October 2019, with the euro short-term rate. Every window I ran is reported: 36,062 refits scored by all three methods.

What I found

Out-of-sample error in the tail, by window Leave-one-out par error of the dropped pillar against its quote, 90th percentile, bp. Same twenty-pillar OIS set for every method. Underdetermined fit Smooth bootstrap Flat-forward bootstrap USD 0 2 4 6 8 10 Control H1 2019, USD, Underdetermined fit: p50 0.25, p90 0.78, max 8.49 bp (n=2198) 0.8 Control H1 2019, USD, Smooth bootstrap: p50 0.59, p90 1.84, max 8.89 bp (n=2198) Control H1 2019, USD, Flat-forward bootstrap: p50 1.02, p90 2.63, max 9.59 bp (n=2198) Control H1 2019 Repo 2019, USD, Underdetermined fit: p50 0.57, p90 2.33, max 10.46 bp (n=968) 2.3 Repo 2019, USD, Smooth bootstrap: p50 0.92, p90 3.36, max 16.08 bp (n=968) Repo 2019, USD, Flat-forward bootstrap: p50 1.37, p90 3.93, max 17.34 bp (n=968) Repo 2019 COVID 2020, USD, Underdetermined fit: p50 0.26, p90 1.07, max 17.70 bp (n=1867) 1.1 COVID 2020, USD, Smooth bootstrap: p50 0.48, p90 1.81, max 14.68 bp (n=1867) COVID 2020, USD, Flat-forward bootstrap: p50 0.72, p90 2.60, max 13.46 bp (n=1867) COVID 2020 Hiking 2022, USD, Underdetermined fit: p50 0.54, p90 1.58, max 5.28 bp (n=4480) 1.6 Hiking 2022, USD, Smooth bootstrap: p50 1.79, p90 6.00, max 25.09 bp (n=4480) Hiking 2022, USD, Flat-forward bootstrap: p50 2.64, p90 8.15, max 21.15 bp (n=4480) Hiking 2022 SVB 2023, USD, Underdetermined fit: p50 0.51, p90 1.49, max 5.99 bp (n=1314) 1.5 SVB 2023, USD, Smooth bootstrap: p50 1.52, p90 5.59, max 10.00 bp (n=1314) SVB 2023, USD, Flat-forward bootstrap: p50 2.45, p90 8.49, max 13.92 bp (n=1314) SVB 2023 Tariffs 2025, USD, Underdetermined fit: p50 0.34, p90 0.98, max 1.53 bp (n=1314) 1.0 Tariffs 2025, USD, Smooth bootstrap: p50 1.46, p90 3.09, max 7.36 bp (n=1314) Tariffs 2025, USD, Flat-forward bootstrap: p50 2.39, p90 4.28, max 9.87 bp (n=1314) Tariffs 2025 Payrolls Aug 2025, USD, Underdetermined fit: p50 0.38, p90 1.01, max 2.17 bp (n=792) 1.0 Payrolls Aug 2025, USD, Smooth bootstrap: p50 1.78, p90 3.91, max 6.39 bp (n=792) Payrolls Aug 2025, USD, Flat-forward bootstrap: p50 2.95, p90 5.57, max 6.77 bp (n=792) Payrolls Aug 2025 EUR 0 2 4 6 8 10 no ESTR data Control H1 2019 Repo 2019, EUR, Underdetermined fit: p50 0.16, p90 0.47, max 0.94 bp (n=272) 0.5 Repo 2019, EUR, Smooth bootstrap: p50 0.40, p90 1.56, max 6.11 bp (n=272) Repo 2019, EUR, Flat-forward bootstrap: p50 0.71, p90 5.99, max 7.09 bp (n=272) Repo 2019 COVID 2020, EUR, Underdetermined fit: p50 0.23, p90 0.75, max 5.92 bp (n=1872) 0.8 COVID 2020, EUR, Smooth bootstrap: p50 0.44, p90 2.37, max 6.08 bp (n=1872) COVID 2020, EUR, Flat-forward bootstrap: p50 0.85, p90 3.90, max 7.34 bp (n=1872) COVID 2020 Hiking 2022, EUR, Underdetermined fit: p50 0.50, p90 1.81, max 5.07 bp (n=4625) 1.8 Hiking 2022, EUR, Smooth bootstrap: p50 1.30, p90 5.75, max 18.20 bp (n=4625) Hiking 2022, EUR, Flat-forward bootstrap: p50 2.15, p90 8.45, max 20.90 bp (n=4625) Hiking 2022 SVB 2023, EUR, Underdetermined fit: p50 0.55, p90 1.68, max 5.37 bp (n=1314) 1.7 SVB 2023, EUR, Smooth bootstrap: p50 1.93, p90 4.37, max 9.19 bp (n=1314) SVB 2023, EUR, Flat-forward bootstrap: p50 2.75, p90 6.43, max 11.31 bp (n=1314) SVB 2023 Tariffs 2025, EUR, Underdetermined fit: p50 0.28, p90 0.86, max 4.45 bp (n=1314) 0.9 Tariffs 2025, EUR, Smooth bootstrap: p50 1.37, p90 2.96, max 5.28 bp (n=1314) Tariffs 2025, EUR, Flat-forward bootstrap: p50 2.17, p90 4.14, max 6.69 bp (n=1314) Tariffs 2025 Payrolls Aug 2025, EUR, Underdetermined fit: p50 0.14, p90 0.61, max 2.15 bp (n=810) 0.6 Payrolls Aug 2025, EUR, Smooth bootstrap: p50 0.92, p90 2.62, max 4.13 bp (n=810) Payrolls Aug 2025, EUR, Flat-forward bootstrap: p50 1.83, p90 3.58, max 5.65 bp (n=810) Payrolls Aug 2025 GBP 0 2 4 6 8 10 Control H1 2019, GBP, Underdetermined fit: p50 0.13, p90 0.34, max 1.97 bp (n=2224) 0.3 Control H1 2019, GBP, Smooth bootstrap: p50 0.34, p90 1.15, max 2.08 bp (n=2224) Control H1 2019, GBP, Flat-forward bootstrap: p50 0.69, p90 1.62, max 2.73 bp (n=2224) Control H1 2019 Repo 2019, GBP, Underdetermined fit: p50 0.13, p90 0.41, max 1.71 bp (n=985) 0.4 Repo 2019, GBP, Smooth bootstrap: p50 0.27, p90 1.13, max 2.49 bp (n=985) Repo 2019, GBP, Flat-forward bootstrap: p50 0.45, p90 1.63, max 2.85 bp (n=985) Repo 2019 COVID 2020, GBP, Underdetermined fit: p50 0.13, p90 0.56, max 4.83 bp (n=1849) 0.6 COVID 2020, GBP, Smooth bootstrap: p50 0.27, p90 1.08, max 6.06 bp (n=1849) COVID 2020, GBP, Flat-forward bootstrap: p50 0.50, p90 1.50, max 7.07 bp (n=1849) COVID 2020 Hiking 2022, GBP, Underdetermined fit: p50 0.59, p90 1.77, max 9.84 bp (n=4498) 1.8 Hiking 2022, GBP, Smooth bootstrap: p50 1.36, p90 6.30, max 24.40 bp (n=4498) Hiking 2022, GBP, Flat-forward bootstrap: p50 2.16, p90 9.34, max 29.11 bp (n=4498) Hiking 2022 SVB 2023, GBP, Underdetermined fit: p50 0.52, p90 1.16, max 2.41 bp (n=1278) 1.2 SVB 2023, GBP, Smooth bootstrap: p50 1.21, p90 3.41, max 5.82 bp (n=1278) SVB 2023, GBP, Flat-forward bootstrap: p50 2.15, p90 5.27, max 8.32 bp (n=1278) SVB 2023 Tariffs 2025, GBP, Underdetermined fit: p50 0.29, p90 0.96, max 2.37 bp (n=1296) 1.0 Tariffs 2025, GBP, Smooth bootstrap: p50 0.91, p90 3.86, max 5.42 bp (n=1296) Tariffs 2025, GBP, Flat-forward bootstrap: p50 1.81, p90 5.79, max 7.16 bp (n=1296) Tariffs 2025 Payrolls Aug 2025, GBP, Underdetermined fit: p50 0.20, p90 1.06, max 2.46 bp (n=792) 1.1 Payrolls Aug 2025, GBP, Smooth bootstrap: p50 0.88, p90 4.11, max 5.31 bp (n=792) Payrolls Aug 2025, GBP, Flat-forward bootstrap: p50 1.71, p90 6.68, max 7.53 bp (n=792) Payrolls Aug 2025 Labels: the underdetermined fit. 36,062 refits scored by all three methods; vendor OIS quotes, aggregate statistics only.
Exhibit 1. Leave-one-out par error, 90th percentile, by window and currency. The smooth bootstrap’s tail error is 1.4 to 4.3 times the underdetermined fit’s. Data: p50, p90 and max by window, currency and method (CSV) · Full size

The narrowest margin is the 2019 repo window in USD, 2.33 against 3.36 bp at the 90th percentile. In 2022 USD the fit’s median and 90th percentile are 0.54 and 1.58 bp, against 1.79 and 6.00 for the smooth bootstrap and 2.64 and 8.15 for the flat one.

Where the advantage lives: error by tenor Leave-one-out par error, median, bp, pooled over all windows. The shaded band is the front end, two weeks to two years. Underdetermined fit Smooth bootstrap Flat-forward bootstrap USD front end 0 1 2 3 4 5 6 2W 3W 1M 2M 3M 6M 9M 1Y 18M 2Y 3Y 4Y 5Y 7Y 10Y 15Y 20Y 25Y USD 2W, Flat-forward bootstrap: p50 0.28, p90 4.24 bp (n=708) USD 3W, Flat-forward bootstrap: p50 0.43, p90 4.15 bp (n=721) USD 1M, Flat-forward bootstrap: p50 0.97, p90 7.42 bp (n=717) USD 2M, Flat-forward bootstrap: p50 1.84, p90 7.84 bp (n=721) USD 3M, Flat-forward bootstrap: p50 4.32, p90 9.89 bp (n=720) USD 6M, Flat-forward bootstrap: p50 3.99, p90 11.07 bp (n=720) USD 9M, Flat-forward bootstrap: p50 2.25, p90 5.56 bp (n=721) USD 1Y, Flat-forward bootstrap: p50 3.23, p90 8.94 bp (n=721) USD 18M, Flat-forward bootstrap: p50 1.77, p90 8.39 bp (n=720) USD 2Y, Flat-forward bootstrap: p50 1.97, p90 5.94 bp (n=721) USD 3Y, Flat-forward bootstrap: p50 1.82, p90 3.54 bp (n=721) USD 4Y, Flat-forward bootstrap: p50 0.99, p90 2.12 bp (n=721) USD 5Y, Flat-forward bootstrap: p50 1.33, p90 3.15 bp (n=721) USD 7Y, Flat-forward bootstrap: p50 2.47, p90 3.92 bp (n=721) USD 10Y, Flat-forward bootstrap: p50 2.14, p90 4.06 bp (n=721) USD 15Y, Flat-forward bootstrap: p50 1.33, p90 4.11 bp (n=720) USD 20Y, Flat-forward bootstrap: p50 3.25, p90 5.51 bp (n=721) USD 25Y, Flat-forward bootstrap: p50 1.67, p90 2.42 bp (n=697) USD 2W, Smooth bootstrap: p50 0.35, p90 4.03 bp (n=708) USD 3W, Smooth bootstrap: p50 0.45, p90 3.91 bp (n=721) USD 1M, Smooth bootstrap: p50 0.92, p90 7.25 bp (n=717) USD 2M, Smooth bootstrap: p50 0.72, p90 4.85 bp (n=721) USD 3M, Smooth bootstrap: p50 3.22, p90 7.55 bp (n=720) USD 6M, Smooth bootstrap: p50 3.24, p90 7.91 bp (n=720) USD 9M, Smooth bootstrap: p50 0.63, p90 1.96 bp (n=721) USD 1Y, Smooth bootstrap: p50 2.07, p90 5.78 bp (n=721) USD 18M, Smooth bootstrap: p50 1.32, p90 5.33 bp (n=720) USD 2Y, Smooth bootstrap: p50 1.38, p90 3.50 bp (n=721) USD 3Y, Smooth bootstrap: p50 1.10, p90 2.41 bp (n=721) USD 4Y, Smooth bootstrap: p50 0.36, p90 0.70 bp (n=721) USD 5Y, Smooth bootstrap: p50 0.71, p90 1.78 bp (n=721) USD 7Y, Smooth bootstrap: p50 1.52, p90 2.53 bp (n=721) USD 10Y, Smooth bootstrap: p50 1.79, p90 3.56 bp (n=721) USD 15Y, Smooth bootstrap: p50 0.74, p90 2.74 bp (n=720) USD 20Y, Smooth bootstrap: p50 2.14, p90 3.67 bp (n=721) USD 25Y, Smooth bootstrap: p50 0.96, p90 1.79 bp (n=697) USD 2W, Underdetermined fit: p50 0.43, p90 1.64 bp (n=708) USD 3W, Underdetermined fit: p50 0.40, p90 1.30 bp (n=721) USD 1M, Underdetermined fit: p50 0.29, p90 1.28 bp (n=717) USD 2M, Underdetermined fit: p50 0.35, p90 1.47 bp (n=721) USD 3M, Underdetermined fit: p50 0.54, p90 1.91 bp (n=720) USD 6M, Underdetermined fit: p50 0.67, p90 3.03 bp (n=720) USD 9M, Underdetermined fit: p50 0.28, p90 1.14 bp (n=721) USD 1Y, Underdetermined fit: p50 0.35, p90 1.00 bp (n=721) USD 18M, Underdetermined fit: p50 0.58, p90 1.84 bp (n=720) USD 2Y, Underdetermined fit: p50 0.56, p90 1.58 bp (n=721) USD 3Y, Underdetermined fit: p50 0.30, p90 0.93 bp (n=721) USD 4Y, Underdetermined fit: p50 0.16, p90 0.54 bp (n=721) USD 5Y, Underdetermined fit: p50 0.21, p90 0.57 bp (n=721) USD 7Y, Underdetermined fit: p50 0.35, p90 0.80 bp (n=721) USD 10Y, Underdetermined fit: p50 0.72, p90 1.61 bp (n=721) USD 15Y, Underdetermined fit: p50 0.34, p90 1.18 bp (n=720) USD 20Y, Underdetermined fit: p50 0.68, p90 1.44 bp (n=721) USD 25Y, Underdetermined fit: p50 0.38, p90 1.11 bp (n=697) EUR 0 1 2 3 4 5 6 2W 3W 1M 2M 3M 6M 9M 1Y 18M 2Y 3Y 4Y 5Y 7Y 10Y 15Y 20Y 25Y EUR 2W, Flat-forward bootstrap: p50 0.05, p90 2.16 bp (n=568) EUR 3W, Flat-forward bootstrap: p50 0.08, p90 2.48 bp (n=551) EUR 1M, Flat-forward bootstrap: p50 0.44, p90 5.76 bp (n=568) EUR 2M, Flat-forward bootstrap: p50 1.79, p90 8.33 bp (n=568) EUR 3M, Flat-forward bootstrap: p50 3.09, p90 11.68 bp (n=568) EUR 6M, Flat-forward bootstrap: p50 2.80, p90 10.32 bp (n=568) EUR 9M, Flat-forward bootstrap: p50 0.91, p90 5.92 bp (n=568) EUR 1Y, Flat-forward bootstrap: p50 0.93, p90 6.48 bp (n=568) EUR 18M, Flat-forward bootstrap: p50 2.01, p90 5.49 bp (n=568) EUR 2Y, Flat-forward bootstrap: p50 1.96, p90 3.97 bp (n=568) EUR 3Y, Flat-forward bootstrap: p50 1.29, p90 3.76 bp (n=568) EUR 4Y, Flat-forward bootstrap: p50 1.00, p90 2.04 bp (n=568) EUR 5Y, Flat-forward bootstrap: p50 1.61, p90 2.77 bp (n=568) EUR 7Y, Flat-forward bootstrap: p50 4.20, p90 5.48 bp (n=568) EUR 10Y, Flat-forward bootstrap: p50 2.82, p90 5.07 bp (n=568) EUR 15Y, Flat-forward bootstrap: p50 5.48, p90 9.57 bp (n=568) EUR 20Y, Flat-forward bootstrap: p50 3.73, p90 5.42 bp (n=568) EUR 25Y, Flat-forward bootstrap: p50 1.66, p90 2.13 bp (n=568) EUR 2W, Smooth bootstrap: p50 0.09, p90 2.63 bp (n=568) EUR 3W, Smooth bootstrap: p50 0.19, p90 2.69 bp (n=551) EUR 1M, Smooth bootstrap: p50 0.44, p90 4.77 bp (n=568) EUR 2M, Smooth bootstrap: p50 0.66, p90 4.87 bp (n=568) EUR 3M, Smooth bootstrap: p50 2.17, p90 8.11 bp (n=568) EUR 6M, Smooth bootstrap: p50 2.00, p90 6.93 bp (n=568) EUR 9M, Smooth bootstrap: p50 0.37, p90 1.78 bp (n=568) EUR 1Y, Smooth bootstrap: p50 0.59, p90 3.70 bp (n=568) EUR 18M, Smooth bootstrap: p50 0.80, p90 3.20 bp (n=568) EUR 2Y, Smooth bootstrap: p50 1.42, p90 2.62 bp (n=568) EUR 3Y, Smooth bootstrap: p50 0.88, p90 2.51 bp (n=568) EUR 4Y, Smooth bootstrap: p50 0.40, p90 0.80 bp (n=568) EUR 5Y, Smooth bootstrap: p50 0.63, p90 1.38 bp (n=568) EUR 7Y, Smooth bootstrap: p50 2.92, p90 3.93 bp (n=568) EUR 10Y, Smooth bootstrap: p50 2.62, p90 4.10 bp (n=568) EUR 15Y, Smooth bootstrap: p50 3.88, p90 7.14 bp (n=568) EUR 20Y, Smooth bootstrap: p50 2.21, p90 3.07 bp (n=568) EUR 25Y, Smooth bootstrap: p50 0.90, p90 1.33 bp (n=568) EUR 2W, Underdetermined fit: p50 0.17, p90 1.02 bp (n=568) EUR 3W, Underdetermined fit: p50 0.17, p90 0.78 bp (n=551) EUR 1M, Underdetermined fit: p50 0.17, p90 0.69 bp (n=568) EUR 2M, Underdetermined fit: p50 0.30, p90 1.29 bp (n=568) EUR 3M, Underdetermined fit: p50 0.41, p90 1.35 bp (n=568) EUR 6M, Underdetermined fit: p50 0.47, p90 2.57 bp (n=568) EUR 9M, Underdetermined fit: p50 0.39, p90 1.53 bp (n=568) EUR 1Y, Underdetermined fit: p50 0.34, p90 1.20 bp (n=568) EUR 18M, Underdetermined fit: p50 0.33, p90 1.12 bp (n=568) EUR 2Y, Underdetermined fit: p50 0.39, p90 1.45 bp (n=568) EUR 3Y, Underdetermined fit: p50 0.38, p90 1.16 bp (n=568) EUR 4Y, Underdetermined fit: p50 0.22, p90 0.71 bp (n=568) EUR 5Y, Underdetermined fit: p50 0.24, p90 0.77 bp (n=568) EUR 7Y, Underdetermined fit: p50 0.42, p90 1.35 bp (n=568) EUR 10Y, Underdetermined fit: p50 0.44, p90 1.64 bp (n=568) EUR 15Y, Underdetermined fit: p50 1.63, p90 3.54 bp (n=568) EUR 20Y, Underdetermined fit: p50 0.36, p90 0.72 bp (n=568) EUR 25Y, Underdetermined fit: p50 0.32, p90 0.62 bp (n=568) GBP 0 1 2 3 4 5 6 2W 3W 1M 2M 3M 6M 9M 1Y 18M 2Y 3Y 4Y 5Y 7Y 10Y 15Y 20Y 25Y GBP 2W, Flat-forward bootstrap: p50 0.10, p90 3.23 bp (n=704) GBP 3W, Flat-forward bootstrap: p50 0.11, p90 3.41 bp (n=715) GBP 1M, Flat-forward bootstrap: p50 0.48, p90 6.95 bp (n=719) GBP 2M, Flat-forward bootstrap: p50 1.87, p90 8.41 bp (n=718) GBP 3M, Flat-forward bootstrap: p50 3.33, p90 13.55 bp (n=719) GBP 6M, Flat-forward bootstrap: p50 3.54, p90 11.68 bp (n=719) GBP 9M, Flat-forward bootstrap: p50 1.00, p90 3.32 bp (n=719) GBP 1Y, Flat-forward bootstrap: p50 1.10, p90 3.99 bp (n=719) GBP 18M, Flat-forward bootstrap: p50 0.79, p90 5.45 bp (n=719) GBP 2Y, Flat-forward bootstrap: p50 1.46, p90 6.15 bp (n=719) GBP 3Y, Flat-forward bootstrap: p50 2.07, p90 4.98 bp (n=719) GBP 4Y, Flat-forward bootstrap: p50 1.20, p90 2.57 bp (n=719) GBP 5Y, Flat-forward bootstrap: p50 1.65, p90 3.56 bp (n=719) GBP 7Y, Flat-forward bootstrap: p50 1.55, p90 6.14 bp (n=719) GBP 10Y, Flat-forward bootstrap: p50 1.62, p90 5.90 bp (n=719) GBP 15Y, Flat-forward bootstrap: p50 1.06, p90 2.06 bp (n=719) GBP 20Y, Flat-forward bootstrap: p50 1.16, p90 1.81 bp (n=719) GBP 25Y, Flat-forward bootstrap: p50 0.73, p90 2.04 bp (n=719) GBP 2W, Smooth bootstrap: p50 0.17, p90 2.56 bp (n=704) GBP 3W, Smooth bootstrap: p50 0.40, p90 2.83 bp (n=715) GBP 1M, Smooth bootstrap: p50 0.50, p90 5.51 bp (n=719) GBP 2M, Smooth bootstrap: p50 0.44, p90 3.07 bp (n=718) GBP 3M, Smooth bootstrap: p50 2.34, p90 9.23 bp (n=719) GBP 6M, Smooth bootstrap: p50 2.58, p90 8.68 bp (n=719) GBP 9M, Smooth bootstrap: p50 0.40, p90 1.22 bp (n=719) GBP 1Y, Smooth bootstrap: p50 0.64, p90 2.65 bp (n=719) GBP 18M, Smooth bootstrap: p50 0.47, p90 2.89 bp (n=719) GBP 2Y, Smooth bootstrap: p50 0.89, p90 4.21 bp (n=719) GBP 3Y, Smooth bootstrap: p50 1.27, p90 3.19 bp (n=719) GBP 4Y, Smooth bootstrap: p50 0.28, p90 0.82 bp (n=719) GBP 5Y, Smooth bootstrap: p50 1.14, p90 2.08 bp (n=719) GBP 7Y, Smooth bootstrap: p50 1.10, p90 3.77 bp (n=719) GBP 10Y, Smooth bootstrap: p50 1.30, p90 4.30 bp (n=719) GBP 15Y, Smooth bootstrap: p50 0.70, p90 1.52 bp (n=719) GBP 20Y, Smooth bootstrap: p50 0.69, p90 1.06 bp (n=719) GBP 25Y, Smooth bootstrap: p50 0.53, p90 1.67 bp (n=719) GBP 2W, Underdetermined fit: p50 0.23, p90 1.08 bp (n=704) GBP 3W, Underdetermined fit: p50 0.26, p90 0.81 bp (n=715) GBP 1M, Underdetermined fit: p50 0.19, p90 0.89 bp (n=719) GBP 2M, Underdetermined fit: p50 0.22, p90 1.19 bp (n=718) GBP 3M, Underdetermined fit: p50 0.22, p90 1.02 bp (n=719) GBP 6M, Underdetermined fit: p50 0.38, p90 2.07 bp (n=719) GBP 9M, Underdetermined fit: p50 0.36, p90 2.01 bp (n=719) GBP 1Y, Underdetermined fit: p50 0.21, p90 1.10 bp (n=719) GBP 18M, Underdetermined fit: p50 0.24, p90 1.30 bp (n=719) GBP 2Y, Underdetermined fit: p50 0.28, p90 1.46 bp (n=719) GBP 3Y, Underdetermined fit: p50 0.23, p90 1.14 bp (n=719) GBP 4Y, Underdetermined fit: p50 0.14, p90 0.59 bp (n=719) GBP 5Y, Underdetermined fit: p50 0.19, p90 0.68 bp (n=719) GBP 7Y, Underdetermined fit: p50 0.50, p90 1.61 bp (n=719) GBP 10Y, Underdetermined fit: p50 0.37, p90 0.83 bp (n=719) GBP 15Y, Underdetermined fit: p50 0.50, p90 1.06 bp (n=719) GBP 20Y, Underdetermined fit: p50 0.20, p90 0.43 bp (n=719) GBP 25Y, Underdetermined fit: p50 0.50, p90 1.42 bp (n=719) 1W and 30Y are the ends of the set and are not left out. Pooled over the seven windows; EUR from October 2019.
Exhibit 2. Leave-one-out par error by tenor, median, pooled over windows. The underdetermined fit is ahead of both bootstraps at every tenor from one year to 25 years in every currency, and far ahead at most tenors from one month to two years. The exceptions, all shorter than a year, are under “Where it loses”. Data: p50 and p90 by tenor (CSV) · Full size

The sharpest gap is at three and six months, where the smooth bootstrap’s median error is four to eleven times the fit’s. That is where the policy path lives: a meeting or two sits between neighbouring pillars, and the shape of the curve between them is the information. A bootstrap interpolates across it; a fit with knots where the decisions take effect represents it. At 25 years the fit’s median error is 0.3 to 0.5 bp against 0.5 to 1.0 for the smooth bootstrap, narrowly so in GBP.

It isn’t the crisis, it’s the policy path. On the front end, two weeks to two years, the smooth bootstrap’s tail error is about 2.5 times the fit’s in the quiet control, 1.3 to 2.7 times in the repo and COVID windows, and 3.2 to 4.8 times in 2022, 2023 and 2025 (CSV). The gap is largest where the front end repriced around scheduled decisions and smallest in COVID, which brought the fastest cuts in the sample: the Fed and the Bank of England made them between meetings and the ECB did not move. No calendar knows an emergency cut in advance, so the method says nothing about unscheduled decisions. And this is a tendency, not a law: the repo window held two scheduled Fed cuts and shows only a moderate gap.

Exhibit 3: meeting-dated swaps. Swaps on single meeting-to-meeting periods price each decision directly, and their trades are public swap-repository prints. In the two 2025 windows I fitted them alongside the pillars, held out in turn each traded period the bootstrap chain can reach, and priced it against its traded rate. A period is scored on a date only when at least three independent prints survive the data provider’s off-market screen. A one-knot-per-instrument bootstrap can only take these periods as a chain, dropping on average 5.3 to 6.4 of the twenty pillars per date; the fit takes every period and every pillar together. The held-out period and the scored set are the same for all three methods.

90th percentile, absoluteMean, signedMedian, signed
FlatSmoothFitFlatSmoothFitFlatSmoothFit
Tariffs 2025
USD (30)4.712.531.90−2.36−1.00−0.44−1.71−0.69−0.34
EUR (194)5.894.613.39−2.20−1.16+0.36−1.63−0.64+0.47
GBP (162)7.695.304.09−2.88−1.19+0.81−2.22−0.81+0.76
Payrolls 2025
USD (24)5.023.542.98−1.93−1.18+0.92−1.47−0.93+0.97
EUR (117)3.702.712.26−0.97−0.47+0.20−0.62−0.26−0.03
GBP (83)5.022.811.94−2.12−0.85+0.27−1.19−0.46−0.02
Exhibit 3. Held-out meeting-dated swaps against their traded rate, bp; scored periods in brackets. Negative means the curve sits below the traded rate. Bold marks the value closest to zero in each group. Data: meeting-dated swap errors by window, currency and method (CSV)

The clearest result is bias. Both bootstraps sit below the traded rate on average in every cell, the flat version more than the smooth, and just as strongly when the refit contains no other traded period: the bias comes from how the bootstrap builds the curve, not from the targets. The fit’s average error is within a basis point of zero in every cell, with no consistent sign. Its 90th percentile is the lowest in all six cells: significantly so against the flat bootstrap everywhere and against the smooth one in the EUR and GBP tariff cells, a consistent pattern in the other four. At the median the smooth bootstrap and the fit are within 0.4 bp in every cell. Here the bootstraps know the calendar too: the median gap to the smooth bootstrap closes, while the tail and the bias remain.

Two qualifications. Both windows priced easing; if the bias comes from how the bootstrap builds the curve, a window that priced hikes should reverse its sign, and that is the next test. And the USD sample is narrow, about one period per date.

Where it loses

At two weeks the fit’s median error is larger than either bootstrap’s in every currency, by at most 0.15 bp, and at three weeks it trails the flat bootstrap in EUR and GBP, although at both tenors its 90th percentile is two to four times smaller. At nine months it trails the smooth bootstrap marginally at the median in EUR and clearly at the 90th percentile in GBP (2.01 against 1.22 bp). On 24 USD dates in early 2019 without a 25-year quote it misses the 20-year by about 1.8 bp, the bootstraps by 1.4 to 1.7. Its single worst error, 17.7 bp on a 20-year quote on 17 March 2020, is larger than either bootstrap’s worst in that window; in the other nineteen window and currency cells its worst is the smallest of the three.

Nor does it reprice everything exactly. On the front end it treats the short quotes as targets rather than hard constraints: by window and currency the median in-sample miss is 0.04 to 0.4 bp and the 90th percentile 0.1 to 2.1 bp, the large misses mostly on one-week quotes. The bootstraps reprice their inputs to 0.005 bp. Whether that trade is worth it is the point of Exhibit 1.

What it costs

More knots should mean slower. On the same twenty instruments the fit solves for about 160 knots against the bootstrap’s 20, an eight times larger problem, yet in the two windows I timed (2022 and the 2025 tariffs) it costs 0.81 to 1.10 times the flat bootstrap per date, Python binding overhead included. The smooth bootstrap costs two to nearly five times as much as the fit: its slope at each knot depends on the next knot, so it solves the chain several times over before it settles. Of 36,067 refits per method the fit failed none; the smooth bootstrap failed five.

An old idea

The idea is not new: Hyer’s book describes the search. What this adds is evidence, scored against quotes the curve was not given: the underdetermined fit is at least as close to the market as the bootstrap, at the median and in the tail, in every window I tested, and its front-end lead is largest when the market is pricing a path of scheduled central-bank decisions.

The fit described here is part of Quantara, a cross-asset analytics library; the Quantara Internals series covers more of it.

Data: OIS quotes from a commercial vendor capture (only aggregate error statistics are shown); meeting-period swaps from public swap data repository prints, after the provider’s screen for fee-bearing, unwound and outlier prints (88 per cent of excluded period-days had fewer than three prints to begin with); central-bank calendars as known on each date, cancelled and moved meetings included.