pub fn calibrate_svi(
data: Vec<MarketDataRow>,
config: OptimizationConfig,
calib_params: CalibrationParams,
initial_guess: Option<Vec<f64>>,
) -> Result<(f64, Vec<f64>, SVIParamBounds)>Expand description
Calibrate SVI model parameters to market option data.
This function performs advanced optimization to fit SVI model parameters to observed market implied volatilities. The optimization uses a two-stage approach: global search with CMA-ES followed by local refinement with L-BFGS-B for robust parameter estimation.
§Arguments
data- Market option data for a single expiration. Must contain option type, strikes, underlying price, time to expiration, market implied volatilities, and vega values.config- Optimization configuration specifying algorithm parameters, tolerances, and computational limits. Usedefault_configsfor common presets.calib_params- Calibration-specific parameters controlling log-moneyness range, arbitrage checking, and penalty weights. UseCalibrationParams::default()for standard settings.
§Returns
Returns a tuple containing:
f64: Final objective function value (lower is better)Vec<f64>: Optimized SVI parameters[a, b, rho, m, sigma]SVIParamBounds: The actual bounds used during optimization (can be fed back as input)
§Errors
anyhow::Errorif the data contains multiple expirations (SVI requires single expiration)anyhow::Errorif market data is insufficient or contains invalid valuesanyhow::Errorif optimization fails to converge within specified limits
§SVI Parameters
The SVI model parameterizes total variance as:
w(k) = a + b * (ρ(k-m) + sqrt((k-m)² + σ²))Where:
a: Base variance level (vertical shift)b: Slope factor (overall variance level)ρ: Asymmetry parameter (skew, must be in (-1, 1))m: Horizontal shift (ATM location in log-moneyness)σ: Curvature parameter (smile curvature, must be > 0)
§Example
use surface_lib::{calibrate_svi, default_configs, CalibrationParams, MarketDataRow};
// Load market data for a single expiration
let market_data: Vec<MarketDataRow> = load_single_expiry_data();
// Use fast configuration for development
let config = default_configs::fast();
let calib_params = CalibrationParams::default();
// Calibrate SVI parameters
match calibrate_svi(market_data, config, calib_params, None) {
Ok((objective, params, used_bounds)) => {
println!("Calibration successful!");
println!("Final objective: {:.6}", objective);
println!("SVI parameters: {:?}", params);
println!("Used bounds: {:?}", used_bounds);
}
Err(e) => eprintln!("Calibration failed: {}", e),
}§Performance Notes
- Calibration typically takes 1-10 seconds depending on configuration and data size
- Memory usage scales linearly with the number of option contracts
- For production systems, consider using
default_configs::production()for optimal accuracy