Siempre encuentro los gráficos intuitivos. Miraré las calls, pero también es fácil extenderlo a puts.
Como se menciona en un comentario:
- La sticky strike es realmente solo el delta de Black Scholes calculado con Diferencias Finitas.
- Sticky delta se refiere a ajustar IV cuando subes y bajas (porque IV está pegado al delta / moneyness).
Utilizo Julia para trazar y calcular los valores relevantes. El siguiente código se utiliza para trazar una superficie de volatilidad ficticia que tiene 3 regiones diferentes:
- una IV con pendiente descendente (alrededor de P2) -> Sticky Delta será menor
- una IV plana (alrededor de P5) -> Sticky Delta será idéntico
- una IV con pendiente ascendente (alrededor de P8) -> Sticky Delta será mayor
El gráfico en el lado izquierdo (LHS) muestra en la línea verde punteada una superficie de volatilidad plana donde las subidas y bajadas alrededor del spot tienen la misma volatilidad como entrada. Los puntos naranjas en el RHS corresponden a los puntos naranjas en el LHS. La única diferencia son las dos IV al principio y al final, lo que hace que la pendiente sea más pronunciada.
usando 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=(mínimo(vola2)-0.0005,máximo(vola2)+0.0005),xlabel="Strike",
ylabel="IV", label = false, linewidth = 3)
plot!(strike, vola_flat, ylims=(mínimo(vola2)-0.0005,máximo(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=(mínimo(vola2)-0.0005,máximo(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))
Empecemos por calcular los valores y Delta de Black Scholes primero. La función se ve así (el cp_flag permite calls (1) y 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
Evaluamos esto para diferentes valores del spot, que corresponden a los 3 diferentes puntos,
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))
lo que da como resultado la siguiente tabla:
Las líneas negras indican dónde queremos calcular el Delta. La tabla ya muestra el Delta de Black Scholes correspondiente en color naranja. También calculó todos los valores de BSM correspondientes para los diversos valores del spot, ya sea con una volatilidad plana (los spots desplazados usarán IV idénticas) o volatilidades reales de acuerdo con el cambio en el moneyness / delta que corresponde al desplazamiento.
Ahora solo queda mostrar a qué se refieren la sticky strike y el sticky delta. Como se mencionó anteriormente, la sticky strike simplemente corresponde al Delta de BSM. Diferencias Finitas significa que subes y bajas para obtener el delta (ver el enlace arriba para más detalles). En nuestro caso se ve así:
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)))
Como se sugirió al principio:
- El Sticky Delta será menor si la superficie de IV tiene pendiente descendente
- El Sticky Delta será idéntico si la superficie de IV es plana (alrededor del spot)
- El Sticky Delta será mayor si la superficie de IV tiene pendiente ascendente
Cuanto más pronunciado sea, más marcado será este efecto. Puedes comprobar rápidamente el caso de la superficie plana si tienes Bloomberg. Carga OVML (para FX) y compara Delta con sticky delta (ambos se muestran). Anula manualmente IV y verás que ambos se vuelven idénticos.
Dado que las tablas muestran también los valores BSM, también es fácil encontrar una explicación. Bajar el spot hace que una opción de compra valga más. Aumentar IV también. Si la superficie tiene pendiente descendente, tienes valores BSM más altos si bajas y más bajos si subes. Dado que la diferencia es lo que importa, obtienes valores de delta más pequeños. Lo opuesto ocurre para superficies con pendiente ascendente.