Calculating option prices in your head

We all know that option prices are calculated with the Black-Scholes formula, using a volatility, time-to-maturity, strike and forward. Typically you just chuck them all into your computer and let it spit out the number.

Trouble with this is how do you get an intuition for prices, especially when you are looking at options trades like conditional steepeners or calendar spreads?

Recently I set myself the problem of getting some simple way to cross-check the numbers coming out of my PC, and to get some intuition for the way an option’s value decays to its intrinsic value as the forward moves (which is what you definitely need for options trading).

In this post I show you a simple approximation I have found which does a pretty stellar job of accurately telling you the price of an option at any strike, and which you can calculate in your head!

The 2 flavours of Black Scholes: lognormal or normal

Most people are familiar with the flavour of the Black-Scholes formula which is based on a so-called geometric brownian motion, and which needs a so-called lognormal vol as its input.

In concrete terms, lognormal vols are like the numbers you see in the VIX index: 40% is big, 10% is small.

A lognormal vol of 10% is saying that the annual return on an asset can sit in a range about 10% wide.

Makes sense: stocks can return something like 5%, but maybe they’ll return 10% in a good year or make 0% in a bad year.

In the world of interest rates, however, it is more intuitive to express changes in terms of the absolute moves: if the 10y rate was 4% last year and 5% now, then the normal vol might be something like 1% per year (or 100 basis points or 100bps per year).

The less-known Black-Scholes formula that uses these normal vols looks quite like the lognormal version.

If you are interested, click here for a paper which shows the full derivation of the BS normal formula.

All we need to know for this post is that the Black-Scholes normal flavour formula for the price of a call & put is:

In these two equations the d1 term is defined as:

It is just an alternative way of saying how far away you are from the strike of your option, I’ll talk more about it below.

Remark: In the world of swaptions trading (options on interest-rate swaps), the formulas don’t need the exp{-r(T-t)} term at the front, so in the following I basically assume r=0 and never write that part — I just use the terms inside the square brackets.

Pricing an at-the-money option: well-known and easy

For an at-the-money call or put (ie where K=F), the price is the same, let’s call it ATMPrice. The BS formula reduces to a simpler:

ATMPrice = 1/sqrt(2*PI) * vol * sqrt(Maturity)

which is very well approximated by:

ATMPrice = 0.4 * vol * sqrt(Maturity).

Here is an example in action:

if interest rates have a normal vol of 100bps per year, then the ATM 5y5y payer would cost about:

ATM 5y5y payer ~ 0.4 * 0.01 * 2.2 * 4.5 = 3.95%.

Note that the ‘4.5’ accounts for the duration of the underlying swap (a 5-year swap has a duration of about 4.5 at the current level of rates).

Nice so far, but it is going to get better 🙂

Options which are not ATM: my new discovery

The standard decomposition for an option is:

Option value = Intrinsic value + Time value.

Let’s compare that with the Black-Scholes normal formula from above:

This is where I got my Eureka! moment.

If you have a look at the term (F-K)N(d1) in a spreadsheet, you’ll see that for small levels of volatility and maturity (try, for example, sigma=0.25%, Maturity=1) it is actually quite close to Max(0,F-K) – which is the intrinsic value of the call.

Consequently, the BS normal formula is almost:

Call Price = Intrinsic + ATMPrice*exp(-0.5*d1*d1).


But not so fast.

If you compare this formula to the correct BS formula in a spreadsheet, you’ll see that around the strike it gives too much value to the call: basically the term ATMPrice*exp(-0.5*d1*d1), is too big when d1 is non-zero and small. This is telling us that the difference between (F-K)N(d1) and Max(0,F-K) gets important near the strike. As I say, have a look in a spreadsheet.

Nonetheless, this simple-but-wrong formula for the Call Price has pointed us in the right direction: it shows that the time value of the option should be written in terms of the price of the ATM option.

Starting with the Black-Scholes normal flavour formula, adding and subtracting Max(0,F-K) then rearranging and using the 0.4 trick, gives (with a blatant effort to own this decomposition):

The Hardy Decomposition:

Option Price = Intrinsic + ATMPrice*HardyFactor



= exp(-0.5*d1*d1) + d1/0.4*N(d1) – Max(d1/0.4,0).

Note that this is just a function of d1, which as I said above, is just a measure of how far you are from the strike in terms of the standard deviation to the option expiry date (being vol*sqrt(Maturity) ) of the underlying asset: eg

“I am 2 standard devs from the strike” means d1=2,

The lovely bit about the Hardy Decomposition is that the HardyFactor is well approximated by a simple expression:

\text{HardyFactor} \approx e^{-1.4 \, |d_1|} .

Better still, you can just remember a few values:

abs(d1) HardyFactor
0 100%
0.25 70%
0.5 50%
1 25%
1.5 12%

If you experiment a bit you’ll find better approximations. Here’s one I quite like and which is more accurate:

\text{HardyFactor} \approx (1-0.41 |d_1|) \, e^{- |d_1|}.

Let’s now look at some examples.

Example 1: Pricing a 5y5y 200-wide strangle

The time to maturity is 5, and we need sqrt(5) to calculate d1. Sqrt(5) = 2.23, which is pretty-much two and a quarter.

Therefore the standard deviation sigma*sqrt(Maturity) is just 2.25*normal vol.

For example, if normal vol is 100 bps per year, then

  • d1=1 when the forward is 225 bps from the strike
  • d1=0.5 when the forward is 112 bps from the strike
  • so d1 is just a bit less than 0.5 when the strike is 100 bps either side of the forward.

This means that the HardyFactor for each of our payer and receiver is going to be about 60%.

The ATMPrice is just 0.4*standard deviation = 90 bps.

The 200-wide strangle has got no intrinsic value when we first put the trade on, so

Strangle Price = 2 * 90 bps * 60% * Duration.

The Duration is going to be about 4.5-ish at the moment. The option-value bit (2*90*0.6) is equal to 108 bps (being 90% of 120, if you think about it). Multiplying everything together gives a final answer of:

Strangle Price = about 490 bps.

By the way, I calculate 108*4.5 as 1.08*450 which is just under 450+(another 10% of 450).

I said it was nice!

Example 2: Pricing a 10y 2s10s conditional steepener

The standard 2s10s steepener means receiving in 2-year swaps and paying in 10-year swaps (click here to see a post I wrote which tells you that steepening means buying shorter-dated bonds vs selling longer-dated bonds).

In options space, this trade means that we want to be long duration in a 10y2y swaption, and short duration in a 10y10y swaption. Some people would say

“we want a long (delta) position in 2y tails vs a short (delta) position in 10y tails”.

For this example we will get that position by:

  • buying a 1y2y receiver,
  • buying a 1y10y payer.

Of course, there are others ways to do this: you could for example buy the 1y2y receiver and sell a 1y10y receiver, and achieve a zero-cost trade (that would be leveraging).

First we calculate a few values which will help us identify the sorts of strikes we can afford.

Suppose that vol is 100 bps per year, then

d1 is 1 when the strikes are 100 bps out-of-the-money.

The ATMPrice is

ATMPrice = 0.4 *  100 bps = 40 bps.

Durations are roughly:

2y Duration ~ 1.8,

10y Duration ~ 9.

A conditional steepener trade would be done with duration-weighted notionals so that the delta on both positions is equal, and will generally be out-of-the-money at inception (so intrinsic = 0). Consequently we can write out the prices of the two trades:

1y2y Receiver = 40 bps * HardyFactor1 * 1.8,

1y10y payer = 40 bps * HardyFactor2 * 9 * 1.8/9,

and we can see that if we want to spend about the same amount upfront as we would for a 1y2y ATM call (40 bps * 1.8) then we need to choose our strikes so that

HardyFactor2 = HardyFactor1 = 50%.

According to the table above, this would mean having d1 around 0.5, and our conditional steepener trade is therefore:

  • buy a 1y2y receiver with strike 50 bps out of the money,
  • buy a 1y2y payer in sinxe 1.8/9 which is also 50 bps out of the money.

You can see how other variations of the conditional steepener can work.


All in all I reckon this is a pretty funky post.

This new & simple Hardy Decomposition representation of an option price gives a huge improvement to one’s intuition of options trades: the value of an option is just its intrinsic value plus a proportion of the ATM Price.

In a follow-up post I will use the Hardy Decomposition to show the intuition for calendar spreads, and another will show how easy the option greeks become when you think of options in this way.


Now go and read my post here which uses this simple decomposition to explain why implied vols have a smile.

11 thoughts on “Calculating option prices in your head

  1. What is the intuition behind the output, let’s take your simple ATM with 100 normal vol. So, around 0.4*vol*sqrt(mat), say we use 100 of vol and 1 year , so 0.4*100*1, so around 40bps… why would that be below 50bps…

    Is 100 vol meaning double or nothing or its less than that… if you flip a coin 1$ or 0, your option price should be 50cent… make sense…? Got any intuition?

    1. My first reaction was that there is not any intuition for that factor of 0.4 (it is just 1/2*sqrt(PI)), but on reflection there might be some juice there after all…
      Stick with me on this one:
      1) the price of an option is supposed to be a trader’s best guess at how much profit the buyer will make by delta hedging the option (the buyer would be long convexity and will make a few cents each time there is a move),
      2) as we go through time, those few cents of profit from a delta-hedging option position will decrease, because the leverage is decreasing (because the maturity is decreasing),
      3) so rather than being a full 0.5*(small profit) always, it will be 0.5*(small profit) at first and then 0.4*(small profit) after a while, then 0.3*() …

      There is some kind of weighted average there (it is a square-root decay), so the result comes out at 0.4.
      Well, that might be a bit far-fetched, but it could be checked by breaking down the usual Black-Scholes analysis into portions of time where you can approximate the Gaussians by a 2-point distribution.
      I am not hopeful that it could be done easily, but it sounds reasonable-ish.

      Here is another angle on your question.
      In the win-lose example you gave which costs 50c upfront, you are effectively scaling the win amount by 50% to get an intuitive explanation for a cost of 50c. Since the price is just a calculation of weighted probabilities, you do get a monetary result which has a simple intuition (reminds me of dimensional analysis).
      In the case of options the price is a more sophisticated calculation so we should not expect to be able to apply scaling directly as you would like. However, we _can_ use the ATM price as our base unit and apply scaling to that: if vol=100bps then we know that when the strike is 100bps either side of the current forward, the price of the option is about 50% of the price of the ATM (that’s what the OTM price approximation I found is saying, since d1=0.5 in that case).

      Maybe the first answer above is more like the idea you had in mind.
      Hope this helps 🙂

  2. the scaling works best in options that trade on a forward settlement, yes estimating the price via a ratio is not so hard but it actually complicates the main intuition you need when trading options which is delta & gamma [as a matter of urgency] and then interest rate (discounting) exposure and vega (term structure and strike mismatches) for which it is okay to rely on a proper system

    1. Don’t get me wrong, this is just a simple approximation formula which could be used as a quick check on anything that your computer system spits out. It is just an extension of the ATM approximation that traders often.

    1. The duration term will be present in every swaption pricing — since the asset you actually exercise into is a swap which has a duration (aka PV01 or DV01).

      1. Wouldn’t the answer to that question be that the vol in the equation is the volatility of the rate whereas the thing that you are exercising is a swap which has a price and the volatility of the latter is (rate vol)*(DV01)? I’m not sure if that is correct since vol also shows up in the d1 term but at least in the ATM case it seems that the value of an option on, say a 10yr swap should be roughly twice as valuable as an option on a 5yr swap, even if you think the rates themselves are equally volatile, simply because the actual value of a 10yr swap is roughly twice as volatile as the value of a 5yr swap.

    1. This idea is really just a way to approximate the Black-Scholes formula. So ‘yes’ it will be applicable to any option pricing that uses the Black-Scholes formula (and my guess is that this means pretty much every vanilla option on any asset).

  3. Thanks for this recipe – I like it. However, I think its more useful to memorise / look up the hardy factor in delta space rather than d1 space.
    for delta, h in [
    (0.50, 1.0 ),
    (0.25, 0.37),
    (0.10, 0.12),
    (0.01, 0.01),
    approx = h * 0.4 * math.sqrt(t) * vol * spot

    Also, the approximations you suggested weren’t very accurate.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s