Quisiera usar QuantLib Python para calcular el roll-down de 6 meses de un swap de 5 años.
Creo que el cálculo que debo hacer es el siguiente:
$Rolldown=r_{0,5Y}-r_{0,4.5Y}$
Donde $r_{0,5Y}$ es la tasa spot de 5 años y $r_{0,4.5Y}$ es la tasa spot de 4 años y medio.
Puede encontrar la definición de roll-down en los siguientes enlaces:
https://e-markets.nordea.com/api/research/attachment/2796
http://www.gioa.us/presentations/2012/4-Rajappa.pdf
Por favor, avíseme si he formulado correctamente mi ecuación.
Suponiendo que mi ecuación es correcta, así es como intenté calcular el roll-down del swap utilizando QuantLib Python:
from QuantLib import *
# datos globales
calendario = TARGET()
fechaHoy = Date(6,Noviembre,2001);
Settings.instance().evaluationDate = fechaHoy
fechaLiquidacion = Date(8,Noviembre,2001);
# comillas de mercado
deposits = { (1,Semanas): 0.0382,
(1,Meses): 0.0372,
(3,Meses): 0.0363,
(6,Meses): 0.0353,
(9,Meses): 0.0348,
(1,Años): 0.0345 }
swaps = { (2,Años): 0.037125,
(3,Años): 0.0398,
(5,Años): 0.0443,
(10,Años): 0.05165,
(15,Años): 0.055175 }
# convertirlos en objetos Quote
for n,unit in deposits.keys():
deposits[(n,unit)] = SimpleQuote(deposits[(n,unit)])
for n,unit in swaps.keys():
swaps[(n,unit)] = SimpleQuote(swaps[(n,unit)])
# construir ayudantes de tasas
dayCounter = Actual360()
diasLiquidacion = 2
depositHelpers = [ DepositRateHelper(QuoteHandle(deposits[(n,unit)]),
Period(n,unit), diasLiquidacion,
calendario, ModifiedFollowing,
False, dayCounter)
for n, unit in [(1,Semanas),(1,Meses),(3,Meses),
(6,Meses),(9,Meses),(1,Años)] ]
frecuenciaPataFija = Anual
tenorPataFija = Period(1,Años)
ajustePataFija = Unadjusted
dayCounterPataFija = Thirty360()
frecuenciaPataFlotante = Semiannual
tenorPataFlotante = Period(6,Meses)
ajustePataFlotante = ModifiedFollowing
swapHelpers = [ SwapRateHelper(QuoteHandle(swaps[(n,unit)]),
Period(n,unit), calendario,
frecuenciaPataFija, ajustePataFija,
dayCounterPataFija, Euribor6M())
for n, unit in swaps.keys() ]
# manejadores de estructuras temporales
descuentoTermStructure = RelinkableYieldTermStructureHandle()
forecastTermStructure = RelinkableYieldTermStructureHandle()
# construcción de la estructura temporal
ayudantes = depositHelpers + swapHelpers
curvaDepoSwap = PiecewiseFlatForward(fechaLiquidacion, ayudantes, Actual360())
motorSwap = DiscountingSwapEngine(descuentoTermStructure)
# Swap de 5 años
nominal = 1000000
vencimiento1 = calendario.advance(fechaLiquidacion,5,Años)
frecuenciaPataFija = Anual
ajustePataFija = Unadjusted
dayCounterPataFija = Thirty360()
tasaFija = 0.04
frecuenciaPataFlotante = Semiannual
spread = 0.0
diasFijacion = 2
indice = Euribor6M(forecastTermStructure)
ajustePataFlotante = ModifiedFollowing
dayCounterPataFlotante = index.dayCounter()
horarioFijo1 = Schedule(fechaLiquidacion, vencimiento1,
tenorPataFija, calendario,
ajustePataFija, ajustePataFija,
DateGeneration.Forward, False)
horarioFlotante1 = Schedule(fechaLiquidacion, vencimiento1,
tenorPataFlotante, calendario,
ajustePataFlotante, ajustePataFlotante,
DateGeneration.Forward, False)
spot1 = VanillaSwap(VanillaSwap.Receiver, nominal,
horarioFijo1, tasaFija, dayCounterPataFija,
horarioFlotante1, indice, spread,
dayCounterPataFlotante)
spot1.setPricingEngine(swapEngine)
# Swap de 4.5 años
periodoRolldown = Period(6, Meses)
vencimiento2 = calendario.advance(vencimiento1, -periodoRolldown)
horarioFijo2 = Schedule(fechaLiquidacion, vencimiento2,
tenorPataFija, calendario,
ajustePataFija, ajustePataFija,
DateGeneration.Forward, False)
horarioFlotante2 = Schedule(fechaLiquidacion, vencimiento2,
tenorPataFlotante, calendario,
ajustePataFlotante, ajustePataFlotante,
DateGeneration.Forward, False)
spot2 = VanillaSwap(VanillaSwap.Receiver, nominal,
horarioFijo2, tasaFija, dayCounterPataFija,
horarioFlotante2, indice, spread,
dayCounterPataFlotante)
spot2.setPricingEngine(swapEngine)
# precio en dos fechas de evaluación diferentes
descuentoTermStructure.linkTo(curvaDepoSwap)
forecastTermStructure.linkTo(curvaDepoSwap)
tasaSpot5Y = spot1.fairRate()
tasaSpot4Y6M = spot2.fairRate()
print('Tasa spot de 5 años')
print(tasaSpot5Y)
print('Tasa spot de 4.5 años')
print(tasaSpot4Y6M)
print('Roll-down de 6 meses')
print(tasaSpot5Y - tasaSpot4Y6M)
¿Es correcta mi forma de usar QuantLib Python para calcular el roll-down de 6 meses de un swap de 5 años? ¿Es necesario crear 2 objetos de swap como he hecho para calcular el roll-down del swap?