3 votos

Bloomberg terminal opción de cálculo de datos

EDITAR

basado en la respuesta proporcionada, he seguido, pero aún no puedo hacer coincidir los datos de bbg con mis cálculos, ¿alguien podría aconsejarme cómo hacer coincidir el Precio de bloomberg dado los datos? entrar descripción de la imagen aquí

import numpy as np
import scipy.stats as ss
def BlackScholes(payoff, S0, K, T, r, sigma, q):
    d1 = (np.log(S0 / K) + (r - q + sigma**2 / 2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)

    if payoff == "call":
        return S0 * np.exp(-q * T) * ss.norm.cdf(d1) - K * np.exp(-r * T) * ss.norm.cdf(d2)
    elif payoff == "put":
        return K * np.exp(-r * T) * ss.norm.cdf(-d2) - S0 * np.exp(-q * T) * ss.norm.cdf(-d1)

d = 92
h = 5
m = 10
y = 365
T = d/y + h/24/y + m/60/24/y

rr =   0.05277
q =0
S0 = 4739.21
K = 4740
sigma = 0.12954
print(BlackScholes(payoff='call', S0=S0, K=K, T=T, r=rr, sigma=sigma, q=q))
155.7605850060304

Estoy tratando de conciliar los datos de opciones de SPY en el Terminal de Bloomberg, pero por alguna razón, no coinciden. Esperaría que coincida con la Mitad para la huelga de 475, pero no lo hace

T = 30/365
q = 0
r = 0.0548
S0 = 474.93
payoff = 'call'
K = 475
F = 477.1
print(BlackScholesWithForwards(payoff='call', F=F, K=K, T=T, r=r, sigma=11.84289027/100, q=q))
8.771200411422967

Datos de opciones del monitor de bloomberg, a partir del 17 de enero de 24:

Vencimiento

Días hasta el vencimiento

Tamaño del contrato

Tasa libre de riesgo

Precio a futuro

16-Feb-24 (30d)

30

100

5.480000

477.100000

Strike

Simbolo

Oferta

Pregunta

Último

IVM

Volm

470

SPY 2/16/24 C470

11.279999

11.329999

11.109999

12.769134

1322

471

SPY 2/16/24 C471

10.550000

10.600000

10.020000

12.529111

1048

472

SPY 2/16/24 C472

9.840000

9.880000

9.859999

12.406106

1355

473

SPY 2/16/24 C473

9.159999

9.189999

9.140000

12.176440

1285

474

SPY 2/16/24 C474

8.489999

8.520000

8.510000

12.000890

3941

475

SPY 2/16/24 C475

7.849999

7.880000

7.880000

11.842890

10970

476

SPY 2/16/24 C476

7.239999

7.260000

7.230000

11.700001

6087

477

SPY 2/16/24 C477

6.650000

6.670000

6.670000

11.542202

4000

import numpy as np
import scipy.stats as ss

def BlackScholesWithForwards(payoff='call', F=1000, K=100, T=None, r=None, sigma=0.35, q=0):
    # Verificar si se proporcionan T y r; de lo contrario, utilizar valores predeterminados o lanzar una excepción
    if T is None or r is None:
        raise ValueError("Por favor, proporcione valores para T y r")

    d1 = (np.log(F / K) + (r - q + sigma**2 / 2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)

    if payoff == "call":
        return np.exp(-q * T) * (F * ss.norm.cdf(d1) - K * np.exp(-r * T) * ss.norm.cdf(d2))
    elif payoff == "put":
        return np.exp(-r * T) * (K * ss.norm.cdf(-d2) - F * np.exp(-q * T) * ss.norm.cdf(-d1))
    else:
        raise ValueError("Valor no válido para payoff. Use 'call' o 'put'.")

5voto

BC. Puntos 9229

Puedes usar Bloomberg para que haga la mayor parte del trabajo por ti:

  • Si cargas el ticker en OVME L, cargas el pricer OTC OVME en modo listado. Eso también cargará el valor de mercado de la opción y todos los datos de mercado en el momento específico en que se cargó.
  • Dentro de OVME, asegúrate de que tu configuración esté ajustada para usar el tiempo exacto hasta el vencimiento (minutos, no solo días enteros). Verás las horas hasta el vencimiento junto con la fecha.
  • En más datos de mercado (OVME tiene varias configuraciones, por lo que el aspecto exacto puede variar), puedes ver todas las tasas, la tasa forward y los dividendos.
  • Puedes comenzar configurando las tasas y dividendos en cero. De esa forma es más fácil hacer coincidir
  • Una vez que hayas terminado con eso, mira las tasas (para calls, los Europeos y Americanos serán idénticos). El negro es para tasas continuas.
  • Después, mira los dividendos. Si el ticker carga con dividendos, ya no puedes usar la fórmula simple que usaste (que de hecho es incorrecta también). Si ves que Bloomberg usa discreto, utiliza un solucionador de PDE y pagos de dividendos discretos para calcular el valor de la opción Americana.
  • Las opciones SPY son opciones Americanas. Por lo tanto, una herramienta de precios BS simple no será suficiente.

Si usas el forward, estás viendo Black76. En este caso, ya no tienes dividendos y tasas de interés en la solución en forma cerrada porque estos ya están incorporados en el precio forward.

En código ficticio, puedes usar

 BSM(s,k,t,r,d, σ, cp)
        d1 = ( log(s/k) + (r - d+ σ^2/2)*t ) / (σ*sqrt(t))
        d2 = d1 - σ*sqrt(t) 
        opt = exp(-d*t)*cp*s*N(cp*d1) - cp*k*exp(-r*t)*N(cp*d2)

donde cp es un indicador de put / call que es 1 para una call, y -1 para una put y r y d deben ser transformados a la análoga continua de la tasa discreta de la comilla de mercado.

o

Black76(F,K,t,r,σ, cp)
    d1 = (log(F/K) + 0.5*σ^2*t)/ σ*sqrt(t)
    d2 = d1 - σ*sqrt(t)
    opt = cp*exp(-r*t)*(F*N(cp*d1) - K*N(cp*d2))

Lo que hiciste fue mezclar estas dos fórmulas juntas.

EDITAR

Como se mencionó en el comentario, necesitas revisar los detalles exactos de las configuraciones. Las tasas de interés generalmente siguen su propia convención de mercado. Además, si resuelves para IV, es posible que no veas toda la precisión. Para simplificar las cosas, ingresa los valores manualmente donde veas toda la precisión (y por lo tanto, resuelve para el precio en lugar de IV). No conozco tus configuraciones, pero incluiré capturas de pantalla de las mías y todos los valores utilizados en el precio.

Calculé el siguiente opción:

ingresar descripción de la imagen aquí

  • Tasa de interés de Liquidación en la pestaña de Datos de Mercado puede ser Convención de Mercado o 0 Días. La primera es T+2 (por lo tanto, 2 días menos que el vencimiento de la opción).
  • Convención de Días en la pestaña de Valoración es Act/360 si se ajusta a Convención de Swap.
  • Ingresé manualmente valores "limpios" para que no haya problemas con la precisión decimal que es invisible en la GUI. También establecí el día exactamente como un día completo, para evitar más complicaciones con las horas y los minutos hasta el vencimiento.

Dentro de Python, puedes usar lo siguiente

# paquetes 
import numpy as np
from scipy.stats import norm
import pandas as pd
# Fórmula de Black Scholes
def BSM(S,K,r,d,t, sigma, cp_flag):
    d1 = ((np.log(S/K) + (r - d + 0.5 * sigma **2) * t) / (sigma * np.sqrt (t)))
    d2 = d1 - sigma * np.sqrt(t) 
    opt = cp_flag*S *np.exp(-d*t)* norm.cdf(cp_flag*d1) - cp_flag* K * np.exp(-r*t)  * norm.cdf(cp_flag*d2)
    delta = cp_flag*np.exp(-d*t)*norm.cdf(cp_flag*d1)
    return opt, delta
# entradas 
s, k, t, σ, d  , r , cp_flag= 4860,  4860,  (90+ 0/24)/365, 0.1, 0.0 , 0.05, 1
r = np.log(1+r* (90-2)/360)/t # toma en cuenta ACT/360 con T+2 y hazlo continuo
print(r)
#precio de la opción 
c = BSM(s,k,r,d, t, σ, cp_flag)
pd.set_option('float_format', '{:.5f}'.format)
pd.DataFrame({"Precio (Acción)" : [c[0]], 
                            "Delta": [c[1]*100]})

La salida coincide exactamente con el precio de la opción de compra y el delta anteriormente.

ingresar descripción de la imagen aquí

En última instancia, el precio incluso de las opciones vanilla más simples es bastante complicado una vez que se tienen en cuenta todas las convenciones y detalles del mercado. Por eso, replicar los precios de las opciones de herramientas de precios adecuadas es difícil, y a veces imposible con ciertas herramientas como Quantlib porque la funcionalidad simplemente no soporta todos los detalles.

Algunos ejemplos:

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