Como se menciona en el título, estoy teniendo problemas con el precio de los swaps en USD en quantlib.
Quería tomar algunos datos (precios de los swaps en el mercado) y poder construir una estructura de plazos de rendimiento que me permita fijar el precio de, por ejemplo, un swap a 1 año. Sin embargo, parece que cuando se construye una curva de rendimiento y luego se fija el precio de un swap, mis precios no se alinean con los instrumentos exactos que estoy utilizando y me pregunto cómo puedo reconciliar los dos de manera que los resultados del modelo == entradas para los plazos siguientes
import QuantLib as ql
today = ql.Date().todaysDate()
calendar = ql.UnitedStates()
spot = calendar.advance(today, 2, ql.Days)
helpers = ql.RateHelperVector()
index = ql.IborIndex('MyIndex',
ql.Period('3m'),
2,
ql.USDCurrency(),
ql.UnitedStates(),
ql.ModifiedFollowing,
True,
ql.Thirty360())
helpers.append( ql.DepositRateHelper(0.01, index) )
swaps = [
('1Y', 0.015),
('2Y', 0.02),
('3Y', 0.025)
]
for tenor, rate in swaps:
swapIndex = ql.UsdLiborSwapIsdaFixAm(ql.Period(tenor))
helpers.append( ql.SwapRateHelper(rate, swapIndex) )
curve = ql.PiecewiseSplineCubicDiscount(spot, helpers, ql.Thirty360())
yts = ql.YieldTermStructureHandle(curve)
engine = ql.DiscountingSwapEngine(yts)
index = ql.IborIndex('MyIndex',
ql.Period('3m'),
2,
ql.USDCurrency(),
ql.UnitedStates(),
ql.ModifiedFollowing,
True,
ql.Thirty360(),
yts)
print("maturity, market, model")
for tenor, rate in swaps:
swap = ql.MakeVanillaSwap(ql.Period(tenor), index, 0.01, ql.Period('0D'), pricingEngine=engine)
print(f"{tenor}, {rate:.6f}, {swap.fairRate():.6f}")
madurez
mercado
modelo
1Y
0.015000
0.014831
2Y
0.020000
0.019809
3Y
0.025000
0.024755