Me gustaría usar las tasas de descuento y la curva de tasa cero de Bloomberg en lugar de derivar las tasas de la curva de rendimiento. ¿Alguien puede compartir un código de muestra para usar estas tasas directamente en las clases VanillaSwap o FloatingRateBond/FixedRateBond en python?
Respuesta
¿Demasiados anuncios?Debes tener en cuenta que Bloomberg no tiene una curva de rendimiento. Bloomberg tiene precios de mercado de los instrumentos para construir una curva de rendimiento y el resultado dependerá de la configuración particular para tu usuario. Algunas de estas opciones serían:
- Instrumentos (Depósitos, Futuros, FRAS, Swaps)
- Método de interpolación
- Lado de la curva (Bid, Ask, Mid)
- OIS DC Stripping
Si no deseas construir la curva de rendimiento en QuantLib, aunque es bastante fácil replicar tu curva de Bloomberg si usas los mismos datos de entrada y los mismos parámetros de la curva, puedes obtener factores de descuento directamente del ticker de la curva utilizando el campo SW_CRV_DISCOUNT_FACTORS
Aquí tienes un ejemplo simple para empezar que obviamente tendrás que ejecutar en una computadora con el software Terminal de Bloomberg instalado e iniciado sesión:
Hay muchos envoltorios para la API de Bloomberg en github. En este ejemplo estoy usando pybbg
import pybbg
bbg = pybbg.Pybbg()
df = bbg.bds('YCSW0045 Index', 'SW_CRV_DISCOUNT_FACTORS')
Esto te proporcionará un DataFrame con dos columnas (fechas y factor de descuento) que puedes introducir directamente para construir un objeto de curva en QuantLib. Sin embargo, aún necesitarás elegir el método de interpolación para los factores de descuento. Este ejemplo usa interpolación log-lineal de los factores de descuento
import QuantLib as ql
fechas = df.Date.astype(str).apply(lambda x: ql.Date(x, '%Y-%m-%d')).tolist()
factoresDescuento = df['Discount Factor'].tolist()
curva = ql.DiscountCurve(fechas, factoresDescuento, ql.ActualActual())
yts = ql.YieldTermStructureHandle(curva)
motor = ql.DiscountingSwapEngine(yts)
swap = ql.MakeVanillaSwap(ql.Period('5y'), ql.Euribor6M(yts), 0.01, ql.Period("2D"), pricingEngine=motor)
print(swap.fairRate())
La salida es muy similar a lo que obtengo en SWPM con la misma configuración. Además, ten en cuenta que utilizo una única curva y deberías ampliar este ejemplo para obtener una curva de descuento y una curva forward.