A Python implementation for calibrating volatility surfaces from options market data using the Stochastic Volatility Inspired (SVI) parameterization. This project provides tools for calculating implied volatilities, fitting SVI models, and checking for arbitrage conditions in the calibrated surfaces.
This project implements a complete pipeline for volatility surface calibration:
- Data Loading & Cleaning: Loads options data from CSV files and filters for quality
- Implied Volatility Calculation: Computes implied volatilities using the Black-76 model
- SVI Calibration: Fits SVI parameters to market implied volatilities for each expiry/timestamp
- Arbitrage Checking: Validates calibrated surfaces for butterfly convexity and calendar monotonicity
- Visualization: Generates plots comparing market vs fitted IVs and ATM term structures
- SVI Model Implementation: Full SVI parameterization with 5 parameters (a, b, ρ, m, σ)
- Black-76 Pricing: Fast implied volatility calculation using multiple approximation methods
- Arbitrage Detection: Checks for butterfly convexity and calendar monotonicity violations
- Risk-Free Rate Interpolation: Handles term structure of interest rates
- Batch Processing: Calibrates surfaces for multiple expiries and timestamps
- Visualization Tools: Jupyter notebooks for analysis and visualization
vol_surface_fit/
├── src/
│ ├── vol_surface_engine.py # Main calibration engine
│ ├── svi_model.py # SVI model implementation
│ ├── black76_model.py # Black-76 pricing and IV calculation
│ └── arbitrage_checker.py # Arbitrage condition checking
├── utils/
│ ├── data_loader.py # Data loading utilities
│ └── rates.py # Risk-free rate interpolation
├── data/
│ └── TSLA/ # Sample options data
│ ├── TSLA.20200214.csv
│ ├── TSLA.20200320.csv
│ ├── TSLA.20200619.csv
│ └── TSLA.20200918.csv
├── calibration_analysis.ipynb # Analysis notebook
├── vol_calibration.ipynb # Calibration notebook
└── requirements.txt # Python dependencies
-
Clone or download this repository
-
Install required dependencies:
pip install -r requirements.txtRequired packages:
- pandas >= 2.0.0
- numpy >= 1.24.0
- scipy >= 1.10.0
- matplotlib >= 3.7.0
- jupyter >= 1.0.0
- ipykernel >= 6.25.0
from utils.data_loader import load_data
from src.vol_surface_engine import VolSurfaceEngine
# Load options data
df = load_data('TSLA')
# Initialize and run calibration
engine = VolSurfaceEngine()
engine.calibrate(df)
# Get calibrated parameters
params_df = engine.get_params()
print(params_df)The input DataFrame should contain the following columns:
Strike: Strike pricesExpirationDate: Expiration date (YYYYMMDD format or datetime)Date: Trade date (YYYYMMDD format or datetime)CloseTradePrice: Option closing priceUnderCloseBidPrice: Underlying bid priceUnderCloseAskPrice: Underlying ask priceCallPut: Option type ('C' for call, 'P' for put)Volume: Trading volume (optional, but recommended for filtering)
Two analysis notebooks are provided:
vol_calibration.ipynb: Hourly calibration workflow with visualizationscalibration_analysis.ipynb: Detailed analysis of calibration results
The main orchestration class that runs the complete calibration pipeline:
- Data cleaning and filtering
- Implied volatility calculation
- Grouping by expiry and timestamp
- SVI calibration for each group
- Arbitrage checking
Fits SVI parameters to market implied volatilities using weighted least squares optimization. The SVI model parameterizes total variance as:
w(k) = a + b * (ρ * (k - m) + sqrt((k - m)² + σ²))
where k = log(K/F) is the log-moneyness.
Validates calibrated surfaces for:
- Butterfly Convexity: Ensures the second derivative of total variance is non-negative
- Calendar Monotonicity: Ensures total variance is non-decreasing with time to expiration
Implements the Black-76 option pricing model for futures/forward options and provides fast implied volatility calculation using multiple approximation methods (Brenner-Subrahmanyam, Corrado-Miller, and Newton-Raphson).
The calibration produces:
- Calibrated Parameters: SVI parameters (a, b, ρ, m, σ) for each expiry/timestamp combination
- Fit Metrics: RMSE, weighted RMSE, and MAE for each calibration
- Arbitrage Results: Validation flags for butterfly convexity and calendar monotonicity
- Visualizations: Comparison plots of market vs fitted implied volatilities
The calibrated parameters DataFrame includes:
expiry: Expiration datetimestamp: Trade datea,b,rho,m,sigma: SVI parametersT: Time to expiration in yearsrmse,weighted_rmse,mae: Fit quality metricsbutterfly_valid,calendar_valid,overall_valid: Arbitrage validation flags
- The calibration filters options with strike/forward ratios between 0.5 and 1.5
- Risk-free rates are interpolated from a term structure
- The SVI calibration uses weighted least squares with volume-based weights
- Liquidity varies by maturity: Different maturities exhibit different levels of liquidity. Pay special attention when calibrating surfaces across multiple expiries, as data quality and availability can vary significantly
- Near-term skew handling: Near-term options often exhibit very steep skews. This requires special handling during calibration to ensure accurate parameter fitting and to avoid arbitrage violations

