Quant from Scratch by QuantWright

Options and Derivatives · Lesson 4

Black–Scholes, from the tree

Cut the binomial tree's year into ever smaller steps and its price settles on one formula. What each part of it means, a simulation that checks it, and a world where it gets the price wrong.

Know the basics? Read the lesson notes

Where the tree stopped

The binomial tree lesson priced a call (the right, but not the duty, to buy a share at a fixed price, the strike) on a made-up share: today €100, strike €105, last day a year from now, interest 5% a year. Every number in this lesson is made up.

The tree let the share go up or down at each step and priced the call by working back from the end, using a pricing weight in place of the real chance of up. Cut into more and more steps, the price settled at €6.94.

The steps' size came from the share's volatility, σ: the standard deviation of its yearly log returns (the log return is ln(end price ÷ start price); ln is explained on the next screen), that is, their typical distance from their average. The tree's yearly step, up to €119 or down to €84, makes σ = 17.42% a year.

One piece of arithmetic first. If the call is used, its buyer pays €105 in a year. What is €105 in a year worth today, at 5%, in euros?

Hint: what amount grows by 5% to €105?

105 ÷ 1.05 = €100: €100 today grows to €105 in a year.
Money today grows by 5%, so today's amount is 105 ÷ 1.05 = €100. (105 × 0.95 = 99.75 is close, but €99.75 grows to only €104.74.)

That is the strike's present value, written PV(K): the amount today that grows to the strike K by the last day. Here it equals today's price, €100, which keeps this lesson's arithmetic short. The formula works for any numbers.

Many small steps make a curve

The tree's pricing weight was q, the risk-neutral probability: the chance of up that makes the share grow on average at the interest rate. It is not a forecast. Call the made-up world built on it, used for pricing, the q-world: each step goes up with chance q. Each path ends at one year-end price, and q gives each end its chance. With one step there are two ends: €119 with chance 0.6 and €84 with chance 0.4. With n steps there are n + 1 ends. As n grows, what do the chances of the year-end prices look like?

Keep your guess in mind and drag the number of steps below.

The q-chances of the one-year call's year-end prices, by number of steps (made-up inputs)

Each bar is one end of the tree: its chance spread over the prices nearest it. Dashed: the limit.

It becomes a smooth hump with a long tail to the right: the answer is B.

Why: each step multiplies the price by a factor, and the log of a product is a sum (ln, the natural logarithm on a calculator's LN key, turns multiplying into adding). So the log of the year-end price is today's log plus a sum of many small up-or-down steps, and such a sum lands on a bell curve (the normal distribution of the Bell curve lesson). A price whose log lands on a bell curve is called lognormal: never below 0, with a long tail of high prices.

The price is an average over the curve

Working back through a tree always gives the same number as a shortcut: average the call's payoff (what it pays on its last day) with the q-chances, then divide by 1.05. In the limit, the chances are the curve.

The q-chances of the year-end price, in the limit (made-up inputs)

Shaded: year-end prices above the €105 strike, where the call pays.

The call pays only above €105, and there its payoff has two parts: you receive a share and you pay €105. So its price is the share part, valued today, minus the strike part, valued today.

The strike part first. The shaded area, the q-chance that the share ends above €105, is 0.4653. You pay €105 with that chance, so today it is worth 0.4653 × 105 ÷ 1.05. How many euros is that?

Hint: 105 ÷ 1.05 = 100, so it is 0.4653 × 100.

0.4653 × 105 ÷ 1.05 = 0.4653 × 100 = €46.53.
105 ÷ 1.05 = 100, the strike's present value, so the strike part is 0.4653 × 100 = €46.53.

The share part adds up, over every year-end price above €105, that price times its q-chance, then divides by 1.05: €53.47. The call is worth 53.47 − 46.53 = €6.94, the tree's limit.

The next two screens show where 0.4653 comes from, and why 53.47 is 100 × 0.5347.

N(d2): the chance of ending above the strike

Take each price's ln (the log scale): the curve becomes a bell. Its width, one standard deviation, is σ√T for T years: here 0.1742 × √1 = 0.1742. Its middle, the median (the price with half the chance above it and half below), is a little under €105, at €103.42: the long right tail pulls the average, €105, above the middle.

Write N(x) for the share of a bell curve's area to the left of x, where x counts standard deviations from the middle. A spreadsheet gives it as NORM.S.DIST(x, TRUE); this lesson hands you the values. On the log scale, ln(103.42 ÷ 105) ÷ 0.1742 = −0.0871: the middle sits 0.0871 standard deviations below the strike. So the chance of ending below the strike is the area left of +0.0871, N(0.0871) = 0.5347. Drag x to see it.

N(x): the share of the bell's area left of x

Across: standard deviations from the middle, on the log scale. Dashed marks: the strike, which sits 0.0871 above the middle, and d2 = −0.0871, its mirror image.

N(x)–
N(0.0871)–

What, then, is the q-chance that the share ends above the strike, to four decimals?

Hint: above and below add up to 1.

1 − 0.5347 = 0.4653.
The chances of ending below and above add up to 1, so above is 1 − 0.5347 = 0.4653.

1 − 0.5347 = 0.4653 = N(−0.0871): the bell is symmetric, so the area right of +0.0871 equals the area left of −0.0871.

That number, −0.0871, is d2: where the middle sits relative to the strike, in standard deviations (negative here: the middle is below the strike). N(d2) is the q-chance that the call ends above its strike, the shaded 0.4653 of the last screen.

N(d1): the share part

Where d2 comes from in general: the middle is the average, S(1 + r)T, times e−½σ²T (ex undoes ln). Big up-years pull the average up more than big down-years pull it down, so the middle sits below the average; the size of the gap, ½σ²T on the log scale, is a standard result this lesson states without proof. So ln(middle ÷ K) = ln(S ÷ PV(K)) − ½σ²T, and d2 is that divided by σ√T. Here: (0 − ½ × 0.1742²) ÷ 0.1742 = −0.0871.

d1 is d2 plus one standard deviation: d1 = d2 + σ√T. What is d1 here, to four decimals?

Hint: −0.0871 + 0.1742.

−0.0871 + 0.1742 = 0.0871.
d1 = d2 + σ√T = −0.0871 + 0.1742 = 0.0871.

N(d1) = N(0.0871) = 0.5347, and 100 × 0.5347 = €53.47: the share part. That the share part comes out as S·N(d1) is also stated here without proof (the closed box sketches it).

In plain words, N(d1) is the chance of ending above the strike, counted by what you receive there: a €150 ending counts for more than a €106 one, because you receive the share. That makes it larger than N(d2).

For the precise: a sketch of both results

In the q-world, ln(year-end price) = m + σ√T·Z, with Z a standard bell draw and m the log of the middle. Multiplying the bell's height φ(z) by eσ√T·z gives e½σ²T·φ(z − σ√T) (complete the square): weighting outcomes by the price slides the bell one standard deviation to the right and scales it by e½σ²T. Over all outcomes this gives average = em + ½σ²T, which must equal S(1 + r)T: so the middle em is the average times e−½σ²T. Over outcomes above K only (Z above −d2), the slid bell keeps the area above −d2 − σ√T = −d1, which is N(d1); dividing by (1 + r)T leaves S·N(d1).

Theory

The Black–Scholes formula

A European call can be used only on its last day. Copy one with shares and a loan, adjusted without pause, in a world where the log of the share's price follows a random walk (a running total of random up-or-down steps) with fixed volatility and no jumps: its cost is the Black–Scholes formula. It is the binomial tree's price as the steps get small. A put, the right to sell at the strike, follows by put–call parity, proved in the lesson "What no-arbitrage forbids: option bounds and put–call parity": a European call minus a put with the same strike and last day is worth today's price minus PV(K).

C = S·N(d1) − PV(K)·N(d2)
d1 = [ln(S ÷ PV(K)) + ½σ²T] ÷ (σ√T)  ·  d2 = d1 − σ√T
P = C − S + PV(K)  ·  PV(K) = K ÷ (1 + r)T
S
the share's price today
K
the strike
T
the years left until the last day
r
the interest rate a year, for borrowing and lending
σ
the volatility: the standard deviation of the share's yearly log return, ln(end price ÷ start price)
N(x)
the share of the bell curve's area left of x standard deviations from its middle
N(d2)
the q-chance that the call ends above its strike
N(d1)
the call's delta (the binomial tree lesson's word): the shares held today in the copy, the shares and loan that reproduce the call's payoff
C, P
the European call's and put's prices today, before costs
Worked example: the call on this page

S = 100, PV(K) = 105 ÷ 1.05 = 100, σ = 0.1742, T = 1. ln(100 ÷ 100) = 0, so d1 = (0 + ½ × 0.1742²) ÷ 0.1742 = 0.1742 ÷ 2 = 0.0871, and d2 = 0.0871 − 0.1742 = −0.0871.

N(0.0871) = 0.5347 and N(−0.0871) = 0.4653, so C = 100 × 0.5347 − 100 × 0.4653 = 53.47 − 46.53 = €6.94. The put: P = 6.94 − 100 + 100 = €6.94, the same as the call only because PV(K) equals today's price.

Holds when
  • the volatility is fixed and known for the option's whole life, and the log price moves as a random walk with no jumps;
  • the copy is adjusted continuously (hedging);
  • trading is free, at one interest rate for borrowing and lending.
Breaks when

Volatility changes or prices jump: the year-end curve then has fatter tails than the lognormal, and the formula's price can be far off, most of all in proportion for strikes far from today's price (two screens on). Adjusting the copy only at intervals, or paying costs each time, leaves a gap between the copy and the call; a later lesson measures it.

The situationA made-up share is at €110. A European call has a strike of €105 and a last day a year away; interest is 5% and σ = 20%. So PV(K) = €100 and ln(110 ÷ 100) = 0.0953. From a table, N(0.3766) = 0.6467 and N(0.5766) = 0.7179.

Work out d1 and d2 yourself (they are the two numbers in the table), then the call's price, in euros (to the cent)?

Hint: d1 = (0.0953 + ½ × 0.2²) ÷ 0.2 and d2 = d1 − 0.2; then S × N(d1) − PV(K) × N(d2), with S = 110 and PV(K) = 100.

d1 = (0.0953 + 0.02) ÷ 0.2 = 0.1153 ÷ 0.2 ≈ 0.5766 and d2 = 0.5766 − 0.2 = 0.3766. Then 110 × 0.7179 − 100 × 0.6467 = 78.97 − 64.67 = €14.30, or €14.29 from unrounded areas.
110 × 0.7179 − 100 × 0.6467 = 78.97 − 64.67 = €14.29 to €14.30, depending on rounding. The share part uses S = 110; the strike part uses PV(K) = 100, not 105. d1 = (0.0953 + ½ × 0.2²) ÷ 0.2 ≈ 0.5766 picks N(d1) = 0.7179; d2 = 0.3766 picks 0.6467.

What each input does

The formula has five inputs: S, K, T, r and σ. Start with σ. If the volatility doubled, from 17.42% to 34.83%, with everything else the same, what would the call's price do?

It rises to €13.83. A wider curve puts more chance far above €105, where the call pays more, and more far below, where it still pays 0: the call gains on one side and loses nothing on the other.
More spread does bring more low outcomes, but below €105 the call pays 0 however low the share goes, while the high outcomes pay more. The price rises, to €13.83.
The average year-end price stays €105 in the q-world, but the call's payoff is 0 on one side, so its average grows with the spread: €13.83.

The formula's call price as the inputs move (made-up inputs)

The curve: the call's price at each share price, with the other inputs as set. The dot: today's share price.

Call–
Put–
N(d1)–
N(d2)–

Move the others, one at a time. A higher share price or a lower strike raises the call's price. A longer life raises it twice over: the curve widens (σ√T grows) and PV(K) shrinks. Higher interest shrinks PV(K) and raises it too.

One thing is not an input: how fast the share is expected to grow. As in the tree, the copy's cost doesn't depend on it, so the formula prices with the q-world, where the share grows at the interest rate.

A check by simulation

A check that doesn't use the formula: a Monte Carlo simulation, many random paths and then an average. Send 100,000 paths through a 252-step tree (one step per trading day), each step up with chance q; on each path, divide the call's payoff by 1.05 (discounting); then average.

The average comes with an error bar: two standard errors either side of it, a standard error being how far an average of that many random paths typically lands from the value endless paths would give. A bar from fresh paths misses the true value about 1 time in 20.

A second set of paths uses a made-up real chance of up, with which the share grows 12% a year on average. Which world's average should land on the formula's €6.94?

The price is the q-average divided by 1.05, as in the tree; the real chance never enters. Compare both worlds below.
The real chance moves the average payoff, not the price: the copy pays what the call pays whichever way the share goes. Only the q-average is the price.
Only one can. The real-chance paths end higher on average, so their average payoff is larger. Only the q-average is the price.

The average discounted payoff as paths are added, 100,000 simulated paths

Across: paths so far, each count including the earlier paths. Bars: two standard errors either side; dark ones miss the formula. Dashed: the formula's €6.94.

Average, 100,000 paths–
Error bar–

In this simulation the q-world's paths averaged €6.88, error bar €6.81 to €6.96: the formula's €6.94 is inside. The real-chance paths averaged €10.91 (€10.82 to €11.00), which is not a price: the copy costs the same in both worlds.

Four times the paths, half the bar. The bars at 2,000, 5,000, 20,000 and 50,000 paths missed €6.94 (dark marks), more often than 1 in 20: in this run the first few thousand paths happened to land low, and because each count reuses all the paths before it, one unlucky early stretch pulls several bars low at once. The check shows that the formula and the tree agree inside their own model. It can't show that the model fits any real share.

Same volatility, fatter tails

The formula assumes the log of the year-end price lands on a bell curve. A curve with fat tails puts more chance on very large moves than a bell with the same standard deviation does (the Fat tails lesson). Take a made-up q-world in which 85 years in 100 are calm, with volatility 13.03%, and 15 are wild, with 32.56%. The two are mixed so the average squared spread equals the bell's (17.42%)², and each kind of year grows 5% on average. The mix is taller in the middle, with fatter tails.

Price two calls by averaging over 100,000 simulated years of this world: strike €105, and a far one at €150, which the formula prices at €0.15. What will the €150 call's average say?

That happens near the middle: the €105 call falls from €6.94 to €6.31, because most years are calm. Far out it reverses: the €150 call averages €0.40.
The spread is the same on average, but the shape differs. The €150 call pays more the further the share ends past €150, and wild years bring rises well past it far more often than the bell: €0.40.
€0.40, about 2.6 times the formula's €0.15. The call pays more the further the share ends past €150, and wild years bring rises well past it far more often than the bell allows.

Two q-worlds with the same volatility (made-up, 100,000 simulated years)

Grey: the formula's lognormal curve. Orange: calm and wild years mixed. Shaded: above the strike; for far strikes that part is drawn taller, as labelled.

Formula–
Fat-tailed average–
Ratio–

In this simulation the €105 call averaged €6.31 against the formula's €6.94, and the €150 call €0.40 against €0.15, each with an error bar of a few cents. With the same volatility, the formula was too high for the strike near today's price and too low for the far one.

One caution: with two kinds of year, shares and a loan can't copy the call on every path, so there is no single price that rules out a sure profit, and this average is a price under one choice of q-chances. The point holds either way: the formula's price depends on the curve's shape, not only its spread. The lesson on implied volatility and the smile picks this up.

Practice 1 of 2

A put from a call

The situationA made-up share is at €80. A European call and a European put both have a strike of €88.20 and a last day a year away; interest is 5%. With a volatility of 30%, the formula prices the call at €7.91.

What is the put's price, in euros (to the cent)?

Hint: put–call parity, P = C − S + PV(K), with PV(K) = 88.20 ÷ 1.05.

PV(K) = 88.20 ÷ 1.05 = 84, so P = 7.91 − 80 + 84 = €11.91. No new run of the formula is needed.
PV(K) = 88.20 ÷ 1.05 = 84, so P = 7.91 − 80 + 84 = €11.91. (Using €88.20 without dividing by 1.05 gives €16.11, which forgets that the strike is paid a year later.)
Practice 2 of 2

Two calls, one volatility

The situationA made-up dealer (a firm that sells options to customers) prices calls with the formula and the right volatility. The share's years come in calm and wild kinds, as in this lesson's simulation. It sells two one-year calls at the formula's prices: one with a strike near today's price, one with a strike far above it.

Judging by this lesson's simulation, which sale is priced below the fat-tailed world's average?

For the strike near today's price the formula came out above the fat-tailed average (€6.94 against €6.31), because most years are calm. Far out it was below: €0.15 against €0.40.
The far call pays only after a large rise, and most after the largest, which wild years bring far more often than the bell allows: the formula's €0.15 against the average's €0.40. For the strike near today's price the formula was above the average instead.
The formula needs the right volatility and the right shape. With the same volatility and fatter tails, its price was too high for a strike near today's price and too low for one far above it.
✓

Lesson done

The Black–Scholes formula is the binomial tree's price as its steps get small: the q-average of a European call's payoff, brought back to today at the interest rate, when the log of the year-end price lands on a bell curve. N(d2) is the q-chance the call ends above its strike and N(d1) the shares in the copy; the put follows from put–call parity. The price is exact inside the model (fixed volatility, no jumps, the copy adjusted continuously, no costs). In this lesson's fat-tailed simulation, with the same volatility, it was too high for a strike near today's price and too low for one far above it.

Key ideas

European option
an option that can be used only on its last day
Volatility (σ)
the standard deviation of a share's yearly log return, ln(end price ÷ start price): how widely its yearly returns typically spread
Lognormal
a price whose log lands on a bell curve: never below 0, with a long tail of high prices
N(x)
the share of a bell curve's area left of x standard deviations from its middle
d2, N(d2)
in the Black–Scholes model, how many standard deviations the middle (median) of the log year-end price sits above the strike; N(d2) is the q-chance that a call ends above its strike
d1, N(d1)
in the Black–Scholes model, d1 = d2 + σ√T; N(d1) is a call's delta, the shares in the copy (the shares and loan that reproduce its payoff) today
Black–Scholes formula
a European option's price when the log price follows a random walk with fixed volatility and no jumps, the copy is adjusted without pause, and trading is free; the binomial tree's limit
Put–call parity
a European call minus a European put with the same strike and last day is worth today's price minus the strike's present value
Error bar
a simulated average plus or minus two standard errors; a bar from fresh paths misses the value endless runs would give about 1 time in 20

C = S·N(d1) − PV(K)·N(d2)  ·  d1 = [ln(S ÷ PV(K)) + ½σ²T] ÷ (σ√T)  ·  d2 = d1 − σ√T

P = C − S + PV(K)  ·  PV(K) = K ÷ (1 + r)T

Lesson notes

The Black–Scholes formula prices a European call (one that can be used only on its last day) as the binomial tree's price when its steps get small: the call's payoff averaged with the risk-neutral chances q, under which the share grows on average at the interest rate, and divided by that interest. It holds inside a model: fixed volatility, no jumps, the copy adjusted without pause, free trading, one interest rate. A put, the right to sell at the strike, follows from put–call parity; the copy is the shares and loan that reproduce the call's payoff. In this lesson's fat-tailed simulation, with the same volatility, the formula's price was too high for a strike near today's price and too low for one far above it. Every number is made up or simulated.

Where the tree stopped

A made-up share is at €100; a call (the right, not the duty, to buy it at the strike) has a strike of €105 and a last day a year away; interest is 5% a year. The binomial tree lesson priced it by working back with q, the chance of up that makes the share grow on average at the interest rate, a pricing weight and not a forecast. With more and more steps the price settled at €6.94. The steps' size came from the share's volatility σ, the standard deviation of its yearly log return, ln(end price ÷ start price): σ = 17.42% a year. The strike's present value, the amount today that grows to it at interest, is PV(K) = 105 ÷ 1.05 = €100, equal to today's price here.

Many small steps make a curve

The q-world is the made-up world in which the share grows on average at the interest rate, used for pricing: each step goes up with chance q. With one step the tree ends at €119 with q-chance 0.6 or €84 with 0.4. Each step multiplies the price by a factor, and the log of a product is a sum, so the log of the year-end price is a sum of many small up-or-down steps. Such a sum lands on a bell curve. A price whose log lands on a bell curve is lognormal: never below 0, with a long tail of high prices. As the steps multiply, the tree's chances approach that curve.

The price is an average over the curve

Working back through a tree gives the same number as averaging the payoff with the q-chances and dividing by 1.05. The call pays only above €105, where you receive a share and pay €105, so its price is the share part minus the strike part, each valued today. The q-chance of ending above €105 is 0.4653, so the strike part is 0.4653 × 105 ÷ 1.05 = €46.53. The share part, each year-end price above €105 times its q-chance, added up and divided by 1.05, is €53.47. The call: 53.47 − 46.53 = €6.94.

N(d1) and N(d2)

On a log scale the curve is a bell whose standard deviation is σ√T = 0.1742 for one year. Its middle, the median (the price with half the chance above it and half below), is at €103.42, below the average of €105 because the long right tail pulls the average up. N(x) is the share of a bell curve's area left of x standard deviations from its middle (a spreadsheet's NORM.S.DIST(x, TRUE)). On the log scale, ln(103.42 ÷ 105) ÷ 0.1742 = −0.0871: the middle sits 0.0871 standard deviations below the strike. So the chance of ending below the strike is N(0.0871) = 0.5347, and the chance of ending above it is the rest: 1 − 0.5347 = 0.4653 = N(−0.0871), by the bell's symmetry. That −0.0871 is d2, and N(d2) is the q-chance that the call ends above its strike.

In general the middle is the average, S(1 + r)T, times e−½σ²T: big up-years pull the average up more than big down-years pull it down, and the size of the gap, ½σ²T on the log scale, is a standard result stated here without proof (as is the share part being S·N(d1)). So ln(middle ÷ K) = ln(S ÷ PV(K)) − ½σ²T, and d2 is that divided by σ√T. d1 = d2 + σ√T = 0.0871, and N(d1) = 0.5347, so the share part is 100 × 0.5347 (the same number as the chance of ending below only because here d1 = −d2). N(d1) counts the chance of ending above the strike by what you receive there, so a €150 ending counts for more than a €106 one; it is also the call's delta, the shares held in the copy today.

What each input does

Doubling σ to 34.83% raises the call's price to €13.83: a wider curve adds high outcomes, where the call pays more, and low ones, where it still pays 0. A higher share price, a lower strike, a longer life (the curve widens and PV(K) shrinks) or higher interest (PV(K) shrinks) each raise it too. How fast the share is expected to grow is not an input: as in the tree, the copy's cost does not depend on it.

A check by simulation

A Monte Carlo simulation sent 100,000 random paths through a 252-step tree, each step up with chance q, and averaged the call's payoff divided by 1.05. The standard error, the paths' standard deviation ÷ √(number of paths), is how far such an average typically lands from the value endless paths would give; the error bar, two standard errors either side, misses that value about 1 time in 20 when its paths are fresh. In this simulation the average was €6.88, error bar €6.81 to €6.96, which contains the formula's €6.94. The bars at 2,000, 5,000, 20,000 and 50,000 paths missed it, more than 1 in 20, because each count reuses the paths before it, so one unlucky early stretch pulls several bars low at once; the 1 in 20 holds for bars from separate paths. The same random draws with a made-up real chance of up, under which the share grows 12% a year on average, gave €10.91: not a price, since the copy costs the same whichever chance is real. The check shows the formula and the tree agree inside their model, not that the model fits any real share.

Same volatility, fatter tails

A curve with fat tails puts more chance on very large moves than a bell with the same standard deviation. In a made-up q-world, 85 years in 100 were calm (volatility 13.03%) and 15 wild (32.56%), with the same average squared spread as the bell's 17.42% and each kind of year growing 5% on average. Over 100,000 simulated years, the €105 call averaged €6.31 against the formula's €6.94, and a €150 call €0.40 against €0.15: too high for the strike near today's price, too low for the far one, because the far call pays most after very large rises, which wild years bring far more often. With two kinds of year no copy works on every path, so this average is a price under one choice of q-chances. The formula's price depends on the curve's shape, not only its spread.

Formula: the Black–Scholes formula

The cost of copying a European call with shares and a loan adjusted without pause, when the log of the share's price follows a random walk (a running total of random up-or-down steps) with fixed volatility and no jumps and trading is free (Holds when, below). The put from put–call parity: a European call minus a put with the same strike and last day is worth today's price minus PV(K).

C = S·N(d1) − PV(K)·N(d2)
d1 = [ln(S ÷ PV(K)) + ½σ²T] ÷ (σ√T)  ·  d2 = d1 − σ√T
P = C − S + PV(K)  ·  PV(K) = K ÷ (1 + r)T
S
the share's price today
K
the strike
T
the years left until the last day
r
the interest rate a year
σ
the volatility: the standard deviation of the share's yearly log return
N(x)
the share of the bell curve's area left of x standard deviations from its middle
N(d2)
the q-chance that the call ends above its strike
N(d1)
the call's delta: the shares in the copy today
C, P
the European call's and put's prices today, before costs
Worked example

S = 100, PV(K) = 105 ÷ 1.05 = 100, σ = 0.1742, T = 1. ln 1 = 0, so d1 = (½ × 0.1742²) ÷ 0.1742 = 0.0871 and d2 = −0.0871. N(d1) = 0.5347, N(d2) = 0.4653. C = 53.47 − 46.53 = €6.94; P = 6.94 − 100 + 100 = €6.94.

Holds whenBreaks when

Volatility changes or prices jump: the year-end curve has fatter tails than the lognormal, and the formula's price can be far off, most of all in proportion for strikes far from today's price (in the simulation above, €0.15 against €0.40 at a strike of €150). Adjusting the copy only at intervals, or paying costs each time, leaves a gap between the copy and the call.

One more worked example

New made-up numbers

A share at €60; a European call and put with a strike of €57.75 and a year to go; interest 5%; σ = 30%. PV(K) = 57.75 ÷ 1.05 = €55, and ln(60 ÷ 55) = 0.0870.

d1 = (0.0870 + ½ × 0.3²) ÷ 0.3 = (0.0870 + 0.045) ÷ 0.3 = 0.1320 ÷ 0.3 = 0.4400; d2 = 0.4400 − 0.3 = 0.1400. N(0.44) = 0.6700 and N(0.14) = 0.5557.

C = 60 × 0.6700 − 55 × 0.5557 = 40.20 − 30.56 = €9.64. P = 9.64 − 60 + 55 = €4.64. The call is worth more than the put because today's price is above the strike's present value.

Common mistakes

Check yourself

  1. A share at €50; a European call with a strike of €52.50 and a year to go; interest 5%; σ = 20%. N(0.1) = 0.5398 and N(−0.1) = 0.4602. What is the call's price, and the put's?
    Answer

    PV(K) = 52.50 ÷ 1.05 = 50, so ln(50 ÷ 50) = 0, d1 = (½ × 0.04) ÷ 0.2 = 0.1, d2 = −0.1. C = 50 × 0.5398 − 50 × 0.4602 = 26.99 − 23.01 = €3.98. P = 3.98 − 50 + 50 = €3.98.

  2. What does N(d2) mean, and what does N(d1) mean, in this lesson's example?
    Answer

    N(d2) = 0.4653 is the q-chance that the share ends the year above the €105 strike. N(d1) = 0.5347 is the call's delta, the shares the copy holds today; it is the same kind of chance with outcomes weighted by the share's price there, which makes it larger.

  3. Why is the share's expected growth not an input to the formula?
    Answer

    Because the price is the cost of a copy made of shares and a loan, and that cost does not depend on how fast the share is expected to grow. The formula prices in the q-world, where the share grows at the interest rate; in the simulation, paths growing 12% a year gave an average of €10.91, which is not the price.

  4. A simulation of 100,000 paths gives an average discounted payoff of €6.88 with a standard error of €0.036. What is its error bar, and does it contain €6.94?
    Answer

    Two standard errors either side: 6.88 ± 0.07, about €6.81 to €6.96 (the lesson's figures, from the unrounded €6.884 and €0.0356). It contains €6.94.

  5. In the fat-tailed simulation, why did the formula price the €150 call too low but the €105 call too high?
    Answer

    The €150 call pays only after a large rise and most after the largest, and wild years make very large rises far more frequent than the bell allows (€0.40 against €0.15). For the €105 strike, near today's price, most years are calm, with less spread than the bell's, so the average came out lower (€6.31 against €6.94).

Try it yourself

Run the simulation. Every number in this lesson comes from one Python script with a fixed random seed (below). Change the share of wild years, how wild they are, or the real chance's growth, and see which numbers move.

Work it out by hand. Find PV(K) = K ÷ (1 + r)T, then d1 and d2, read N from a normal table or a spreadsheet's NORM.S.DIST(x, TRUE), and put them into C = S·N(d1) − PV(K)·N(d2).

The code behind every number (Python, seed 2026111161)
Loading…
For the precise: the curve's middle, the tree's limit and the simulations

The textbook form. Textbooks write PV(K) as K·e−rT, with r the continuously compounded rate, here ln 1.05 = 0.0488 (4.88%): the same number, so the formula is the same.

The middle. In the q-world, ln(year-end price) is a bell with standard deviation σ√T and middle ln(S(1 + r)T) − ½σ²T; the −½σ²T makes the average price come out at S(1 + r)T. Here the middle price is 105 × e−0.1742²÷2 ≈ €103.42. Then N(d2) = chance(ln price above ln K), and S·N(d1) is the average of the price over outcomes above K, discounted.

The tree. With the binomial tree lesson's steps rule, the tree's price is €7.06 at 12 steps, €6.95 at 100 and €6.94 at 252 (€6.9408 against the formula's €6.9389); from 100 steps on it stays within €0.0172 of the formula. The tree's chance of ending above €105 does not settle on N(d2): its year-end prices sit on a grid, and the grid point nearest €105 carries about 5% of the chance, so it is 0.4930 at 200 steps and 0.4521 at 252. That point pays almost nothing, so the price is barely affected.

Simulation 1. Seed 2026111161, generator default_rng([seed, 1]); 100,000 paths × 252 steps of uniform draws, in ten blocks of 10,000. The q-world steps up when a draw is below q = 0.5061; the real-chance world, on the same draws, when below 0.5178. The q-world's average sat 1.55 standard errors below the formula; 44,804 of its paths ended above €105 (the grid effect again).

Simulation 2. Generator default_rng([seed, 2]); a year is wild when a uniform draw is below 0.15 (15,102 of 100,000 were), then its log return is ln 1.05 − v²÷2 + v·Z with Z a standard normal draw. Each average was checked against its exact value, 0.85 × C(13.03%) + 0.15 × C(32.56%): €6.35 at €105 (simulated €6.31, standard error €0.0378) and €0.41 at €150 (simulated €0.40, standard error €0.0141). The mix's excess kurtosis (a measure of tail weight, 0 for a bell) is about 3.3.

Honest notes

Where this comes from