Add fallback global SVI calibration when sequential slice calibration is infeasible
Motivation
The current SVI calibration is sequential / slice-by-slice. Each maturity is calibrated against the previous slice with calendar constraints.
This can fail in realistic cases because the calibration is path-dependent:
- maturity
i is constrained by maturity i - 1
- if maturity
i - 1 is calibrated too high or in an awkward shape, maturity i may become infeasible
- the next slice is then forced upward by calendar constraints
- this can cascade and cause later maturities to blow up or fail
In other words, local feasibility slice-by-slice does not always imply a good globally feasible surface.
Goal
Add a global SVI calibration path that can be used as a fallback when sequential slice calibration fails.
The global calibration should optimize all maturities together, allowing the optimizer to distribute fit error across the whole surface instead of forcing each slice to fit independently.
Proposed Behavior
Keep the existing slice-by-slice calibration as the default fast path.
If sequential calibration fails due to infeasible constraints or poor convergence, retry using global calibration:
try
{
return calibrateSequential(...);
}
catch (const errors::UnifiedVolError&)
{
return calibrateGlobal(...);
}
Add fallback global SVI calibration when sequential slice calibration is infeasible
Motivation
The current SVI calibration is sequential / slice-by-slice. Each maturity is calibrated against the previous slice with calendar constraints.
This can fail in realistic cases because the calibration is path-dependent:
iis constrained by maturityi - 1i - 1is calibrated too high or in an awkward shape, maturityimay become infeasibleIn other words, local feasibility slice-by-slice does not always imply a good globally feasible surface.
Goal
Add a global SVI calibration path that can be used as a fallback when sequential slice calibration fails.
The global calibration should optimize all maturities together, allowing the optimizer to distribute fit error across the whole surface instead of forcing each slice to fit independently.
Proposed Behavior
Keep the existing slice-by-slice calibration as the default fast path.
If sequential calibration fails due to infeasible constraints or poor convergence, retry using global calibration: