Skip to content
All library documents

How Implied Volatility Skew Changes Sticky-Delta Option Delta

Article Quant Q&A · Author: NojaQU

Summary

The document compares option deltas under sticky-strike and sticky-delta assumptions. With sticky strike, implied volatility is held fixed at a strike as spot changes, making the option’s spot sensitivity the usual Black–Scholes delta in that setup. With sticky delta, implied volatility changes as spot moves because the volatility surface is treated as attached to delta or moneyness. The resulting sensitivity includes both the direct spot effect and the option-value effect from changing volatility.

The discussion gives a differential expression and examples based on finite differences across a sample volatility surface. Its main lesson is that the direction and steepness of the local volatility slope affect the difference: a locally flat surface gives similar deltas, while upward or downward slopes can raise or lower sticky-delta delta relative to sticky strike. The post contains an inconsistent final bullet about the downward-sloping case, so the directional result should be interpreted from its preceding explanation and calculations. The comparison also depends on the chosen surface and conventions; it does not imply sticky delta is always higher.

Key ideas

  • Sticky-strike delta holds implied volatility fixed at the strike as spot changes.
  • Sticky-delta delta accounts for implied volatility changing with the option’s delta or moneyness.
  • The volatility surface slope contributes to the option’s effective spot sensitivity.
  • A locally flat volatility surface makes the two delta estimates coincide or nearly coincide.
  • The direction of the difference depends on the local slope and the conventions used.

Tags

Full text
# Sticky delta vs sticky strike


# Sticky delta vs sticky strike












I have been trying to get my head around these concepts but what I have found online has caused more confusion: specifically why a sticky delta model might lead to a higher delta or no. of contracts than a sticky strike model.

I get they are different models but not sure why sticky delta would be higher. I was looking at the S&P 500 and the delta being higher under sticky delta than sticky strike; I'm not sure why that would be.

## Answer by river_rat (score 5)

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

By doing a bit of differential chasing you can get a closed form solution for the adapted aka sticky delta of a market call option. Recall that the price C of a market call option is given by the black-scholes equation and so $$C = BS(S, K, \sigma, T)$$ In the sticky-delta setting we know that the volatility $\sigma$ is functionally dependent on the black-sholes delta $$\sigma = f(\delta)$$ and $$\delta = \frac{\partial BS}{\partial S}(S,K,\sigma,T)$$

Taking differentials and solving shows that $$\frac{d C}{d S}=\frac{\partial BS}{\partial S} + \frac{\partial BS}{\partial \sigma}\times\frac{\frac{\partial^2 BS}{\partial S^2}\frac{\partial \sigma}{\partial \delta}}{1-\frac{\partial^2 BS}{\partial S \partial \sigma} \frac{\partial \sigma}{\partial \delta}}$$ So the impact to the normal sticky-strike delta is driven by the sign of the term $\frac{\partial \sigma}{\partial \delta}$ which is typically positive around the at-the-money forward level. Since around there gamma and vega are also positive, provided the steepness of the volatility curve in delta space is not too dramatic we will see that the adapted call delta is greater than the sticky-strike call delta.

(Edit - Adding proof)

$$\frac{dC}{dS} = \frac{\partial BS}{\partial S} + \frac{\partial BS}{\partial \sigma} \frac{\partial \sigma}{\partial \delta}\frac{d\delta}{dS}$$ $$\frac{d\delta}{dS} = \frac{\partial \delta}{\partial S} + \frac{\partial \delta}{\partial \sigma} \frac{\partial \sigma}{\partial \delta}\frac{d\delta}{dS} \implies \frac{d\delta}{dS}=\frac{\frac{\partial \delta}{\partial S}}{1-\frac{\partial \delta}{\partial \sigma}\frac{\partial \sigma}{\partial \delta}}$$ But $$\delta = \frac{\partial BS}{\partial S}(S,K,\sigma,T)$$ so $$\frac{d\delta}{dS}=\frac{\frac{\partial^2 BS}{\partial S^2}}{1-\frac{\partial^2 BS}{\partial S \partial \sigma}\frac{\partial \sigma}{\partial \delta}}$$ and thus $$\frac{d C}{d S}=\frac{\partial BS}{\partial S} + \frac{\partial BS}{\partial \sigma}\times\frac{\frac{\partial^2 BS}{\partial S^2}\frac{\partial \sigma}{\partial \delta}}{1-\frac{\partial^2 BS}{\partial S \partial \sigma} \frac{\partial \sigma}{\partial \delta}}$$

## Answer by user68819 (score 4)

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

A simple example.

Suppose you have a call and spot rallies ($\Delta S >0$), say your skew is downward sloping, then you would make money but not as much as you'd think in a sticky delta regime.

This is because your positive delta pnl ($\delta_{BS} \Delta S$) is partially offset by the vega loss ($\nu \Delta \sigma_i $) as vol comes off ($\Delta \sigma_i < 0 $) for a fixed strike.

## Answer by AKdemy (score 2)

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

I always find charts intuitive. I'll look at calls, but it is straigthforward to extend it to puts as well.

As mentioned in a comment:

- Sticky strike is really just black Scholes delta computed with Finite Difference.

- Sticky delta refers to adjusting IV when you bump up and down (because IV is stuck to delta /moneyness).

I use Julia to plot and compute the relevant values. The following code is used for plotting a dummy vol surface that has 3 different regions:

- a downward sloping IV (around P2) -> Sticky Delta will be lower

- a flat IV (around P5) -> Sticky Delta will be identical

- an upward sloping IV (around P8) -> Sticky Delta will be higher

The graph on the left hand side (LHS) shows in the dashed green line a flat vol surface where the up and down shifts around spot have the same vol as an input. The orange dots on the RHS correspond to the orange dots on the LHS. The only difference are the two IVs at the very beginning and end, which makes the skew steeper.

```
using Plots, Distributions, DataFrames, PrettyTables
vola = [0.2474, 0.2471, 0.2470,0.2470,0.2470,0.2470, 0.2470, 0.2471, 0.2473]
vola_flat = [0.2471, 0.2471, 0.2471,0.2470,0.2470, 0.2470,  0.2471, 0.2471, 0.2471]
vola2 = [0.2484, 0.2471, 0.2470,0.2470,0.2470,0.2470,0.2470, 0.2471, 0.2483]
strike = 98.5:0.5:102.5
vol = Dict(zip(strike,vola))
vol_flat = Dict(zip(strike,vola_flat))
vol2 = Dict(zip(strike,vola2))
p1 = plot(strike, vola, ylims=(minimum(vola2)-0.0005,maximum(vola2)+0.0005),xlabel="Strike",
    ylabel="IV",  label = false, linewidth = 3)
plot!(strike, vola_flat, ylims=(minimum(vola2)-0.0005,maximum(vola2)+0.0005),xlabel="Strike",
    ylabel="IV",  label = false, linewidth = 2, linestyle = :dashdot, linecolor = :green)
[annotate!([strike[i]], [vola[i]+0.0001], "P$i") for i in 2:3:8]
[plot!([strike[i], strike[i]], [vola[i], 0], linestyle = :dashdot) for i in 2:3:8]
plot!(strike, vola, seriestype=:scatter, label = false, color = :orange)
p2 = plot(strike, vola2, ylims=(minimum(vola2)-0.0005,maximum(vola2)+0.0005),xlabel="Strike",
    ylabel="IV", label = false, linewidth = 3)
plot!(strike, vola2, seriestype=:scatter, label = false,color = :green)
plot!(strike, vola, seriestype=:scatter, label = false, color = :orange)
[annotate!([strike[i]], [vola[i]+0.0001], "P$i") for i in 2:3:8]
[plot!([strike[i], strike[i]], [vola[i], 0], linestyle = :dashdot) for i in 2:2:8]
plot(p1,p2, left_margin = 2Plots.mm, legend = false)
plot!(size=(900,500))
```

Let's start by computing Black Scholes values and Delta first. The function looks like this (the cp_flag is allowing for calls (1) and puts (-1)):

```
function BSM(S,K,t,rf,d,σ, cp_flag)
    d1 = ( log(S/K) + (rf - d + 1/2*σ^2)*t ) / (σ*sqrt(t))
    d2 = d1 - σ*sqrt(t)
    opt = cp_flag*exp(-d*t)S*N(cp_flag*d1) - exp(-rf*t)*cp_flag*K*N(cp_flag*d2)
  return opt, exp(-d*t)*N(cp_flag*d1)
end
```

We evaluate this for different spot values, that correspond to the 3 different points,

```
    df = DataFrame("Spot" => spot, "Call Constant Vol" => [BSM(spot,k,t,log(1+r*t)/t,log(1+d*t)/t,vol_flat[spot], 1)[1] for spot in spot], 
     "IV Constant" => vola_flat,
    "Call BS Delta" => [round(BSM(spot,k,t,log(1+r*t)/t,log(1+d*t)/t,vol_flat[spot], 1)[2]*100, digits = 3) for spot in spot],  
    "Call Variable IV I" => [BSM(spot,k,t,log(1+r*t)/t,log(1+d*t)/t,vol[spot], 1)[1] for spot in spot],
    "IV I" => vola,
    "Call Variable IV II" => [BSM(spot,k,t,log(1+r*t)/t,log(1+d*t)/t,vol2[spot], 1)[1] for spot in spot],
    "IV II" => vola2)
hl_1 = Highlighter((data,i,j) -> data[i,1] == 99.0, crayon"bg:dark_gray white bold")
hl_2 = Highlighter((data,i,j) -> data[i,1] == 100.5, crayon"bg:dark_gray white bold")
hl_3 = Highlighter((data,i,j) -> data[i,1] == 102.0, crayon"bg:dark_gray white bold")
PrettyTables.pretty_table(df, border_crayon = Crayons.crayon"blue", 
                                header_crayon = Crayons.crayon"bold green", 
                                 formatters = ft_printf("%.2f" ),
                                 highlighters = (hl_value(55.307),hl_value(57.643), hl_value(59.915), hl_1,hl_2, hl_3))
```

which yields the following table:

The Black lines indicate where we want to compute Delta. The Table already shows the corresponding Black Scholes Delta in orange color. It also computed all corresponding BSM values for the various spot values, either with the a flat vol (the shifted spots will use identical IVs) or actual vols according to the change in moneyness / delta the corresponds to the shift.

What is left now is to show what sticke strike and sticky delta refers to. As already mentioned, sticky strike just corresponds to BSM Delta. Finite Difference means that you bump up and down to get delta (see the link above for more details). In our case this looks like this:

```
df_delta = DataFrame( "Spot" => ["$(spot[i+1])" for i in 1:2:5], 
            "Sticky Strike" =>  [round((df[!, "Call Constant Vol"][i+2] - df[!, "Call Constant Vol"][i])/0.01, digits = 2) for i in 1:3:8],
            "Sticky Delta I" => [round((df[!, "Call Variable IV I"][i+2] - df[!, "Call Variable IV I"][i])/0.01, digits = 2) for i in 1:3:8],
           "Sticky Delta II" => [round((df[!, "Call Variable IV II"][i+2] - df[!, "Call Variable IV II"][i])/0.01, digits = 2) for i in 1:3:8])
PrettyTables.pretty_table(df_delta, border_crayon = Crayons.crayon"blue", 
                                header_crayon = Crayons.crayon"bold green", 
                                 formatters = ft_printf("%.2f" ),
                                 highlighters = (hl_value(55.31),hl_value(57.64), hl_value(59.91)))
```

As suggested at the begining:

- Sticky Delta will be lower if the IV surface slopes downward

- Sticky Delta will be identical if the IV surface is flat (around spot)

- Sticky Delta will be higher if the IV surface slopes downward

The steeper, the more pronounced this effect. You can quickly check the flat surface case if you have Bloomberg. Load OVML (for FX) and compare Delta with sticky delta (both are displayed). Override IV manually and you will see both become identical.

Since the tables display the BSM values as well, it is also easy to find an explanation. Shifting spot down makes a call option worth more. Increasing IV as well. If the surface slopes downward, you have higher BSM values if you shift down, and lower if you shift up. Since the difference is what matters, you get smaller delta values. The opposite holds for upward sloping surfaces.

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.