Skip to content

gjunjie/vol_surface_calibration

Repository files navigation

Volatility Surface Fitting with SVI Model

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.

Overview

This project implements a complete pipeline for volatility surface calibration:

  1. Data Loading & Cleaning: Loads options data from CSV files and filters for quality
  2. Implied Volatility Calculation: Computes implied volatilities using the Black-76 model
  3. SVI Calibration: Fits SVI parameters to market implied volatilities for each expiry/timestamp
  4. Arbitrage Checking: Validates calibrated surfaces for butterfly convexity and calendar monotonicity
  5. Visualization: Generates plots comparing market vs fitted IVs and ATM term structures

Features

  • 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

Project Structure

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

Installation

  1. Clone or download this repository

  2. Install required dependencies:

pip install -r requirements.txt

Required 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

Usage

Basic Usage

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)

Data Format

The input DataFrame should contain the following columns:

  • Strike: Strike prices
  • ExpirationDate: Expiration date (YYYYMMDD format or datetime)
  • Date: Trade date (YYYYMMDD format or datetime)
  • CloseTradePrice: Option closing price
  • UnderCloseBidPrice: Underlying bid price
  • UnderCloseAskPrice: Underlying ask price
  • CallPut: Option type ('C' for call, 'P' for put)
  • Volume: Trading volume (optional, but recommended for filtering)

Jupyter Notebooks

Two analysis notebooks are provided:

  1. vol_calibration.ipynb: Hourly calibration workflow with visualizations
  2. calibration_analysis.ipynb: Detailed analysis of calibration results

Key Components

VolSurfaceEngine

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

SVICalibrator

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.

ArbitrageChecker

Validates calibrated surfaces for:

  1. Butterfly Convexity: Ensures the second derivative of total variance is non-negative
  2. Calendar Monotonicity: Ensures total variance is non-decreasing with time to expiration

Black-76 Model

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).

Output

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

Example Output

The calibrated parameters DataFrame includes:

  • expiry: Expiration date
  • timestamp: Trade date
  • a, b, rho, m, sigma: SVI parameters
  • T: Time to expiration in years
  • rmse, weighted_rmse, mae: Fit quality metrics
  • butterfly_valid, calendar_valid, overall_valid: Arbitrage validation flags

Notes

  • 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

Visualizations

Market vs Fitted Implied Volatilities: Market vs Fitted IV

ATM Term Structure: ATM Term Structure

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors