Estoy tratando de ajustar una curva EUR basada en los siguientes instrumentos
- Citas de EONIA
- Comillas básicas de 1m vs 6m
- Comillas de 3 millones de euros (en firme)
- Comillas de 6 millones de euros (en firme)
- Comillas de 6m vs 12m
(1) , (3) & (4) son simplemente comillas y las encajo (usando un optimizador de python) modelándolas como :-
- EONIA se modela como un objeto Quantlib OvernightIndexedSwap
- Los Swaps de 3 y 6 metros se modelan como el objeto VanillaSwap
Tengo problemas para encajar las comillas de la base.
Comillas básicas de 1m vs 6m
Las citas son las siguientes:- [('1Y',12.3),('2Y',12.6),('3Y',13),('4Y',13.1),('5Y',13.1),('10Y',11.6),('20Y',6.5),('30Y',4.4)]
Comillas base de 6m vs 12m
Las citas son las siguientes:- [('1Y',7),('2Y',7.2),('3Y',7.4),('4Y',7.6),('5Y',7.7),('10Y',7.5),('20Y',6.3),('30Y',5.4)]
El código adjunto es el que utilizo para modelar estos basis swaps (básicamente los modelo como 2 VanillaSwaps - largo el Euribor a largo plazo y corto el Euribor a corto plazo)
Mi pregunta es con respecto a qué pierna utilizar un Swap1 vs Swap2.
Según tengo entendido, el diferencial se añade a la pata del libor del tenor corto.
Así, por ejemplo, para modelar 1m vs 6m, creo el objeto VanillaSwap1 (para el tramo de 1m de Euribor) y añado el spread al tramo flotante. A continuación, creo el objeto VanillaSwap2 para el tramo largo (es decir, el Euribor de 6 metros)
Del mismo modo, para modelar la base de 6m vs 12m,:- Creo el objeto VanillSwap1 (para el tramo de 6m Euribor) y añado el spread al tramo flotante. A continuación, creo el objeto VanillaSwap2 para el tramo largo (es decir, el Euribor 12m).
Sin embargo, estoy obteniendo una tasa cero negativa ajustada (después del proceso de optimización) para los 6m frente a los 12m. NOTA:Obtengo la tasa correcta del diferencial cero que coincide con el mercado pero el signo es -ve
Para la base de 1m frente a 6m, he ajustado correctamente los diferenciales de tipo cero al mercado
¿Estoy haciendo algo mal?
self.z_leg1_forcurve = curves[self.leg1_forcurve]
self.z_leg2_forcurve = curves[self.leg2_forcurve]
self.z_discurve_1 = curves[self.leg1_discurve]
self.z_discurve_2 = curves[self.leg2_discurve]
# set the base curve IborIndex
self.IBOR_Index1 = ql.IborIndex(
'IborIndex1',
ql.Period(self.leg1_frequency),
self.settle_days,
self.currency,
self.calendar,
ql.ModifiedFollowing,
False,
self.day_count,
self.z_leg1_forcurve.QLZeroCurve # Zero curve for the forecasting curve
)
# set the spread curve IborIndex
self.IBOR_Index2 = ql.IborIndex(
'IborIndex2',
ql.Period(self.leg2_frequency),
self.settle_days,
self.currency,
self.calendar,
ql.ModifiedFollowing,
False,
self.day_count,
self.z_leg2_forcurve.QLZeroCurve # Zero curve for the forecasting curve
)
# create a payment schedule for leg_1
schedule1 = ql.Schedule(
self.start_date,
self.end_date,
ql.Period(self.leg1_frequency),
self.calendar,
ql.ModifiedFollowing,
ql.ModifiedFollowing,
ql.DateGeneration.Backward,
False
)
# create a payment schedule for leg_2
schedule2 = ql.Schedule(
self.start_date,
self.end_date,
ql.Period(self.leg2_frequency),
self.calendar,
ql.ModifiedFollowing,
ql.ModifiedFollowing,
ql.DateGeneration.Backward,
False
)
# Swap1 is the short tenor (to which we add the spread quote)
self.QL_Swap1 = ql.VanillaSwap(
ql.VanillaSwap.Payer,
self.notional, # nominal
schedule1, # fixed leg schedule
0.0, # fixed rate
self.day_count, # fixed leg day_count
schedule1, # float leg schedule
self.IBOR_Index1, # libor index
self.quote, # spread (added to leg1 ALWAYS)
self.day_count # float leg day_count
)
# Swap2 is the long tenor
self.QL_Swap2 = ql.VanillaSwap(
ql.VanillaSwap.Payer,
self.notional, # nominal
schedule2, # fixed schedule
0.0, # fixedRate
self.day_count, # fixed leg DayCount
schedule2, # float schedule
self.IBOR_Index2, # liborIndex
0.0, # spread
self.day_count # float leg day_count
)
# discount the base curve with it's own discounting_curve
engine = ql.DiscountingSwapEngine(self.z_discurve_1.QLZeroCurve)
self.QL_Swap1.setPricingEngine(engine)
# discount the spread curve with it's own discounting_curve
engine2 = ql.DiscountingSwapEngine(self.z_discurve_2.QLZeroCurve)
self.QL_Swap2.setPricingEngine(engine2)
```