Matching FX Option Delta Conventions to Volatility Smile Quotes
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.