σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyRoadmapsSkills
Ctrl K
AO
+1.2k Learners
LoginJoin ↗
RoadmapsSkills
AO
+1.2k Learners
Login
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyRoadmapsSkills
Ctrl K
AO
+1.2k Learners
LoginJoin ↗
RoadmapsSkills
AO
+1.2k Learners
Login
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
SciPy skill›Module 3 · Matrices, signals and structure›Topic 3.9·~55 minIntermediate

Calibrating a smile surface across expiries

Skill positionModule 3 of 3 · Topic 9 of 10
3.9 Calibrating a smile surface across expiries
—Lab score— / 100Total XP—Streak—

One smile per expiry, and they must agree

Work with total variance w=σ²T against log-moneyness k=ln(K/F). The SVI smile is w(k)=a+b(ρ(k-m)+√((k-m)²+s²)) with five parameters: a lifts the level, b sets the angle of the wings, -1<ρ<1 tilts the smile (negative for equities), m moves the minimum and s rounds the bottom. Fitting it to quotes is a least-squares problem, but a delicate one: the parameters partly compensate each other and a bad start gets stuck. least_squares(residuals, x0, bounds=(lower, upper)) handles the bounds, which keep b>0, |ρ|<1 and s>0, and a robust answer comes from several starting points, keeping the one with the lowest cost.

A surface is one smile per expiry, and the smiles must agree across time. If total variance at some strike falls as the maturity grows, a calendar spread has a negative price, which is an arbitrage. The check is cheap: for consecutive expiries, evaluate both fitted smiles on a grid of k and count the points where w_T₂<w_T₁ (with a tiny tolerance). Remember to sort the expiries first, since a dictionary does not promise an order. The implied volatility of a fit is σ(k)=√(w(k)/T). In the lab, four expiries are fitted to quotes with 0.2% of noise: the rmse is of the size of that noise, the at-the-money volatility is recovered to within 1%, and the surface has no violation; swapping the parameters of two expiries gives 121 violations, one on every grid point.

  • Bounds and several starts: SVI parameters trade off, so fit from three starting points and keep the lowest cost.
  • Total variance, not volatility: compare maturities with w=σ²T, which must not fall as T grows.
  • Sort the expiries before comparing neighbours; a dictionary has no promised order.

Lab · what's graded

  • The SVI smile10 pts
  • Fitting one smile25 pts
  • Calibrating the surface20 pts
  • Implied volatility10 pts
  • Calendar arbitrage20 pts
  • The surface study15 pts
Explorer · lab-sp-23
▾ lab-sp-23
…
bash · in-browser
learner@quantcraft:~/lab-sp-23$
Python not loaded yetPythonLn 1, Col 1Spaces: 4UTF-8

Reset this topic?

Everything in lab-sp-23 goes back to the starter files and the terminal is cleared. Your current solution will be lost — this can't be undone.

Will be reset
  • main.py → starter code
  • Terminal history and test output
  • Unsubmitted changes
Will be kept
  • Best lab score
  • Your XP and streak
  • Lecture progress and notes

Log in to run your code.

Every lecture is free to read. Create an account or log in to run code, run tests and submit this lab.

  • In-browser IDE with a bash terminal — nothing to install
  • Instant grading, XP and your place on the skill
Create an accountLog in
OR
Continue with GitHub