¿Sólo muestran un gráfico? ¿No hay valores? ¿Cuál es la plataforma?
Si eso es sólo una trama, me inclino a decir que todo lo que hacen es ejecutar Black Scholes, acortar el tiempo (si vas 6m en el futuro, sólo hacer la expiración 6m más corto), y volver a precio con algunos valores spot diferentes. No creo que haya nada de fantasía. Si es un poco más sofisticado, el vol se ajustaría, utilizando el hecho de que el tenor es ahora más corto y se mueve a lo largo de la estructura de plazos. Sin embargo, has descartado eso al escribir que utiliza la corriente (y el vol opcional). Así que también no se mueve a lo largo de la sonrisa.
En Julia, usted podría hacer esto en unas pocas líneas de código para obtener Black Scholes en un DataFrame:
using Plots, Distributions,DataFrames, PlotThemes
theme(:juno)
N(x) = cdf(Normal(0,1),x)
function BSM(S,K,t,rf,d,)
d1 = ( log(S/K) + (rf - d + 1/2*^2)*t ) / (*sqrt(t))
d2 = d1 - *sqrt(t)
c = exp(-d*t)S*N(d1) - exp(-rf*t)*K*N(d2)
return c
end
S = 6:0.1:15 # spot range
t = 1 # start tenor (1 year)
shift = 6 # months shift
t_new = t - shift/12
df = DataFrame(Call = BSM.(S,10,t_new,0.0,0.0,0.2))
Se puede trazar el valor actual (suponiendo que todo lo demás es igual, pero el spot cambia) frente a algún día en el futuro (todo lo que cambia es el plazo de vencimiento; y el spot).
plot(S,df.Call , label = "Call Option Price in 6 Months")
plot!(S,BSM.(S,10,t,0.0,0.0,0.2),
label = "Call Option Price Today",
legendposition = :topleft)
Añadiendo unas líneas se calcula el PnL (se resta el coste inicial), se hace dinámico (con el deslizador para el plazo y el vol) y también permite jugar con diferentes valores nocionales.
original_cost = BSM.(10,10,t,0.0,0.0,0.2)
function call(N, t_new, vega)
payoff_call = N.*(BSM.(S,10,t-t_new/365.0,0.0,0.0,vega) .- original_cost)
end
function start_val(N, vega)
payoff = N.*(BSM.(S,10,t,0.0,0.0,vega) .- original_cost)
end
S = 7:0.1:13
using Interact
call_gui = @manipulate for t_new = 1:1:364, vega = 0.01:0.01:0.41,
Notional = spinbox(label="Notional"; value=1);
plot(S,call(Notional, t_new, vega),
label = "Call Option PnL in $t_new days ($(t*365-t_new) days left to expiry)",
legendposition = :topleft)
plot!(S, start_val(Notional, vega),
label = "Call Option Payoff Today with K = 10",
xlabel = "Spot",
ylabel = "Pnl",
size = (700,500),
title = "Option PnL for K = 10, t = 1 year, 0 divs and rates and 20% vol at initiation",
titlefontsize=10)
end
@layout! call_gui vbox(hbox(:t_new, :vega, :Notional),observe(_))
Y cambiando algunos parámetros:
Ahora bien, la mayoría de los mercados de renta variable son americanos, pero en mi ejemplo, los resultados serían idénticos para una opción americana de todos modos. En casos más generales, tendría que implementar esto con un modelo que valore las opciones americanas (PDE solver por ejemplo). También podría mostrar los valores reales en un DataFrame en lugar de sólo el gráfico.