Skip to content
All library documents

Matching FX Option Delta Conventions to Volatility Smile Quotes

Article Quant Q&A · Author: elypticla

Summary

The document explains why an FX option’s delta convention must match the convention used to build a volatility smile or surface. It lists spot and forward delta, each with premium-adjusted and unadjusted forms, and notes that converting between conventions can require solving for an implied strike or delta.

An example builds a smile using forward delta and shows that a put quoted at a 25-delta point retrieves the corresponding volatility when the option uses the same convention. Changing the option to spot premium-adjusted delta shifts the smile index and the returned volatility. The example illustrates convention sensitivity rather than prescribing one universal convention; users need to identify the quoting convention of their market data and option before looking up volatility.

Key ideas

  • FX volatility smiles may be indexed by spot or forward delta, with or without premium adjustment.
  • The option’s delta convention should match the convention used to construct the volatility smile.
  • Conversions between delta conventions can be nontrivial and may require numerical root solving.
  • The example shows that using a different convention changes the smile index and retrieved volatility.

Tags

Full text
# On what delta do I look up my vol for an fx Option?


# On what delta do I look up my vol for an fx Option?












I have a smile where I need to look up vols based on delta.

But in FX option space, you speak of deltas that are premium-adjusted or not.

So what delta do I need to use to look up on the vol surface?

## Answer by Attack68 (score 4)

https://quant.stackexchange.com/a/81258

As the above two comments from @AKdemy and @Andrea have made apparent you must be aware of what delta types you are using in order for this to make sense. There are generally 4 types:

- forward

- spot

- forward premium adjusted

- spot premium adjusted

In my library both the Smile/Surface are labelled as being constructed under one type and FXOptions can be labelled as being a different delta type. The library will make automatic conversions between the two, but this is non-trivial and in the slowest cases requires roots solvers (generally when going from non-premium adjusted to premium adjusted or vice-versa). Some of the mechanics of what is going on here uses the cited paper https://www.researchgate.net/publication/275905055_A_Guide_to_FX_Options_Quoting_Conventions

As an example, suppose one creates an FXDeltaVolSmile specified with a forward delta type:

```
from rateslib import *  # Python 3.12, rateslib 1.5.0

# Create an FX Forwards market from spot rates and interest rate curves
fxr = FXRates({"eurusd": 1.08}, settlement=dt(2024, 11, 26))
fxc = {
    "eureur": Curve({dt(2024, 11, 26): 1.0, dt(2025, 11, 26): 0.97}),
    "eurusd": Curve({dt(2024, 11, 26): 1.0, dt(2025, 11, 26): 0.97}),
    "usdusd": Curve({dt(2024, 11, 26): 1.0, dt(2025, 11, 26): 0.96}),
}
fxf = FXForwards(fx_rates=fxr, fx_curves=fxc)

# Create a Vol Smile
fxs = FXDeltaVolSmile(
    eval_date=dt(2024, 11, 26),
    expiry=dt(2025, 4, 26),
    nodes={0.25: 10.4, 0.5: 8.4, 0.75: 10.1},
    delta_type="forward"
)
```

Now if we construct a 25delta `Put` under the same convention we expect that the vol is exactly 10.4 (as that is an indexed point on the smile)

```
# Create an FXOption
fxo = FXPut(
    strike="-25d", 
    delta_type="forward", 
    expiry=dt(2025, 4, 26), 
    pair="eurusd"
)
fxo.analytic_greeks(
    curves=[None, fxf.curve("eur", "usd"), None, fxf.curve("usd", "usd")], 
    fx=fxf, 
    vol=fxs
)
####
{'delta': -0.250000,
 '_delta_index': 0.250000,
 '__delta_type': 'forward',
 '__vol': 0.104000,
 '__strike': 1.0391718351025454,
}
####
```

However, if one constructed a `Put` under a different delta type definition (such as spot premium adjusted) then the results would be different.

```
fxo = FXPut(
    strike="-25d", 
    delta_type="spot_pa", 
    expiry=dt(2025, 4, 26), 
    pair="eurusd"
)
fxo.analytic_greeks(
    curves=[None, fxf.curve("eur", "usd"), None, fxf.curve("usd", "usd")], 
    fx=fxf, 
    vol=fxs
)
####
{'delta': -0.250000,
 '_delta_index': 0.243168,
 '__delta_type': 'spot_pa',
 '__vol': 0.104959,
 '__strike': 1.0372647541668385,
}
####
```

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.