calibrate_svi

Function calibrate_svi 

Source
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. Use default_configs for common presets.
  • calib_params - Calibration-specific parameters controlling log-moneyness range, arbitrage checking, and penalty weights. Use CalibrationParams::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::Error if the data contains multiple expirations (SVI requires single expiration)
  • anyhow::Error if market data is insufficient or contains invalid values
  • anyhow::Error if 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