1 votos

El método de bisección de la volatilidad implícita no funciona para las opciones de venta europeas

Estoy intentando implementar un método Bisection para el cálculo de la volatilidad implícita. Utilizo un algoritmo de Haug (página 455).

def GBlackScholesImpVolBisection(CallPutFlag, S, X, T, r, cm): 
    vLow = 0.01
    vHigh = 100
    eps = 1e-7
    cLow = BlackScholes(CallPutFlag, S, X, T, r, vLow)
    cHigh = BlackScholes(CallPutFlag, S, X, T, r, vHigh) 
    counter = 0

    vi = vLow + (cm - cLow) * (vHigh - vLow)/(cHigh - cLow)
    while abs(cm - BlackScholes(CallPutFlag, S, X, T, r, vi)) > eps: 
        counter = counter + 1
        if counter == 500:
            GBlackScholesImpVolBisection = 'NA'
            return GBlackScholesImpVolBisection
        if BlackScholes(CallPutFlag, S, X, T, r, vi) < cm:
            vLow = vi
        else:
            vHigh = vi
        cLow = BlackScholes(CallPutFlag, S, X, T, r, vLow) 
        cHigh = BlackScholes(CallPutFlag, S, X, T, r, vHigh) 
        vi = vLow + (cm - cLow) * (vHigh - vLow) / (cHigh - cLow)
    GBlackScholesImpVolBisection = vi
    return GBlackScholesImpVolBisection

Básicamente, funciona bien para las opciones de compra, pero da un error (división por cero) si utilizo opciones de venta. He intentado con diferentes estimaciones bajas y altas pero nada ayuda.

Mi función BlackScholes tiene el siguiente aspecto

def BlackScholes(CallPutFlag, S, X, T, r, sigma):
    d1 = (math.log(S/X) + (r + sigma**2 / 2) * T) / (sigma * math.sqrt(T))
    d2 = d1 - sigma * math.sqrt(T)
    if CallPutFlag == "C":
        price = S * stats.norm.cdf(d1) - X * math.exp(-r * T) * stats.norm.cdf(d2)
    elif CallPutFlag == "P":
        price = X * math.exp(-r * T) * stats.norm.cdf(-d2) - S * stats.norm.cdf(-d1)
    return price

Y las variables que utilizo son

S = 91.1 # Stock price
r = 7.2/100 # Risk-free interest rate
X = 60 # strike
T = 70/365 # Time to expiration in years
spot_price = 90.2

1voto

Tallrob Puntos 1

Hay varias maneras de ver lo que está pasando aquí.

Desde la perspectiva de sólo analizar el código mientras se ejecuta, sus valores con "vol alto" y "vol bajo" están demasiado cerca. Financieramente, esto es común si vega es cercana a cero, como suele ser el caso con una opción OTM profunda.

Desde un nivel superior, el vol que intentas resolver no existe. Para ver por qué intuitivamente, imaginemos que de alguna manera supiéramos que la acción llegaría a 0, el "mejor escenario posible" para quien posea la opción de venta. El día de vencimiento, el titular de la opción de venta obtendría $(K - S_T)^+ = 60$ . Así que nunca podremos tener nada que valga más que $60$ lo que significa que no deberíamos poder encontrar un vol implícito que haga coincidir los precios.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X