Quant from Scratch by QuantWright

Options and Derivatives · Lesson 6

Implied volatility and the smile

Run the Black–Scholes formula backwards, from a price to the volatility that gives it. Then price options in a made-up world with fat tails, and watch one volatility fail to fit them all.

Know the basics? Read the lesson notes

Run the formula backwards

The lesson "Black–Scholes, from the tree" priced a European call (the right, but not the duty, to buy a share at a fixed price, the strike, on one last day) with the Black–Scholes formula. It has five inputs: today's share price S = €100, the strike K, the years left T = 1, interest r = 5% a year, and the volatility σ: the standard deviation (the typical size of a year's deviation from the average) of the share's yearly log return, ln(end price ÷ start price). Every number in this lesson is made up.

Four inputs are known today: the share's price, the strike, the time left and the interest rate. The volatility is not printed anywhere. So the formula is often turned around: given an option's price, which σ produces it?

Say a call with strike €150 and a year to go is priced at €0.40 (a price set in a made-up world; two screens on say how). The formula with σ = 17.42% says €0.15. Which σ makes the formula say €0.40?

A lower σ narrows the curve of year-end prices, so fewer end far above €150 and the formula's price falls below €0.15. It takes a higher one.
More volatility puts more chance far above €150, where the call pays, so the formula's price rises with σ. It reaches €0.40 a little above 20%.
As σ rises from 0, the formula's price for this call climbs smoothly from €0 towards €100, the share's price, so it passes €0.40 exactly once, a little above 20%.

The formula's price for the €150 call, by volatility (made-up inputs)

Dashed: the price, €0.40. Where the curve crosses it is the σ that fits.

That σ is the implied volatility: the volatility at which the formula gives the option's price. Only one fits, because the formula's price only rises as σ rises.

Find it by halving

No formula gives σ from a price directly, so you search. The simplest search is bisection: keep a range that must hold the answer, and halve it.

Start with σ between 0% and 64%. Try the middle. If the formula's price there is above €0.40, that σ is too high, and the answer is in the lower half. If it is below, the answer is in the upper half. Each try halves the range. Do eight.

Halving the range for σ: the €150 call priced at €0.40 (made-up inputs)

Each row: the range still holding the answer, from 0% to 64%. The dot: its middle, where the formula is tried.

After eight halvings σ is between 20.25% and 20.50%: the range is 64 ÷ 2⁸ = 64 ÷ 256 = 0.25 points wide. More halvings settle it at 20.45%, the €150 call's implied volatility, well above 17.42%.

A second strike

Where €0.40 came from: the lesson "Black–Scholes, from the tree" built a made-up world with fat tails (more very large moves than a bell curve, the hill-shaped spread of ordinary luck, with the same spread allows). In it, 85 years in 100 are calm (volatility 13.03%) and 15 are wild (32.56%), mixed so the overall volatility is still 17.42%. An option's price there is its payoff averaged over 100,000 simulated years, in which the share grows on average at the 5% interest rate, divided by 1.05.

The same world priced the call with strike €105 at €6.31. The formula with σ = 17.42% says €6.94. Same share, same last day. What is this call's implied volatility?

A higher σ would push the formula's price above €6.94, further from €6.31. A lower one fits: 15.83%.
At 17.42% the formula says €6.94, not €6.31. Matching €6.31 takes a lower σ: 15.83%.
€6.31 is below the formula's €6.94 at 17.42%, and the price rises with σ, so a lower σ fits: 15.83%.

Bisection gives 15.83%.

A simulated price has an error bar: a range around the average that misses the value endless simulated years would give about 1 time in 20. For the €105 call it is €6.23 to €6.38, and its ends give the ends of the volatility's bar: 15.64% to 16.02%.

For the precise: how the error bar is built

The bar is the average plus or minus two standard errors. A standard error is how far an average of that many simulated years typically lands from the value endless years would give: the payoffs' standard deviation divided by √100,000. For the €105 call it is €0.0378, so the bar is 6.31 ± 0.08.

One share, one world with a volatility of 17.42%, and two implied volatilities: 15.83% at the €105 strike and 20.45% at €150. Their error bars, 15.64–16.02% and 20.17–20.71%, are far apart, so the gap is not simulation noise.

One volatility can't fit both

The formula assumes the log of the year-end price lands on one bell curve. This world's curve is a mix: taller in the middle, because most years are calm, with fatter tails, because wild years bring big moves. Drag σ and look for one value that matches both prices.

The world's year-end prices against the formula's curve (made-up, 100,000 simulated years)

Orange: calm and wild years mixed. Grey: the formula's curve at the σ you set. Dashed: the two strikes. Shaded: right of €150 both curves are drawn 10× magnified, so the thin tail can be seen; the jump there is the change of scale. Just past €150 the grey curve is higher, but further out the orange one is, and the far tail is where the call pays most.

€105 call: formula–
€105 call: world–
€150 call: formula–
€150 call: world–

What did you find?

At 15.83% the formula matches €6.31 but gives the €150 call €0.08, a fifth of €0.40. At 20.45% it matches €0.40 but gives the €105 call €8.14.
At 17.42% the formula gives €6.94 and €0.15: too high for the €105 call, too low for the €150 call. Every σ that fits one misses the other.
At 18% the formula gives the €105 call €7.17, above €6.31, and the €150 call €0.19, below €0.40. No single σ fits both.

The reason is the curve's shape. The €105 call pays on ordinary rises, and most years here are calmer than 17.42% (13.03%), so a lower σ fits it. The €150 call pays more the further the price ends past €150, and this world has more years far past it than the bell does, so a higher σ fits it. Each implied volatility describes the part of the curve its option pays on.

The smile

Now do it at every strike from €70 to €160: average the payoff over the 100,000 simulated years, then find the σ that matches. Below €105 the lesson uses puts (the right to sell at the strike), whose prices the simulation pins down better; put–call parity turns a put's price into the same σ.

For the precise: why puts below €105

A call with a low strike is mostly the share's own move: its simulated price is noisy and barely responds to σ, so it pins σ down poorly. A put there pays only after a big fall, and the simulation pins its price down to a few cents. Put–call parity (the lesson "What no-arbitrage forbids") says a European call minus a put with the same strike and last day is worth S − PV(K); the formula obeys it at every σ, so a put's price and the call price it converts to give the same implied volatility.

Plotted against the strike, what shape will the implied volatilities make?

Flat would mean the formula's bell fits this world. It doesn't: both tails are fatter, so far strikes need a higher σ on both sides.
The rise on the right is real, but the left rises too: puts far below €100 pay after big falls, and wild years bring those as well.
Strikes near €105 pay on ordinary years, which are calm; far strikes on either side pay only after big moves, which wild years make common.

Implied volatility by strike, calm and wild years (made-up, 100,000 simulated years)

Dots: the implied σ of each simulated price; bars: from the price's error bar. Dashed: the world's volatility, 17.42%. Below €105, puts; from €105, calls.

Option–
World's price–
Implied σ–

Lowest at €105, 15.83%, rising to 21.65% at €70 and 21.77% at €160: a volatility smile. No volatility error bar reaches more than 0.32 points either side of its dot, so the shape is not simulation noise. All 19 strikes reuse the same 100,000 years, so their errors move together; the smooth line is partly that.

Crashes make a skew

The smile's shape follows the tails' shape. Take a second made-up world with the same 17.42% volatility, in which 1 year in 10 has a crash: the price is multiplied by 0.78 (a fall of 22%) on top of its usual move. The usual moves are calmer, 15.74%, so the overall spread is still 17.42%, and the share still grows 5% a year on average. Options are again priced by averaging over 100,000 simulated years.

In this world, where will the implied volatilities be highest?

Puts with low strikes pay after big falls, which crashes make common: 18.71% at €70. Big rises come only from the calmer usual moves: 16.39% at €160.
This world adds big falls, not big rises: its rises come only from the calmer usual moves, so high strikes get the lowest implied volatilities, 16.39% at €160 against 18.71% at €70.
The first world's wild years moved prices both ways. Here only falls get bigger, so the left side rises (18.71% at €70) and the right side falls (16.39% at €160).

Implied volatility by strike, two made-up worlds (100,000 simulated years each)

Both worlds have a volatility of 17.42% (dashed). Bars: from each price's error bar. Faint: the other world.

High on the left, sloping down: a volatility skew. Fat tails on both sides bent the line into a smile; a fat left tail alone tilts it.

Theory

Implied volatility, found by bisection

The implied volatility of a European option's price is the σ at which the Black–Scholes formula gives that price, with the other four inputs taken from the contract and the interest rate. Because the formula's price rises steadily with σ, exactly one σ fits when the price lies strictly inside the no-arbitrage bounds (the lowest and highest prices that leave no locked-in profit, from the lesson "What no-arbitrage forbids"): for a call, above max(S − PV(K), 0) and below S, where PV(K) = K ÷ (1 + r)T is the strike's present value (the amount today that grows to it). Bisection finds it by halving a range that holds it. CBS is the Black–Scholes call formula from "Black–Scholes, from the tree"; here you are given its values. Its rise per percentage point of σ is called vega (the lesson "The Greeks" works it out).

CBS(S, K, T, r, σimp) = C
σmid = (σlo + σhi) ÷ 2; if CBS(σmid) > C then σhi = σmid, else σlo = σmid
width after n halvings = (σhi − σlo) ÷ 2n
C
the option's price: a quote, or here a simulated average
CBS(…, σ)
the Black–Scholes price with volatility σ (for a put, CBS − S + PV(K))
σimp
the implied volatility
σlo, σhi
the ends of the range that holds σimp; σmid its middle
n
the number of halvings
Worked example: the €150 call at €0.40

Range 0% to 64%. Middle 32%: the formula says €2.53, above €0.40, so σhi = 32%. Middle 16%: €0.09, below, so σlo = 16%. Middle 24%: €0.86, above, so σhi = 24%. Middle 20%: €0.35, below, so σlo = 20%.

Four more halvings leave 20.25% to 20.50%, a width of 64 ÷ 2⁸ = 0.25 points; it settles at 20.45%.

Holds when
  • the option is European and the formula's other inputs are right;
  • the price lies strictly inside the no-arbitrage bounds;
  • the starting range holds the answer (the formula's price is below C at σlo and above it at σhi).
Breaks when

The price is outside the bounds: no σ fits (a practice question shows one). And the number describes the price, not the share's future volatility (the next screen).

A search starts with σ between 0% and 80%. How many halvings until the range is narrower than 1 percentage point?

Hint: divide 80 by 2, again and again, until it drops below 1.

80 ÷ 2⁶ = 1.25 points is not yet below 1; 80 ÷ 2⁷ = 0.625 is. 7 halvings.
Halve 80: 40, 20, 10, 5, 2.5, 1.25, 0.625. The seventh halving is the first below 1 point: 7.

What a smile says, and what it doesn't

Back to the calm-and-wild world. Its years were built with a volatility of 17.42%, and every option's price is its average payoff over those years. Someone reads the €105 call's implied volatility, 15.83%, as "the prices expect the share's yearly log returns to spread by about 15.8%". In this world, is that right?

Every strike's implied volatility describes its own option, and here they run from 15.83% to 21.77%. The world's volatility is 17.42%; the €105 strike's is among the furthest from it.
The world was built with 17.42%. The implied volatilities run from 15.83% to 21.77% depending on the strike: each is the σ the formula needs for one price.
The €105 call's error bar is 15.64% to 16.02%, which is nowhere near 17.42%. The gap comes from the curve's shape, not from noise.

An implied volatility is a way of writing a price: the σ the formula needs to match it. That puts strikes on one scale: €0.40 and €6.31 can't be compared directly, 20.45% and 15.83% can. A smile says the prices weigh big moves more heavily than one bell curve does; a skew says they weigh big falls more.

It does not say how often big moves will happen. These prices were averages using the made-up weights that make the share grow at the interest rate (the tree lesson's pricing weights), not real chances. Read a smile as a description of prices, not a forecast.

Practice 1 of 3

The next halving

The situationA made-up share is at €100. A European call with a strike of €100 and a year to go is quoted at €10.50; interest is 5%. Your search has σ between 16% and 24%. At the middle, 20%, the formula gives €10.39.

What is the middle of the next range, in percent?

Hint: is €10.39 above or below €10.50? Keep the half that holds the answer.

€10.39 is below €10.50, so 20% is too low: the answer is between 20% and 24%, whose middle is 22%. (It settles at 20.30%.)
€10.39 is below €10.50, so 20% is too low and the answer is in the upper half, 20% to 24%: the next middle is 22%. Trying 18% would move the formula's price further below €10.50.
Practice 2 of 3

A search that won't settle

The situationA made-up share is at €100. A European call with a strike of €84 and a year to go is quoted at €19.50; interest is 5%, so PV(K) = 84 ÷ 1.05 = €80. A friend's bisection finds the formula's price too high at every middle it tries, so it keeps lowering σhi towards 0% and never finds a match.

Which volatility fits this price?

A higher σ only raises the formula's price, which is already above €19.50 at every σ. No σ fits: the price is below the floor S − PV(K) = €20.
Even as σ nears 0 the formula's price only falls to S − PV(K) = 100 − 80 = €20, never to €19.50. No σ fits.
The call can't be worth less than S − PV(K) = 100 − 80 = €20, the lower no-arbitrage bound. The formula's price is €20 as σ nears 0 and only rises, so no σ gives €19.50.
Practice 3 of 3

Reading a skew

The situationA made-up dealer's option prices on one share give an implied volatility of 24% for a put with a strike far below today's price and 16% for a call with a strike near it. A colleague says: "So the prices predict the share's volatility at 16% next year, and 24% if it falls."

What do the prices support?

A higher implied volatility for the far put means its price needs a wider bell than the near call's: the prices put more weight on big falls. Neither number is a forecast.
An implied volatility only describes one price. In this lesson's calm-and-wild world, built with 17.42%, the strike near €105 gave 15.83%: reading it as a forecast was wrong even there.
Different implied volatilities at different strikes are what a curve with a fat left tail produces, as the crash world showed. They show a shape, not a mistake.
✓

Lesson done

The implied volatility of a European option's price is the σ at which the Black–Scholes formula gives that price. The formula's price rises steadily with σ, so exactly one σ fits any price strictly inside the no-arbitrage bounds, and bisection finds it by halving a range. In this lesson's made-up world of calm and wild years, with a volatility of 17.42%, prices averaged over 100,000 simulated years gave implied volatilities from 15.83% at the €105 strike to about 21.7% at €70 and €160: a smile, because that world's tails are fatter than the formula's bell. In a made-up world with crashes the left side was highest: a skew. A smile describes prices; it is not a forecast of volatility.

Key ideas

Implied volatility
the volatility at which the Black–Scholes formula gives a European option's price; one exists, and only one, when the price lies strictly inside the no-arbitrage bounds
Vega
the change in an option's price per percentage point of volatility; positive for a European call or put in the Black–Scholes formula
Bisection
a search that keeps a range holding the answer and halves it each try, keeping the half the answer must be in
Fat tails
more very large moves than a bell curve with the same spread allows
Volatility smile
implied volatility plotted against strike, lowest in the middle and higher at both ends; in the Black–Scholes setting it appears when the year-end price curve has fatter tails on both sides than one bell
Volatility skew
implied volatility highest at low strikes and falling with the strike; it appears when big falls are more likely, in the prices, than one bell allows

CBS(S, K, T, r, σimp) = C

σmid = (σlo + σhi) ÷ 2  ·  width after n halvings = (σhi − σlo) ÷ 2n

Lesson notes

The implied volatility of a European option's price (an option used only on its last day) is the volatility σ at which the Black–Scholes formula gives that price, the other four inputs taken from the contract and the interest rate. Because the formula's price rises steadily with σ, exactly one σ fits any price strictly inside the no-arbitrage bounds, and bisection finds it by halving a range. In this lesson's made-up world of calm and wild years, built with a volatility of 17.42%, prices averaged over 100,000 simulated years gave implied volatilities from 15.83% at the €105 strike to about 21.7% at €70 and €160: a smile. In a made-up world with crashes the low strikes were highest: a skew. A smile describes prices, not a forecast of volatility. Every number is made up or simulated, and every price is before costs.

Run the formula backwards

The Black–Scholes formula prices a European call (the right, not the duty, to buy a share at the strike on its last day) from five inputs: the share's price today S = €100, the strike K, the years left T = 1, interest r = 5% a year, and the volatility σ, the standard deviation (the typical size of a year's deviation from the average) of the share's yearly log return. Four are known today (the share's price, the strike, the time left and the interest rate); the volatility is not printed anywhere, so the formula is often turned around. The lesson "Black–Scholes, from the tree" built a made-up world with fat tails (more very large moves than a bell curve, the hill-shaped spread of ordinary luck, with the same spread allows): 85 years in 100 calm, 15 wild, mixed so the overall volatility is still 17.42%. A call's price there is its payoff averaged over 100,000 simulated years in which the share grows on average at the 5% interest rate, divided by 1.05. That priced a call with strike €150 at €0.40, where the formula with 17.42% says €0.15. More volatility puts more chance far above €150, so the formula's price rises with σ, and one σ above 17.42% gives €0.40. That σ is the implied volatility. The change in price per percentage point of volatility is called vega.

Find it by halving

No formula gives σ from a price directly. Bisection keeps a range that must hold the answer and halves it: try the middle; if the formula's price there is above the target, the answer is in the lower half, otherwise in the upper half. From 0% to 64%: 32% gives €2.53 (too high), 16% gives €0.09 (too low), 24% gives €0.86 (too high), 20% gives €0.35 (too low), then 22%, 21% and 20.5% are too high and 20.25% too low. After eight halvings σ is between 20.25% and 20.50%, a width of 64 ÷ 2⁸ = 0.25 points; more halvings settle it at 20.45%.

A second strike, and why one σ can't fit both

The same world priced the call with strike €105 at €6.31, with an error bar (the simulated average plus or minus two standard errors, which misses the value endless simulated years would give about 1 time in 20) of €6.23 to €6.38. The formula with 17.42% says €6.94, so a lower σ fits: 15.83%, with the price's error bar giving 15.64% to 16.02%. The €150 call's bar gives 20.17% to 20.71%: far apart, so the gap is not simulation noise. No single σ fits both: at 15.83% the formula gives the €150 call €0.08, and at 20.45% it gives the €105 call €8.14. The reason is the curve's shape. The formula assumes the log of the year-end price lands on one bell; this world's curve is taller in the middle (most years are calm, 13.03%) with fatter tails (wild years, 32.56%). A strike near €105 pays on ordinary years, so a lower σ fits; a far strike pays only after big moves, so a higher one does.

The smile, and the skew

Priced at every strike from €70 to €160 and inverted, the implied volatilities were lowest at €105, 15.83%, and rose to 21.65% at €70 and 21.77% at €160: a volatility smile. Below €105 the prices are puts' (the right to sell at the strike): a call with a low strike is mostly the share's own move, so its simulated price pins σ down poorly, while a put there is pinned down to a few cents. A put's price converts to a call's with the same strike (put–call parity), so one σ serves both. No volatility error bar reached more than 0.32 points either side, so the shape is not noise; all 19 strikes reuse the same 100,000 years, so their errors move together, and the smooth line is partly that. A second made-up world, with the same 17.42% volatility, had a crash in 1 year in 10 (the price multiplied by 0.78 on top of its usual move, the usual moves calmer at 15.74%). There the implied volatilities were highest at low strikes, 18.71% at €70, falling to 16.39% at €160: a volatility skew. Fat tails on both sides make a smile; a fat left tail alone tilts it.

What a smile says, and what it doesn't

The calm-and-wild world was built with a volatility of 17.42%, and each option's price is its average payoff over that world's years; yet the implied volatilities ran from 15.83% to 21.77% depending on the strike. Reading the €105 call's 15.83% as the expected spread of the share's returns would be wrong even there. An implied volatility is a way of writing a price, which puts strikes on one scale: €0.40 and €6.31 can't be compared directly, 20.45% and 15.83% can. A smile says the prices weigh big moves more heavily than one bell curve does, a skew that they weigh big falls more. It does not say how often big moves will happen: these prices were averages in a world where the share grows at the interest rate (the made-up weights that make the share grow at the interest rate, the tree lesson's pricing weights), not real chances.

Formula: implied volatility by bisection

The implied volatility of a European option's price is the σ at which the Black–Scholes formula gives that price; when the price lies strictly inside the no-arbitrage bounds (for a call, above max(S − PV(K), 0) and below S, with PV(K) = K ÷ (1 + r)T the strike's present value) exactly one σ fits. Bisection halves a range that holds it.

CBS(S, K, T, r, σimp) = C
σmid = (σlo + σhi) ÷ 2; if CBS(σmid) > C then σhi = σmid, else σlo = σmid
width after n halvings = (σhi − σlo) ÷ 2n
C
the option's price: a quote, or a simulated average
CBS(…, σ)
the Black–Scholes price with volatility σ (for a put, CBS − S + PV(K))
σimp
the implied volatility
σlo, σhi
the ends of the range that holds σimp; σmid its middle
n
the number of halvings
Worked example

The €150 call at €0.40, from 0% to 64%: 32% gives €2.53, above, so σhi = 32%; 16% gives €0.09, below, so σlo = 16%; 24% gives €0.86, so σhi = 24%; 20% gives €0.35, so σlo = 20%. Four more halvings leave 20.25% to 20.50%, width 64 ÷ 2⁸ = 0.25 points; it settles at 20.45%.

Holds whenBreaks when

The price is outside the bounds: no σ fits. And the number describes the price, not the share's future volatility.

One more worked example

New made-up numbers

A share at €100; a European call with a strike of €110 and a year to go, quoted at €5.00; interest 5%. PV(K) = 110 ÷ 1.05 = €104.76, so the call's bounds are €0 and €100, and €5.00 lies inside.

From 0% to 64%: 32% gives €10.77, above €5.00, so the range becomes 0% to 32%. 16% gives €4.42, below, so 16% to 32%. 24% gives €7.58, above: 16% to 24%. 20% gives €5.99, above: 16% to 20%. 18% gives €5.20, above: 16% to 18%.

After five halvings the range is 64 ÷ 2⁵ = 2 points wide, 16% to 18%; more halvings settle it at 17.48%.

Common mistakes

Check yourself

  1. A search starts with σ between 0% and 64%. How many halvings until the range is narrower than 0.1 points?
    Answer

    64 ÷ 2⁹ = 0.125 is not yet below 0.1; 64 ÷ 2¹⁰ = 0.0625 is: 10 halvings.

  2. The formula with 17.42% prices a call at €6.94, and the price you are matching is €6.31. Is the implied volatility above or below 17.42%, and why?
    Answer

    Below: the formula's price rises with σ, and €6.31 is below €6.94, so a lower σ is needed. In the lesson it was 15.83%.

  3. Why did the calm-and-wild world give a higher implied volatility at €150 than at €105?
    Answer

    The €150 call pays only after a big rise, which wild years make more common than the formula's bell allows, so a wider bell is needed to match its price. The €105 call pays on ordinary years, which are mostly calm, so a narrower bell fits.

  4. In a world with crashes and no extra big rises, which strikes have the highest implied volatilities, and what is the shape called?
    Answer

    The low strikes: puts there pay after big falls, which crashes make common (18.71% at €70 against 16.39% at €160 in the lesson's crash world). The shape is a volatility skew.

  5. A call with S = €100, PV(K) = €80 is quoted at €19.50. What is its implied volatility?
    Answer

    There is none. A European call can't be worth less than S − PV(K) = €20; the formula's price approaches €20 as σ nears 0 and only rises, so no σ gives €19.50.

Try it yourself

Run the simulation. Every number in this lesson comes from one Python script with fixed random seeds (below). Change the crash's size or how often it comes, or the share of wild years, and see how the smile bends.

Work it out by hand. Pick a price, start with σ between 0% and 64%, and halve: work out the formula's price at the middle (a spreadsheet's NORM.S.DIST(x, TRUE) gives N), keep the half that holds the answer, and stop when the range is as narrow as you need.

The code behind every number (Python, seeds 2026111161 and 2026111171)
Loading…
For the precise: where the smile's bottom sits, the solver checks and the two worlds

Why the smile bottoms out at €105. In the calm-and-wild world every kind of year has the same average year-end price, 100 × 1.05 = €105, so its exact smile is symmetric in ln(K ÷ 105): the strikes K and 105² ÷ K have the same implied volatility (checked in the script for €70, €80 and €90).

The solver. Every implied volatility is found by bisection to 10−10, then checked three ways: the formula at the answer gives the price back; Newton's method, a different solver that steps by the price gap divided by vega, lands on the same σ; and the price lies inside the bounds. The script also checks that a call and a put priced with the same σ obey parity, and so give the same implied volatility.

World 1. Simulation 2 of the Black–Scholes lesson, rebuilt with its seed 2026111161 and generator default_rng([seed, 2]): 15,102 of 100,000 years were wild. The simulated years' log returns spread by 17.50% against the design's 17.42%, and averaged a year-end price of €104.91. The simulated implied volatilities differ from the exact ones by sampling error, inside the bars. Each world also has an exact price (a weighted sum of the formula's prices over its two kinds of year); its implied volatility was inside the simulated bar at 19 of 19 strikes. The bars share one set of simulated years, so they are not 19 separate checks.

World 2. Seed 2026111171, generator default_rng([seed, 1]): a year crashes when a uniform draw is below 0.1 (10,148 of 100,000 did); its log return is c + 0.1574Z + ln(0.78) for a crash, with c set so the year-end price averages €105. The exact implied volatility was inside the simulated bar at 19 of 19 strikes. With two kinds of year, shares and a loan can't copy an option on every path, so these averages are prices under one choice of pricing weights, not the only possible ones.

Honest notes

Where this comes from