# Calculate strike from Black Scholes delta

I have a list of deltas and their corresponding volatilities in an FX market but I want to go from delta to strike price. In this Question similar problem is being discussed

How can I calculate the strike price or implied volatility from a given delta?

The way I understand it, the strike price can be found like this:

Is my approach correct? If yes; pleace help me understand the term, N(d_1), so I can proceed with the solve process?

Edit:
I basically want to create the volatility smile in (strike,vol)-graph from data found by Bloombergs OVDV function:

So maybe there's a simplere way to do so

• In Excel the function N(d1) is called NORMSDIST(). In many other languages there is such a function. In Python it;s norm.cdf() as part of Scipy. Aug 5, 2016 at 19:36
• In R; is it dnorm() og pnorm()? Aug 5, 2016 at 19:38
• It's pnorm() in R language. It's a "p" because it returns a probability (a number between 0 and 1). Aug 5, 2016 at 19:43

This is a little more complicated than the answer provided above since this is FX and the convention for determining the strike matters.

https://www.researchgate.net/publication/275905055_A_Guide_to_FX_Options_Quoting_Conventions

Most pairs take premium in the foreign (i.e. left hand side) currency. This means that you are paying for an option in the underlying - like paying for an IBM call option with IBM shares - and those shares can be viewed as part of the delta - as a result most pairs use the "include premium" convention. The details are in Wystup's paper and you should read it. The math is easy and it is nice to see everytrhing spelled out for you. The only pairs that "Exclude Premium" are EURUSD, GBPUSD, AUDUSD, NZDUSD - so these calculate delta in the usual way. Also in FX for BBG, the convention is to typically use spot delta for expiries less than a year and forward delta for expiries >= 1 year. Otherwise onlyvix's answer above is fine if you assume that the foreign risk free rate is 0.0%. The actual delta is $e^{-r_ft}N(d1)$ in the exclude premium case.

• Thanks, @FinanceGuyThatCantCode. I am struggling with the Time parameter. It makes a huge difference whether I use days, months etc. If I use $T=1/12$ (years) for the 1 month options I get my points really really close the ATM than if I use $T=21$ (days). By looking at the example provided above, What's the correct way of measuring time $T$ May 22, 2017 at 13:37
• @Sanjay - Bloomberg FX uses calendar days for their vol calculations. So ACT/365 is the convention - it might be ACT/ACT to handle leap years better, but I believe it is ACT/365. So, you need the (exact expiration date-today's date)/365. Calculating the expiration date from tenors is complicated actually. I coded it up once - I did not enjoy that. A mostly complete description of what to do is at: en.wikipedia.org/wiki/Foreign_exchange_date_conventions There are a couple other exceptions to the rules described here, but this will get you 95% of the way there. May 22, 2017 at 13:48
• So, for for 1 month option, the the time $T$ is approximately $T=(30/365)$ ? I am not sure if I have understood it correctly. May 22, 2017 at 17:25
• in that case 1M is approximately 1/12. Or if you prefer, use the number of days in month/365 - i.e. 30/365 if the option starts in April and 31/365 if May. However, if you need real accuracy, then you will need all the holiday calendars and conventions as discussed in the link I provided above. May 22, 2017 at 18:14

For a volatility surface of Delta $$\Delta$$ vs volatility $$\sigma$$, we can calculate the strike $$K$$ with underlying $$f$$,$$\phi$$ is 1 for call, -1 for put and time to expiration $$\tau$$, which should be a year fraction of working days:

$$K = fe^{-\phi N^{-1}(\phi\Delta)\sigma\sqrt{\tau}+\frac{1}{2}\sigma^{2}\tau}$$

• Is it correct to compute the f using the covered interest rate parity: f(CCY1rate, CCY2rate, spot, t) = spot * exp[(CCY1rate - CCY2rate)*t] or is it the ATM forward ? Apr 1, 2022 at 8:06
• good job and thank you, this verifies blackscholes. i checked and this is correct Apr 15, 2022 at 13:55

Since $\Delta_K = N(d_1)$ use normal inverse function $N^{-1}$ (e.g. NORM.INV in excel, norminv in matlab) to calculate $d_1 = N^{-1} (\Delta_K)$ Then use algebra to solve for $K$

It seems your end goal is to get a vol associated with some strike and tenor. In Bloomberg, you can actually let the API do that "trick" for you, including all conventions (premium included / excluded; spot / fwd delta...) and settings you have on the terminal.

For the strike override to work, you 1st have to set the delta override to 0 because that delta is used by default and that is the way to exclude it in the API.

=BDP("EURUSD Curncy","SP_VOL_SURF_BID","VOL_SURF_EXPIRY_OVR","20221030","VOL_SURF_CALLPUT_OVR","C","REFERENCE_DATE","20220324","VOL_SURF_DELTA_OVR","0","VOL_SURF_STRIKE_OVR=1.25”)


This gives you for the date 2022-03-24 the EURUSD call IVOL for expiry on 2022-10-30 and a strike of 1.25.

You can also use tenors directly like so:

=BDP("GBPUSD Curncy","SP_VOL_SURF_MID","VOL_SURF_MTY_OVR=1D","VOL_SURF_CALLPUT_OVR=P","VOL_SURF_STRIKE_OVR=1.1","VOL_SURF_DELTA_OVR=0")