Lesson 8.4: Local and stochastic volatility, calibration and model risk
Learn local and stochastic volatility, how Heston produces the smile, how models are calibrated, why parameters can be unstable, and what model risk is.
By the end of this lesson you will be able to explain how a local volatility model and a stochastic volatility model each reproduce an implied volatility smile, describe the Heston model and the roles of its five parameters, price options in it, say how a model is calibrated to market prices, recognise when a calibration is unstable, and give examples of model risk: two models that agree on vanilla options and disagree on others. You will show that the Heston model with a correlation of −0.7 gives implied volatilities of 24.4, 22.1, 19.8, 17.6 and 15.9 per cent across the strikes 80 to 120, that a correlation of zero turns the skew into a smile, that a digital call worth 0.322 in that model is worth 0.287 at a flat at-the-money volatility, that fitting three parameters to a noisy smile recovers them to within a few per cent while fitting all five can return a speed of reversion of 7 when the truth is 2, and that such a fit can match the six-month smile to within noise yet misprice the one-year smile by 2 to 5 volatility points. You should have read Lessons 6.3, 7.2, 7.3 and 8.2. The mathematics is stochastic differential equations, implied volatility and least squares. This course is education about how markets and research work, not investment advice.
Lesson 6.3 left a problem. The market's implied volatilities differ by strike and expiry, which the Black–Scholes model, with its single constant volatility, cannot reproduce. This lesson shows the two main families of models built to fix it, how a model is fitted to the market, and what can go wrong. The last point deserves the most attention. Every model is a simplification, and the question that matters in practice is not whether a model is true but where it can mislead you.
The two ideas
The constant volatility σ of Black–Scholes can be generalised in two ways.
Local volatility. Let the volatility be a function of the price and the time: dS = r S dt + σ(S, t) S dW. There is still only one source of randomness, the Brownian motion W, so the model stays complete, and the option can still be hedged by the underlying alone. Bruno Dupire showed in 1994 that, given a full surface of call prices, there is exactly one such function σ(S, t) that reproduces all of them.
Stochastic volatility. Let the volatility itself be random, driven by its own Brownian motion: dS = r S dt + √v S dW₁ and dv = (...) dt + (...) dW₂. There are now two sources of randomness, with a correlation ρ between them. The market is no longer complete, since volatility cannot be traded directly by the share alone, and the option cannot be hedged perfectly with the share.
Each idea has a strength. Local volatility fits today's smile exactly by construction. Stochastic volatility describes more realistic dynamics: volatility moves on its own, in clusters, as Lesson 2.2 showed.
Local volatility and the Dupire formula
Take the market's call prices C(K, T) at all strikes K and expiries T, which we think of as a smooth surface. The Dupire formula gives the local variance:
σlocal²(K, T) = [ ∂C/∂T + r K ∂C/∂K ] ÷ [ ½ K² ∂²C/∂K² ]
The denominator is proportional to the butterfly price of Lesson 6.3, the second derivative of the call price in strike, which is the density of the share price at T (up to a discount factor). The numerator measures how the call value changes with time. In words, the local variance at a price and a time is the rate at which the option surface evolves, relative to the density of the price. The formula needs the no-arbitrage conditions of Lesson 6.3 to hold: a positive butterfly price and a calendar condition keep the denominator positive and the numerator sensible.
To see what it does, we computed the local volatility surface from the prices of a model with a known smile, the Heston model below, at six months:
Strike · 80 · 90 · 100 · 110 · 120Implied volatility · 24.4% · 22.1% · 19.8% · 17.6% · 15.9%
Local volatility · 28.4% · 24.1% · 19.9% · 16.1% · 13.7%
The local volatility has the same shape as the implied volatility but is about twice as steep: between the strikes 90 and 110 the implied volatility falls by 4.5 points and the local volatility by 8.0. This is a general rule of thumb. The implied volatility of an option is a kind of average of the local volatilities along the paths that reach its strike, so the local volatility must move more to produce a given implied slope.
Local volatility is attractive because it is exact for today's vanilla options and simple to implement, with a finite-difference solver of the kind in Lesson 8.2 or Monte Carlo as in Lesson 8.1. Its weakness is in the dynamics. In a local volatility model the smile moves with the share in a rigid way, as the price changes the volatility at each level changes with it, and the model predicts that when the market rises the implied volatility of a fixed strike will rise, which is the opposite of what is observed in equity indices, where implied volatility typically falls as the market rises. A hedge based on this prediction is wrong in the way traders notice.
Stochastic volatility and the Heston model
Steven Heston's 1993 model is the most widely used stochastic volatility model. The share and its variance v follow
dS = r S dt + √v S dW₁
dv = κ (θ − v) dt + ξ √v dW₂, with the correlation of dW₁ and dW₂ equal to ρ
The variance mean-reverts, like the short rate of Lesson 8.3 and the spreads of Lesson 5.2, with a square-root volatility that keeps it non-negative. Five parameters describe it:
Parameter · Meaning · Effectv₀ · Initial variance · Sets the level of the short-dated at-the-money volatility, √v₀
θ · Long-run variance · Sets the level towards which volatility reverts, so the long-dated level
κ · Speed of mean reversion · How quickly volatility returns to its long-run level, which shapes the term structure
ξ · Volatility of variance ("vol of vol") · Controls the curvature of the smile, and the fatness of the tails
ρ · Correlation between price and variance · Controls the skew: negative ρ gives the equity skew
A condition due to William Feller, 2κθ ≥ ξ², keeps the variance from reaching zero.
How it produces a smile
The intuition for ρ is simple. If ρ is negative, falls in the price go with rises in volatility. When the share falls, the variance rises, so large down-moves are bigger and more frequent, which fattens the left tail of the distribution and thins the right tail. Low strikes become more expensive (higher implied volatility), high strikes cheaper, and the result is the skew of Lesson 6.3. The parameter ξ makes volatility itself volatile, which fattens both tails and puts curvature in the smile.
Heston's model has a semi-analytic formula for European options through the characteristic function of the log price, so options can be priced in milliseconds without simulation. We priced six-month options with the illustrative parameters v₀ = 0.04 (a 20 per cent volatility), θ = 0.04, κ = 2, ξ = 0.35 and ρ = −0.7, with 6 per cent interest, on a share at 100. Feller's condition holds, since 2κθ = 0.16 exceeds ξ² = 0.1225. The implied volatilities are:
Strike · 80 · 90 · 100 · 110 · 120Heston implied volatility · 24.38% · 22.09% · 19.80% · 17.63% · 15.91%
This is a typical equity skew, falling about 8.5 points from 80 to 120. A Monte Carlo simulation of the same model, with 200,000 paths and 200 steps, agreed with the formula to within about 0.03 on the call prices, with the Euler discretisation bias that Lesson 8.1 warned about.
The roles of ρ and ξ
Changing one parameter at a time shows what each does. With the other parameters as above:
Correlation ρ · Implied volatility at strikes 80, 90, 100, 110, 120−0.7 · 24.4, 22.1, 19.8, 17.6, 15.9
0 · 21.1, 20.0, 19.4, 19.5, 20.1
+0.7 · 15.3, 16.6, 18.9, 21.0, 22.9
With a negative correlation the curve slopes down, with zero correlation it is a smile, symmetric and U-shaped, and with a positive correlation it slopes up, as is seen in some commodities. With the correlation at zero, the vol-of-vol sets the curvature:
Vol of vol ξ (ρ = 0) · Implied volatility at strikes 80, 90, 100, 110, 1200.10 · 20.1, 20.0, 19.95, 19.96, 20.0
0.35 · 21.1, 20.0, 19.4, 19.5, 20.1
0.60 · 22.3, 19.9, 18.5, 18.8, 20.3
A small ξ is almost flat, which is Black–Scholes, and a large ξ puts a pronounced smile into the surface.
Look at how the parameters shape the process itself. The simulator below reports the Feller ratio, the long-run level and the typical swing of the variance.
The skew in one formula
For short maturities, a useful approximation links the slope of the at-the-money smile to the parameters. The implied volatility changes with log-moneyness k = ln(K ÷ F) at a rate of about
∂σimp/∂k ≈ ρ ξ ÷ (4 √v₀)
With ρ = −0.7, ξ = 0.35 and √v₀ = 0.2 this gives −0.306 per unit of log-moneyness, or −3.1 volatility points for every 10 per cent move in the strike. The numbers from the full model give about −2.2 points per 10 per cent over six months, so the short-maturity formula overstates the slope at this horizon, but it shows the scaling: the skew is proportional to the correlation and to the vol of vol, and inversely proportional to the level of volatility.
Calibration: fitting a model to the market
A model is of no use for pricing until its parameters are set so that it reproduces the prices of the options that trade. This is calibration: choose the parameters to minimise the difference between the model's and the market's prices or implied volatilities, usually by least squares:
minimise over (v₀, θ, κ, ξ, ρ) the sum, over the quoted options, of the squared difference between the model and market implied volatility
The calibrated model then prices options that do not trade, such as strikes between the quotes, or exotic options that are hard to quote, in a way that is consistent with the vanilla market. Calibration is repeated every day, since the market moves.
It is easy to do badly, for three reasons. The objective function has many flat directions and local minima, so the answer depends on the starting point. Market quotes contain noise, from bid–ask spreads and stale prices. And a model with many parameters can fit a single smile almost perfectly in several different ways.
We tested this with a controlled experiment. We generated a "market" smile of six-month implied volatilities from the Heston model with known parameters (v₀ = 0.04, θ = 0.04, κ = 2, ξ = 0.35, ρ = −0.7), added noise of 0.2 volatility points to each of five quotes, and calibrated, repeating with fresh noise.
Calibration · v₀ (true 0.04) · κ (true 2) · θ (true 0.04) · ξ (true 0.35) · ρ (true −0.7)Three free parameters (κ and θ fixed), 15 repeats · 0.0401 ± 0.0005 · fixed · fixed · 0.368 ± 0.024 · −0.686 ± 0.039
Five free parameters, 10 repeats · 0.088 ± 0.051 · 7.25 ± 6.90 · 0.100 ± 0.263 · 0.596 ± 0.339 · −0.734 ± 0.071
(Values are the mean ± the standard deviation across the repeats.) With three parameters free, the calibration recovers the truth closely: v₀ to within 0.0005, the vol of vol to within 0.024 and the correlation to within 0.04. With all five free, the parameters are badly determined: the speed of reversion averages 7.25 with a spread of 6.9 when the truth is 2, and the long-run variance θ averages 0.100 against 0.04 with a spread larger than its mean. The reason is that, with one maturity, the speed of reversion and the long-run level hardly affect the shape of the smile at that maturity, so many combinations fit equally well.
Fitting well does not mean pricing well
The unstable five-parameter fits are not poor in the sense of failing to fit. They match the six-month smile to within 0.13 to 0.37 volatility points, the size of the noise. But they differ from the truth in what they predict for other maturities. We took each fitted parameter set and priced the one-year smile, which the calibration had not seen, and compared it with the true one-year smile. The errors were 2.0 to 2.4 volatility points on average and up to about 5 points at the worst strike. Five volatility points on a one-year option with a vega like the ones in Lesson 6.2 is a large pricing error: more than a fifth of the option's value.
This is the central lesson of calibration. A model that fits the instruments you give it says little about the instruments you did not. What counts is whether the calibration is determined by the data: whether the parameters are stable from day to day, whether they have sensible values, and whether a model calibrated to some options predicts the prices of others. The practical safeguards are to calibrate to several maturities at once, to fix or restrict parameters that the data cannot determine, to add a penalty for departures from yesterday's parameters, and to check the fit out of sample.
Model risk
Model risk is the risk of loss from using a model that is wrong or misused. It arises from the choice of model, from the calibration, from the implementation and from using a model outside the conditions for which it was built. Two models can agree on all the vanilla options and still disagree on exotic ones, because exotic payoffs depend on features of the dynamics that vanilla prices do not pin down.
A clear example is a digital call, which pays 1 if the share finishes above a strike and 0 otherwise. Its price is the discounted risk-neutral probability of finishing above the strike, which equals minus the slope of the call price against strike, −∂C/∂K. It depends on the slope of the smile, not only its level. For a strike of 110, six months and 6 per cent interest:
In the Heston model, the digital call is worth 0.322, a risk-neutral probability of 33.2 per cent.
In Black–Scholes at the at-the-money volatility of 19.8 per cent, it is worth 0.287.
The Black–Scholes price is 11 per cent too low. The smile is skewed, so the call price falls less steeply with strike than a flat-volatility model implies, and the probability of finishing above 110 is higher. A bank selling the digital at the flat-volatility price would lose. We checked the Heston number two ways: directly from the model, 0.32195, and as minus the numerical slope of its call prices, 0.32197.
Other sources of model risk, and ways to manage them:
Dynamics differ even when the surface matches. Local volatility and Heston can fit the same smile, yet they imply different future smiles, and so different prices for options that start in the future (forward-start options, cliquets) and for barrier options. Compare several models, and price the exotic option in each.
Parameter instability. If calibrated parameters jump from day to day, hedges based on them are unreliable. Monitor them.
Hedging error. A model is used to compute hedge ratios, and a wrong model gives wrong hedges even if its prices are right.
Implementation errors. Bugs, numerical error, inconsistent data. Test against known cases, as in Lessons 8.1 and 8.2.
Use outside the domain. A model built for calm markets may fail in a crisis.
Reserves and limits. Banks hold model reserves, an amount set aside for the difference between the prices of competing models, and limit positions in products that depend heavily on the model.
Governance. Independent validation of models, and a record of assumptions and limitations, are standard. The Federal Reserve's guidance SR 11-7 on model risk management is widely followed, and regulators elsewhere expect similar practice.
The honest attitude is that every model is wrong, and the useful question is by how much, for this product, in this market.
Beyond Heston
Local-stochastic volatility (LSV) combines the two ideas: stochastic volatility for the dynamics with a local volatility factor so that the model reproduces today's vanilla surface exactly. It is the common choice for exotic options.
Jump models add sudden moves in the price or the variance, which helps fit the short-dated skew.
SABR (Hagan and others) is a stochastic volatility model that gives a closed-form approximation for implied volatilities, widely used for interest-rate options.
Rough volatility models, in which volatility has a much rougher path than Brownian motion, fit the short-dated skew with few parameters, a topic of active research.
The code below prices options in the Heston model through its characteristic function, finds the smile and its dependence on the parameters, computes the Dupire local volatility and the digital price, and runs the calibration experiment.
python
import numpy as np
from math import exp, log, sqrt, pi
from scipy.stats import norm
from scipy.integrate import quad
from scipy.optimize import brentq, leastsquares
def bscall(S, K, r, sig, T):
d1 = (log(S / K) + (r + 0.5 sig 2) T) / (sig sqrt(T))
return S norm.cdf(d1) - K exp(-r T) norm.cdf(d1 - sig sqrt(T))
def hestoncf(u, S, r, T, v0, kappa, theta, xi, rho):
"""Characteristic function of the log price in the Heston model (the 'little trap' form)."""
i = 1j
d = np.sqrt((rho xi i u - kappa) 2 + xi 2 (i u + u u))
g = (kappa - rho xi i u - d) / (kappa - rho xi i u + d)
e = np.exp(-d T)
C = r i u T + (kappa theta / xi 2) ((kappa - rho xi i u - d) T - 2 np.log((1 - g e) / (1 - g)))
D = ((kappa - rho xi i u - d) / xi 2) ((1 - e) / (1 - g e))
return np.exp(C + D v0 + i u np.log(S))
def hestoncall(S, K, r, T, v0, kappa, theta, xi, rho):
"""European call price and the risk-neutral chance of finishing above K."""
f1 = lambda u: (np.exp(-1j u np.log(K)) hestoncf(u - 1j, S, r, T, v0, kappa, theta, xi, rho)
/ (1j u hestoncf(-1j, S, r, T, v0, kappa, theta, xi, rho))).real
f2 = lambda u: (np.exp(-1j u np.log(K)) hestoncf(u, S, r, T, v0, kappa, theta, xi, rho) / (1j u)).real
P1 = 0.5 + quad(f1, 1e-8, 200, limit=200)[0] / pi
P2 = 0.5 + quad(f2, 1e-8, 200, limit=200)[0] / pi
return S P1 - K exp(-r T) P2, P2
def impliedvol(price, S, K, r, T):
return brentq(lambda s: bscall(S, K, r, s, T) - price, 1e-4, 3.0)
S0, r, T = 100.0, 0.06, 0.5
base = dict(v0=0.04, kappa=2.0, theta=0.04, xi=0.35, rho=-0.7)
strikes = [80, 90, 100, 110, 120]
print("Feller: 2 kappa theta =", 2 base["kappa"] base["theta"], "| xi^2 =", round(base["xi"] 2, 4))
def smile(params, maturity, ks=strikes):
return np.array([impliedvol(hestoncall(S0, K, r, maturity, params)[0], S0, K, r, maturity) for K in ks])
print("Heston smile, rho = -0.7:", np.round(smile(base, T) 100, 2))
for rho in (0.0, 0.7):
print(f"rho = {rho:+.1f}:", np.round(smile({base, "rho": rho}, T) 100, 2))
for xi in (0.10, 0.60):
print(f"rho = 0, xi = {xi}:", np.round(smile({base, "rho": 0.0, "xi": xi}, T) 100, 2))
Dupire local volatility from the Heston call prices, by finite differences
C = lambda K, maturity: hestoncall(S0, K, r, maturity, base)[0]
hK, hT = 0.5, 0.01
local = []
for K in strikes:
CT = (C(K, T + hT) - C(K, T - hT)) / (2 hT)
CK = (C(K + hK, T) - C(K - hK, T)) / (2 hK)
CKK = (C(K + hK, T) - 2 C(K, T) + C(K - hK, T)) / hK 2
local.append(sqrt((CT + r K CK) / (0.5 K 2 CKK)))
print("local volatility:", np.round(np.array(local) 100, 2))
the digital call: Heston against Black-Scholes at the at-the-money volatility
atm = impliedvol(hestoncall(S0, 100, r, T, base)[0], S0, 100, r, T)
call, prob = hestoncall(S0, 110, r, T, base)
flat = norm.cdf((log(S0 / 110) + (r - 0.5 atm 2) T) / (atm sqrt(T)))
slope = -(hestoncall(S0, 110.5, r, T, base)[0] - hestoncall(S0, 109.5, r, T, base)[0]) / 1.0
print("digital call, strike 110: Heston", round(exp(-r T) prob, 4), "| as minus the call-price slope", round(slope, 4),
"| Black-Scholes at the at-the-money volatility", round(exp(-r T) flat, 4))
calibration experiment: a noisy six-month smile, three free parameters against five
rng = np.random.defaultrng(2)
clean = {0.5: smile(base, 0.5), 1.0: smile(base, 1.0)}
def calibrate(target, free, x0, fixed):
def residuals(x):
p = dict(fixed); p.update(dict(zip(free, x)))
return (smile(p, 0.5) - target) 100
lower = [1e-4 if f in ("v0", "xi", "theta", "kappa") else -0.99 for f in free]
upper = [20 if f == "kappa" else 1.0 for f in free]
return leastsquares(residuals, x0, bounds=(lower, upper), xtol=1e-6, ftol=1e-6).x
three = np.array([calibrate(clean[0.5] + rng.normal(0, 0.002, 5), ["v0", "xi", "rho"], [0.05, 0.5, -0.5], dict(kappa=2.0, theta=0.04))
for in range(15)])
print("three free parameters (v0, xi, rho): mean", np.round(three.mean(axis=0), 4), "| sd", np.round(three.std(axis=0), 4))
RUNFIVEPARAMETERTEST = False # about eight minutes; the lesson's numbers come from this test with 10 repeats
if RUNFIVEPARAMETERTEST:
names = ["v0", "kappa", "theta", "xi", "rho"]
five = np.array([calibrate(clean[0.5] + rng.normal(0, 0.002, 5), names, [0.05, 1.0, 0.05, 0.5, -0.5], {}) for in range(10)])
print("five free parameters: mean", np.round(five.mean(axis=0), 3), "| sd", np.round(five.std(axis=0), 3))
errors = np.array([(smile(dict(zip(names, x)), 1.0) - clean[1.0]) 100 for x in five])
print("error on the unseen one-year smile (volatility points): mean absolute", np.round(np.abs(errors).mean(axis=0), 2),
"| largest", np.round(np.abs(errors).max(axis=0), 2))
Common mistakes
Treating a good fit as proof of a good model. A model that fits the quotes can misprice every other product.
Calibrating too many parameters to too little data. One maturity cannot determine the speed of reversion and the long-run level.
Ignoring noise in the quotes. Calibrating to the last tick instead of a smoothed surface produces jumping parameters.
Using local volatility to hedge as if the smile moved the way it predicts. Its dynamics of the smile differ from the market's.
Pricing a digital or a barrier option with a flat volatility. These depend on the slope of the smile and on the dynamics.
Pricing exotics with one model only. Compare at least two to see the model risk.
Overlooking the Feller condition in simulation. A variance that can reach zero needs a careful scheme.
Not tracking calibrated parameters. A sudden jump signals a data problem or an unstable fit.
Forgetting that the model is calibrated under Q. Its parameters are risk-neutral, and they do not forecast realised volatility or its dynamics.
Key takeaways
Local volatility makes σ a function of price and time, and the Dupire formula σ² = (CT + rK CK) ÷ (½K² CKK) reproduces any arbitrage-free surface. Its local volatility is about twice as steep as the implied volatility: 28.4 per cent to 13.7 per cent against 24.4 to 15.9 in our example.
Stochastic volatility, as in the Heston model, gives volatility its own mean-reverting random motion: v₀ sets the level, θ the long-run level, κ the speed, ξ the curvature and ρ the skew. The Feller condition 2κθ ≥ ξ² keeps the variance positive.
With ρ = −0.7 Heston gives implied volatilities of 24.4, 22.1, 19.8, 17.6 and 15.9 per cent at strikes 80 to 120. A correlation of zero gives a smile, and +0.7 reverses the skew.
Calibration chooses parameters to match market prices. With three free parameters it recovered the truth within a few per cent. With five on one maturity, the speed of reversion averaged 7.25 against a true 2, with a spread of 6.9.
The unstable fits matched the six-month smile to within the noise, yet misprice the unseen one-year smile by 2 to 5 volatility points. Fitting the quotes does not make the model right about other products.
Model risk: a digital call is worth 0.322 in Heston and 0.287 at a flat at-the-money volatility, because digitals depend on the slope of the smile. Compare models, hold reserves, validate independently and monitor parameter stability.
Local-stochastic volatility, jump models, SABR and rough volatility extend the family, and each needs calibration and testing.
Check yourself
1. In a Heston model, what happens to the skew if the correlation changes from −0.7 to zero?
The skew disappears and a symmetric smile remains, because the price and the variance no longer move together. Low strikes are no longer more expensive than high ones.
2. A Heston model has κ = 1.5, θ = 0.05 and ξ = 0.6. Is the Feller condition satisfied?
2κθ = 0.15 and ξ² = 0.36. The condition fails, since 0.15 < 0.36, so the variance can reach zero.
3. Why does a local volatility surface change more steeply with strike than the implied volatility surface?
The implied volatility of an option averages the local volatilities along the paths that end at its strike, so it moves about half as much as the local volatility.
4. A calibration to one maturity returns a speed of reversion of 12, when yesterday's was 1.5. What do you do?
Treat it as a warning of an ill-determined fit. Calibrate to several maturities, fix or restrict the speed, add a penalty to yesterday's value and check the out-of-sample fit.
5. A trader prices a digital call with the at-the-money Black–Scholes volatility. In a market with an equity-style skew, is the price too high or too low for a call above the money?
Too low. The skew means the call price falls less steeply with strike than a flat model says, so the risk-neutral probability of finishing above the strike is higher than the flat model gives.
Try this
Set aside forty-five minutes. You need Python and the code of this lesson.
1. Run the code. Check the smile, the local volatility, the digital prices and the three-parameter calibration.
2. Change ρ from −0.7 to −0.3 and −0.9. Plot the smiles together and describe the skew.
3. Compute the smile at a maturity of one month and of one year. How does its shape change with maturity?
4. Compute the digital call price at strikes 90, 100 and 110 in Heston and in Black–Scholes at the at-the-money volatility. Where is the gap largest?
5. Calibrate three free parameters to the smile with 0.5 volatility points of noise instead of 0.2. How much more do the parameters spread?
6. Set RUNFIVEPARAMETERTEST = True if you have the time, and check the instability of the five-parameter fit and the error on the one-year smile.
7. Write a short note: which exotic product you would worry about most if your model were wrong, which second model you would use to compare, and what you would put in a model reserve.
A good result is a Heston smile whose shape you can explain from its parameters, a calibration whose stability you have measured and a digital or exotic price compared across two models. This completes the module on quantitative theory. The next module turns to the industry in which these skills are used: hedge funds, how they are structured and paid, the strategies they run and how they fail.
Read more
Steven Heston's 1993 paper "A Closed-Form Solution for Options with Stochastic Volatility with Applications to Bond and Currency Options" in the Review of Financial Studies is the source, and Hansjörg Albrecher, Philipp Mayer, Wim Schoutens and Jurgen Tistaert's 2007 paper "The Little Heston Trap" explains the stable form of the characteristic function used here. Bruno Dupire's 1994 paper "Pricing with a Smile" in Risk introduced local volatility, and Jim Gatheral's The Volatility Surface is the standard reference on all of this, including calibration and the properties of the smile. Patrick Hagan and co-authors' 2002 paper "Managing Smile Risk" in Wilmott Magazine introduced SABR. Riccardo Rebonato's Volatility and Correlation and Emanuel Derman's 1996 note "Model Risk" in Risk discuss model risk from a practitioner's view, and Jim Gatheral, Thibault Jaisson and Mathieu Rosenbaum's 2018 paper "Volatility is Rough" in Quantitative Finance introduced rough volatility.
Tags: Quant Trader Stochastic volatility Heston model Calibration Model risk