Pricing a butterfly spread with Black–Scholes
Three Black–Scholes call prices add up to the price of a butterfly spread with strikes at 90, 100 and 110, and three months before expiry its value across stock prices looks nothing like its payoff.
What is a butterfly spread worth three months before it expires? There’s no direct formula for one, but once you see how it’s built from ordinary calls, pricing it with Black–Scholes takes a few lines of code.
The payoff
A butterfly spread pays off only if the stock ends up near a target price. With strikes at 90, 100 and 110, the payoff at expiry is zero below $90, rises dollar for dollar to $10 at $100, and falls back to zero at $110. On a graph it’s a tent centered on $100. It’s a bet that the stock stays near $100, with no view on direction, and the most you can lose is what you paid.
The tent is built from calls: buy one struck at 90, sell two struck at 100, buy one struck at 110. From 90 to 100 only the first call pays. Past 100 the two short calls take away two dollars for every dollar the stock rises, so the line turns down, and past 110 the last call flattens it at zero. The payoffs match at every stock price, so the prices must match today, or there’d be a free lunch:
butterfly = C(90) − 2·C(100) + C(110)
where C(K) is the price of a call with strike K.
The price
The Black–Scholes call price needs five numbers: the stock price S, the strike K, the time to expiry t in years (three months, so 0.25), the continuously compounded risk-free rate r (5% a year here), and the volatility σ, the annualized standard deviation of log returns (25% here). The stock pays no dividend, so there’s no dividend term. These are round numbers I picked for illustration, and none of this is investment advice. With these inputs σ√t is 0.125, so a typical three-month move is about 12.5%, or roughly $12.50 on a $100 stock. The tent is only $10 wide on each side.
This is textbook Black–Scholes: constant volatility and interest rate, no dividends or transaction costs, lognormal prices. Real markets price different strikes at different implied volatilities, so a real butterfly won’t match these numbers.
bs_call <- function(S, K, r = 0.05, t = 0.25, sigma = 0.25) {
d1 <- (log(S / K) + (r + sigma^2 / 2) * t) / (sigma * sqrt(t))
d2 <- d1 - sigma * sqrt(t)
S * pnorm(d1) - K * exp(-r * t) * pnorm(d2)
}
butterfly <- function(S, ...) {
bs_call(S, K = 90, ...) - 2 * bs_call(S, K = 100, ...) + bs_call(S, K = 110, ...)
}
butterfly(100)
#> [1] 2.993749
With the stock at $100, the three calls cost $12.21, $5.60 and $1.98. The butterfly comes to 12.2100 − 2(5.5984) + 1.9805 ≈ $2.99.
I checked this two ways. Building the same tent from puts instead of calls gives exactly the same number, which is put–call parity doing its job. Integrating the payoff directly against the lognormal risk-neutral distribution and discounting gives 2.99373, within a ten-thousandth of the formula.
So $2.99 buys a position that pays up to $10. Under the pricing model, though, the stock finishes between $90 and $110 only about 58% of the time, and the full $10 needs it to land exactly on $100.
Value before expiry
| Stock price | Payoff at expiry | Value three months out |
|---|---|---|
| 70 | 0 | 0.088 |
| 90 | 0 | 2.270 |
| 95 | 5 | 2.834 |
| 100 | 10 | 2.994 |
| 105 | 5 | 2.740 |
| 110 | 0 | 2.216 |
| 130 | 0 | 0.368 |
The value is flat. With three months left and a $12.50 typical move, the stock could end up nearly anywhere, so being at $95 or $105 today barely matters: the value goes 2.83, 2.99, 2.74 across that range. Far from the strikes there’s still time to drift back in, so the butterfly is worth $0.37 even with the stock at $130.
The peak also isn’t at $100. On a one-cent grid the value is highest at $99.30 (2.998). Under the pricing model the stock grows at the risk-free rate, so a $100 stock has a forward price of about $101.26, and starting a bit lower centers the expiry distribution on the tent. Setting r to zero moves the peak to about $100.55, slightly above $100 because the lognormal distribution is skewed right.
The two curves cross near $92.60 and $107.50. Between those prices, the butterfly is worth less today than it would pay if the stock stayed put until expiry. Outside that range, it’s worth more.
Time and volatility
The value mostly depends on how spread out the stock could be at expiry. With the stock at $100 and everything else fixed, the butterfly is worth 4.77 with one month left, 7.23 with one week, and 8.95 with one day, as the smooth curve closes in on the tent. Volatility works the other way, so buying a butterfly is a bet that the stock will move less than the price assumes. At σ = 15% it’s worth 4.56, and at 40% it’s worth 1.93.