Tengo calculadas las volatilidades implícitas de Black y Scholes (1973) y me gustaría convertir estos IVs en precios de opciones digitales utilizando una fórmula del tipo de Black y Scholes, no encuentro una fórmula para hacerlo. ¿Cómo puedo convertir los IV en precios de opciones digitales?
Respuestas
¿Demasiados anuncios?En el caso más sencillo, se puede suponer un mundo de vol Black Scholes plano. En este caso, utilizando la notación habitual de BS, el precio justo de la opción de efectivo o nada es e^(rt)*N(d2) que es el probabilidad descontada de que la opción venza en dinero.
Demostrarlo en Julia puede definirlo de la siguiente manera (el precio de compra será necesario más adelante).
using Distributions
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)
value = cp_flag*exp(-d*t)S*N(cp_flag*d1) - exp(-rf*t)*cp_flag*K*N(cp_flag*d2)
return value, exp(-r*t)*N(cp_flag*d2)
end
Veamos un ejemplo de Bloomberg,
podemos calcular el siguiente resultado
# inputs
s,k , t, , r, d = 19280.78, 19280.78, 1, 0.2471, -0.00006, 0.02061
#result
res = BSM(s,k,t,log(1+r*t)/t,log(1+d*t)/t,, 1)
println("Digital Value per unit = $(round(res[2],digits = 5))")
Bloomberg no parece utilizar un call spread en OVME y por eso está tan cerca. Bloomberg sí utiliza un call spread en OVML (FX) sin embargo. Si lo haces tú mismo, la cosa se complica un poco más. Por ejemplo, establecer huelgas en ± = ±1/2.
El gif lo muestra con diferenciales y desplazamientos poco realistas para dejar clara la distinción. Los valores reales, sin embargo, se calculan con precisión y coincidirían con OVML. Puedes leer algunos detalles aquí .
Tenemos que definir algunas cosas más para configurar esto:
-
calcular el diferencial (a menudo se utiliza el 1%, pero lo ideal es que dependa del vencimiento y del vol)
function spread(K,shift) lower_K = K(1-shift/2) upper_K = K(1+shift/2) spread = upper_K-lower_K return lower_K, upper_K, spread end spr = spread(k,0.01) val = ("Lower","Upper","Spread") k = Dict(zip(val,spr))
-
Calcule el ajuste nocional necesario para obtener el pago deseado (El diferencial * Nocional es igual a la suma de los pagos en el escenario de diferencial - esto debe ajustarse para obtener el nocional deseado).
function notional(desiredPayoff,spread) scale = desiredPayoff/(spread*desiredPayoff) return scale*desiredPayoff end
-
Obtenga el IV para los dos strikes (para simplificar, sólo asumo 3 escenarios diferentes: plano, vol más alto para el strike inferior (OTM Put Skew), strike superior más alto (OTM Call Skew).
= Dict("Lower" => [0.2471,0.2473,0.2470], "Upper" => [0.2471,0.2470,0.2473] )
-
calcular el valor (en porcentaje del subyacente):
scenario = ["Flat", "OTM Put Skew", "OTM Call Skew"] res = ["Digital Value per unit ($(scenario[i])) = $((BSM(s,k["Lower"],t, log(1+rt)/t,log(1+dt)/t,["Lower"][i],1)[1] - BSM(s,k["Upper"],t, log(1+rt)/t,log(1+dt)/t,["Upper"][i],1)[1])*notional(s,spr[3])/s)" for i in 1:1:3 ]