Class BootstrapJacobian

java.lang.Object
com.quantfinlib.rates.BootstrapJacobian

public final class BootstrapJacobian extends Object
Bucketed curve risk from the analytic Jacobian of the bootstrap, instead of bumping each quote and rebuilding the curves (MultiCurveRisk).

The plain idea: the bootstrap makes every instrument reprice, q = I(Y), where Y are the pillar values y_j = -ln P(t_j) of the OIS curve and then the projection curve. Differentiating that identity (implicit function theorem) gives the pillar response to a quote move without re-solving anything:

  J = dI/dY            (analytic, per instrument; square, block lower triangular)
  dY/dq = J^{-1}
  dPV/dq = (dPV/dY)^T J^{-1}       bucketed DV01_k = 1bp * (J^{-T} dPV/dY)_k

J is built in closed form from each instrument's implied-quote formula and the curve's interpolation weights dy(t)/dy_j: exact for CurveInterpolation.LOG_LINEAR_DISCOUNT; for CurveInterpolation.MONOTONE_CONVEX the instrument formulas stay analytic but the interpolation weights are central differences of the interpolant (no re-bootstrap). dPV/dY is a central difference in the pillar values, because the PV function is a black box.

Worked example and check: on the test OIS + 3M curve set with log-linear interpolation, the buckets match the bump-and-rebuild MultiCurveRisk.bucketedDv01(LocalDate, List, List, CurveInterpolation, ToDoubleBiFunction) to about 1e-6 relative (the difference is the second-order term of a 1bp central bump); the Jacobian itself matches a finite difference of the implied quotes to 1e-6. With monotone-convex interpolation it matches a 1e-7 quote-bump rebuild to 1e-4 of the largest bucket, while the 1bp rebuild of MultiCurveRisk can be off by about 10% in single buckets, because a 1bp move crosses the interpolant's shape-zone kinks. That is the practical case for this class.