Derivatives and Volatility · Derivatives
10Stochastic Volatility
Asked why the calibrated correlation of her index model is , an options trader answers without a formula: because when the index falls, volatility rises. Asked why the volatility of volatility is 0.6, she points at the wings of the one-year smile, which the model can only reach if variance itself swings. Asked why the mean-reversion speed is 2, she draws the at-the-money term structure bending back to its long-run level within a year. Each of the five numbers of the Heston model has a meaning on the desk, and that is why it has survived thirty years of better-fitting alternatives. This chapter introduces stochastic volatility, derives what can be derived about the Heston model, prices options with its characteristic function, calibrates it to the surface of chapter 9, and reads its parameters the way a trader does. It also measures where it fails: at short expiries its skew is half what the market shows.
10.1 Stochastic volatility models
Local volatility makes volatility a function of the spot, and so ties every move of the smile to a move of the spot. Real volatility has a life of its own: it rises after falls, but it also rises and falls on days when the spot does not move. The leverage effect (One Quant Book 4, chapter 18) is the first fact, measured as a negative correlation between returns and subsequent volatility, strong and short-lived for indices and weaker for single stocks; volatility clustering is the second.
Definition 10.1 (Stochastic volatility model)
A stochastic volatility model specifies, under the pricing measure,
where the instantaneous variance is a second state variable. The spot–volatility correlation ties the two shocks together, and the scale of relative to is the volatility of volatility.
Two sources of randomness and one traded risky asset make the market incomplete (chapter 1): an option cannot be replicated with the share and cash alone. It can with the share and a second option, which hedges the variance risk. The drift under the pricing measure absorbs a market price of volatility risk that the real-world dynamics do not determine; calibration to option prices, not a regression on history, fixes it.
10.2 The Heston model
Definition 10.2 (Heston model)
The Heston model takes the variance to be a square-root process (One Quant Book 4, chapter 4):
with five parameters: the initial variance , the mean-reversion speed , the long-run variance , the volatility of volatility and the correlation . The variance stays non-negative and never reaches zero when the Feller condition holds.
The model’s value is that it is affine: the log-price and the variance enter the pricing equation linearly in the exponent, and its characteristic function is known in closed form.
Proposition 10.3 (Heston characteristic function)
Let . Its characteristic function (One Quant Book 4, chapter 1) is , with , , and
Proof. Admitted here. ∎
The functions and solve two ordinary differential equations (a Riccati equation and an integral of it) obtained by substituting an exponential-affine guess into the pricing equation; Heston solved them in 1993. The form above keeps the complex logarithm on its principal branch for all ; Heston’s original form, algebraically equal, jumps between branches for long expiries and gives wrong prices, a defect known as the little Heston trap.
10.3 The characteristic function and pricing
With the characteristic function, a European option is one integral. In forward terms, with ,
a formula that chapter 24 derives and generalises to any model with a known characteristic function. All strikes of one expiry share the evaluation of , so a whole smile costs one vectorised integral. Three checks guard the implementation: (the forward is a martingale); as the smile flattens at the root-mean variance of the deterministic path; and a simulation of the two equations reproduces the prices. On the chapter’s base parameters (, , , ) the one-year smile runs from 23.4% at the 80 strike to 13.3% at 120, and a 200 000-path simulation agrees with the integral within its noise.
10.4 Calibration
Calibrating Heston to a surface is a nonlinear least-squares problem in five parameters, solved by the Levenberg–Marquardt algorithm (One Quant Book 4, chapter 24) on implied-volatility residuals, with parameters transformed (logarithms, a hyperbolic tangent for ) so that no step leaves the admissible set.
Example 10.4 (Heston on the chapter 9 surface)
Fitted to nine strikes (80 to 120) at four expiries (three months to two years) of the surface of chapter 9, Heston returns (a spot volatility of 16.3%), , (24.5% long-run), and , with a root-mean-square error of 0.37 volatility point and at most 0.7 point, at two years (Figure 10.1). The Feller condition fails, : the fitted variance can touch zero, as it does in most index calibrations.
The fit hides a structural gap that shows at expiries outside the calibration set. Heston’s at-the-money skew tends to a finite limit as the expiry shrinks, while market skews keep steepening, roughly like in this surface. At one week the calibrated model’s skew is half the market’s (Figure 10.2); jumps (chapter 13) and rough volatility (chapter 12) are the two answers.
10.5 What the parameters mean to a trader
Each parameter moves one feature of the surface (Figures 10.3 and 10.4):
- tilts the smile: more negative, steeper skew. Moving from to lowers the one-year 90–110 skew from 5.71 to 3.94 volatility points.
- bends it: the wings rise with the volatility of volatility. The one-year curvature measure is 0.30 point at ; a curvature of 0.5 point needs .
- and set the short and long ends of the at-the-money term structure, and the speed at which one becomes the other; also makes the skew fade with the expiry, since variance shocks are forgotten at that rate.
For a trader the most useful identity is the one that holds without correlation.
Proposition 10.5 (Mixing formula)
If , a European option in a stochastic volatility model is worth the Black–Scholes price at the path’s root-mean variance, averaged over the variance paths: with . With the same holds after replacing the spot by an adjusted spot and the variance by times it; this is the mixing formula.
Proof for . Conditionally on the whole variance path, is normal with variance , since is independent of : the conditional price is Black–Scholes with that variance. Take the expectation. ∎
The formula explains the smile’s shape at once: Black–Scholes prices are convex in volatility away from the money, so averaging over random volatility raises out-of-the-money prices more than at-the-money ones, and the smile curves up (the volga of chapter 4 at work). A simulation of variance paths with gives, through the formula, 7.136 for the one-year at-the-money call against 7.137 from the characteristic function, well within its standard error of 0.011.
10.6 Tutorial: pricing and calibrating Heston
Goal. Price with the characteristic function, check it three ways, calibrate to a surface and read the parameters. End state: the four figures of the chapter and the numbers of Example 10.4.
The characteristic function and the integral, one smile at a time:
def cf(self, u, t: float): """E[exp(i u x_T)], x_T = ln(S_T / F_T), for real or complex u (numpy arrays accepted).""" u = np.asarray(u, complex) xi = self.kappa - self.rho * self.eta * 1j * u d = np.sqrt(xi * xi + self.eta ** 2 * (1j * u + u * u)) g = (xi - d) / (xi + d) e = np.exp(-d * t) c = self.kappa * self.vbar / self.eta ** 2 * ((xi - d) * t - 2.0 * np.log((1 - g * e) / (1 - g))) dd = (xi - d) / self.eta ** 2 * (1 - e) / (1 - g * e) return np.exp(c + dd * self.v0) def feller(self) -> float: """2 kappa vbar - eta^2: non-negative when the variance cannot reach zero.""" return 2 * self.kappa * self.vbar - self.eta ** 2 def call_prices(model: Heston, fwd: float, strikes, t: float, df: float = 1.0) -> np.ndarray: """European calls for many strikes of one expiry (one characteristic-function evaluation).""" ks = np.log(np.asarray(strikes, float) / fwd) phi = model.cf(U - 0.5j, t) integrand = np.real(np.exp(-1j * np.outer(ks, U)) * phi[None, :]) / (U * U + 0.25) integral = np.trapezoid(integrand, U, axis=1) return df * (fwd - np.sqrt(fwd * np.asarray(strikes, float)) / math.pi * integral)Listing 10.1. Heston characteristic function (principal-branch form) and the Fourier price of a smile. code/firm/heston/firm_heston.py Levenberg–Marquardt on implied-volatility residuals, with transformed parameters and a damping that adapts to success:
def calibrate(quotes: list[tuple[float, np.ndarray, np.ndarray]], fwd: float, start: Heston, max_iter: int = 60, lam: float = 1e-2) -> tuple[Heston, float]: """Levenberg-Marquardt on implied-volatility residuals; quotes are (t, strikes, vols). Parameters are transformed (logs, artanh) so that every step stays admissible. Returns the model and the RMSE.""" def residuals(z): m = _to_model(z) return np.concatenate([implied_vols(m, fwd, ks, t) - vols for t, ks, vols in quotes]) z = _from_model(start) r = residuals(z) cost = float(r @ r) for _ in range(max_iter): h = 1e-5 jac = np.column_stack([(residuals(z + h * e) - r) / h for e in np.eye(5)]) a, g = jac.T @ jac, jac.T @ r while True: step = np.linalg.solve(a + lam * np.diag(np.diag(a) + 1e-12), -g) z_new = z + step try: r_new = residuals(z_new) c_new = float(r_new @ r_new) except (ValueError, FloatingPointError, OverflowError): c_new = math.inf if c_new < cost: z, r, cost, lam = z_new, r_new, c_new, max(lam / 3, 1e-9) break lam *= 4 if lam > 1e8: return _to_model(z), math.sqrt(cost / len(r)) if float(np.max(np.abs(step))) < 1e-7: break return _to_model(z), math.sqrt(cost / len(r))Listing 10.2. Calibrating the five parameters. code/firm/heston/firm_heston.py - Run
dv_heston.calibration(),mixing_check()andfig_heston.py.
What to change next. Replace the principal-branch form by Heston’s original one and price a five-year option with a large volatility of volatility: find the strikes where the price jumps; then add the one-week and one-month expiries to the calibration and watch the fit degrade elsewhere.
10.7 Build: the Heston model
Purpose. The miniature firm’s first model with its own volatility dynamics: it prices products that depend on forward smiles (chapter 16), it is the stochastic part of stochastic-local volatility (chapter 20), and it is the test case of the Fourier and calibration engines (chapter 24).
Interface. Heston(v0, kappa, vbar, eta, rho) with cf(u, t) and feller(); call_prices(model, fwd, strikes, t, df); implied_vols; calibrate(quotes, fwd, start) -> (model, rmse); simulate(model, s0, t, steps, n_paths, seed).
Rules. Characteristic function in the principal-branch form; the forward as numeraire; calibration on implied-volatility residuals with transformed parameters; report the Feller gap, never impose it silently.
Acceptance tests. code/firm/heston/tests/: ; the small- limit equals Black–Scholes at the deterministic root-mean variance; simulation agrees with the integral within three standard errors; calibration recovers known parameters from their own smiles.
Stretch. The quadratic-exponential simulation scheme (chapter 23) and analytic gradients of prices in the parameters for a faster calibration.
Sources and further reading
- S. L. Heston, “A closed-form solution for options with stochastic volatility with applications to bond and currency options”, Review of Financial Studies 6 (1993) 327–343.
- H. Albrecher, P. Mayer, W. Schoutens and J. Tistaert, “The little Heston trap”, Wilmott (2007) 83–92.
- J. Hull and A. White, “The pricing of options on assets with stochastic volatilities”, Journal of Finance 42 (1987) 281–300.
- M. Romano and N. Touzi, “Contingent claims and market completeness in a stochastic volatility model”, Mathematical Finance 7 (1997) 399–412.
- J.-P. Bouchaud, A. Matacz and M. Potters, “Leverage effect in financial markets: the retarded volatility model”, Physical Review Letters 87 (2001) 228701.
- J. Gatheral, The Volatility Surface, Wiley, 2006, chapters 2–3.
10.8 Exercises
Exercise 10.1 ★
Check the Feller condition for the base parameters and for the calibrated ones.
Solution
Solution of Exercise 10.1.
Base: ; calibrated: . Both fail: the variance can reach zero, which the characteristic function handles, but a naive simulation must truncate.
Exercise 10.2 ★
With , and , give the deterministic variance after six months and one year, and the at-the-money volatility of a one-year option as .
Solution
Solution of Exercise 10.2.
: 0.0589 at six months, 0.0489 at one year. The one-year total variance is : a volatility of 24.6%.
Exercise 10.3 ★
Why must ? What would a value of 1.01 mean?
Solution
Solution of Exercise 10.3.
because the forward is the expectation of under the pricing measure. A value of 1.01 means the model’s forward is 1% off: every call is mispriced by about 1% of the forward, an arbitrage against the futures market, usually a sign of a wrong branch or a coding error.
Exercise 10.4 ★★
Why does the market price of volatility risk not appear in the calibrated model, and what does that imply about using historical volatility to set ?
Solution
Solution of Exercise 10.4.
Under the pricing measure the drift of the variance already contains it: calibration to options estimates and as they are priced, not as they behave. Historical volatility estimates the real-world level, which is typically below the priced one (the variance risk premium of chapter 14); setting from history underprices options.
Exercise 10.5 ★★
Use the mixing formula to explain why, with , the Heston smile is symmetric in log-moneyness around the forward and why its at-the-money volatility lies below the root-mean variance.
Solution
Solution of Exercise 10.5.
With the price is an average of Black–Scholes prices with the forward fixed; in log-moneyness the Black–Scholes implied volatility of such an average is symmetric around (put and call at correspond by put–call symmetry). Near the money the Black–Scholes price is nearly linear in volatility, so the average price corresponds to the average volatility , which is below by Jensen’s inequality.
Exercise 10.6 ★★
Which parameter would you move to fit a market in which the one-month skew steepened overnight while the one-year skew did not? Why can Heston not fit it with one parameter move?
Solution
Solution of Exercise 10.6.
The short skew is steered by and , the long skew too, and controls how fast the skew decays with expiry: steepening only the short end needs a higher and a larger at once, which also changes the curvature and the term structure. Heston’s skew term structure has a fixed shape, and a local event in one part of it cannot be fitted by moving one parameter.
Exercise 10.7 ★★★
Coding. With eta_for_butterfly, find the volatility of volatility that gives a one-year curvature of 0.5 volatility point, and the one-year 90–110 skew at that .
Solution
Solution of Exercise 10.7.
; the one-year 90–110 skew rises to 6.45 points, since with a negative correlation the volatility of volatility also steepens the skew.
Exercise 10.8 ★★★
Find the flaw. “Our Heston calibration fits the three-month to two-year surface within 0.4 points, so we use it to price weekly options on the index.”
Solution
Solution of Exercise 10.8.
The model was calibrated where it fits; at one week its skew is half the market’s, so it underprices short out-of-the-money puts and gives the wrong hedges there. Price weeklies from the market’s own short-dated smile, or with a model that produces steep short skews (jumps, rough volatility).
10.9 Problem: Reading the Parameters
Problem 10.1
Weekend problem — what each Heston number does to the smile
A junior trader inherits the base Heston model (, , , , zero rates) and must adjust it to two changes in the market: the one-year 90–110 skew falls by about 1.8 points, and the one-year curvature rises to 0.5 point.
Part I — The base smile.
- Give the one-year implied volatilities at the 80, 90, 100, 110 and 120 strikes.
- Give the one-year 90–110 skew and the curvature measure.
- Is the Feller condition satisfied?
- Why is the at-the-money volatility below 20% although ?
- What does the model predict for the at-the-money volatility at five years?
Part II — The correlation.
- Give the 90–110 skew with .
- Give the change in skew for the change of 0.2 in correlation.
- Does the at-the-money volatility move when changes? Why?
- Which products are most exposed to ?
- What does say about the index when it falls 1% in a day?
Part III — The volatility of volatility.
- Give the that produces a one-year curvature of 0.5 point.
- What happens to the skew at that , and why?
- How would you restore the skew?
- What is the Feller gap at that ?
- Which products are most exposed to ?
Part IV — Judgement.
- Why should the trader recalibrate all five parameters rather than move one at a time?
- Why might the desk keep fixed across days?
- What does the model get wrong at one week?
- State the named result: the change in the one-year 90–110 skew for a change of in the correlation, and the volatility of volatility that matches a curvature of 0.5 point.
- In one sentence: what does the volatility of volatility price?
Solution
Solution of Problem 10.1.
1. 23.4%, 20.1%, 16.9%, 14.4%, 13.3%. 2. Skew 5.71 points; curvature 0.30 point. 3. No: . 4. Averaging over random variance lowers the average volatility (Jensen), and the negative correlation lowers the at-the-money volatility further: 16.9% at one year. 5. 17.4%, still below 20% for the same reason. 6. 3.94 points. 7. points. 8. A little: the correlation shifts probability between the tails and the forward is fixed, so the at-the-money price changes by a second-order amount. 9. Risk reversals, and every product whose value depends on the skew: barriers, digitals, autocallables. 10. That volatility tends to rise when the index falls. A 1% fall is a shock ; since and , the expected rise of is : about one volatility point. 11. . 12. It steepens to 6.45 points: with a negative correlation the volatility of volatility adds skew as well as curvature. 13. Make the correlation less negative until the skew is back at its target. 14. . 15. Wing options, variance swaps’ convexity (chapter 14), cliquets and volatility-of-volatility products. 16. Parameters interact (here moves the skew too); moving them one at a time leaves the others wrong. 17. and are nearly redundant for a surface up to a few years; fixing removes a flat direction of the fit and makes the other parameters stable day to day (chapter 24). 18. Its skew levels off where the market’s keeps steepening: half the market’s at one week. 19. volatility points for in ; for a curvature of 0.5 point. 20. The uncertainty of future variance, which raises the price of options whose value is convex in volatility: the wings.
10.10 Interview questions
Interview question 10.1 ★ trader, researcher
Write the Heston model and say what each parameter does to the smile.
Solution
Solution of Interview question 10.1.
, , . : short-dated level; : long-dated level; : how fast one becomes the other, and how fast the skew fades; : the smile’s curvature (wings); : its skew.
What the interviewer is looking for: one sentence per parameter, on the surface.
Interview question 10.2 ★ researcher
Why is a stochastic volatility market incomplete, and how do you hedge an option in it?
Solution
Solution of Interview question 10.2.
Two Brownian motions, one traded risky asset: the variance risk cannot be hedged with the share. Hedge the delta with the share and the vega (variance exposure) with another option, typically of the same expiry; the second option makes the market complete in the model.
What the interviewer is looking for: the count of risks against instruments.
Interview question 10.3 ★★ researcher
Derive the price of a European option in a stochastic volatility model with zero correlation.
Solution
Solution of Interview question 10.3.
Condition on the whole variance path: with zero correlation is normal with variance , so the conditional price is Black–Scholes at that variance; average over variance paths (the mixing formula).
What the interviewer is looking for: conditioning and independence.
Interview question 10.4 ★★ developer, researcher
Your Heston pricer returns wrong prices for long expiries with a large volatility of volatility. What do you suspect?
Solution
Solution of Interview question 10.4.
The complex logarithm in the characteristic function jumping branches (the “little Heston trap”): use the form with and , which stays on the principal branch; also check the integration range and the damping of the Fourier integral.
What the interviewer is looking for: branch cuts, then numerics.
Interview question 10.5 ★★ trader, risk
Your calibrated Heston correlation moved from to overnight with the same fit error. What do you do?
Solution
Solution of Interview question 10.5.
Check the inputs first (a bad quote, a stale expiry); then check whether the fit has a flat direction ( and trading off); stabilise the calibration (fix , penalise parameter changes, chapter 24) and measure the P&L effect of the jump on exotics before accepting it; if the market really moved, the exotics’ reserves should reflect it.
What the interviewer is looking for: data, identifiability, stability, P&L impact.
Interview question 10.6 ★★★ researcher
Why is the Heston skew too flat at short expiries? Name two ways to fix it.
Solution
Solution of Interview question 10.6.
Its short-dated smile comes only from the diffusion of variance over a short time, so the at-the-money skew tends to a constant proportional to as the expiry shrinks, while the market’s grows. Fixes: add jumps (chapter 13), which produce skew at short expiries, or make volatility rough (chapter 12), which produces a skew exploding like a power of the expiry.
What the interviewer is looking for: the short-expiry limit, and the two families of fixes.