Estoy tratando de cotizar un swap en CZK a través de Quantlib con datos de BBG, hasta ahora nada complicado pero parece que no puedo igualar los flujos de efectivo de la pata flotante, y el NPV, cuando cotizo mis swaps, incluso si encuentro la tasa Par correcta.
Estoy tratando de realizar el bootstrapping de la curva CZK creando iborindex y luego ayudantes de Depo / FRA / Swap RateHelper
entonces primero creo el índice,
index_ql= ql.IborIndex('PRIBOR6M',ql.Period('6M'),2,ql.CZKCurrency(),ql.CzechRepublic(),ql.ModifiedFollowing,False,
ql.Actual360())
luego creo ayudantes y agrego los datos de Depo/FRA y swap. Tenga en cuenta que df_mapping es solo un df que tiene los datos en bruto (los publicaré más tarde)
helpers = []
for index,row in df_mapping.iterrows():
if row['Type'] == 'Depo':
rate_ql = ql.QuoteHandle(ql.SimpleQuote(row['Level']/100))
helpers.append(ql.DepositRateHelper(rate_ql,index_ql))
elif row['Type'] == 'FRA':
month_to_start = row['FRAstart']
month_end = row['FRAend']
rate_ql = ql.QuoteHandle(ql.SimpleQuote(row['Level']/100))
#helpers.append(ql.FraRateHelper(rate_ql,int(month_to_start),index_ql))
helpers.append(ql.FraRateHelper(rate_ql,int(month_to_start),index_ql))
elif row['Type'] == 'swap':
rate_ql = ql.QuoteHandle(ql.SimpleQuote(row['Level']/100))
helpers.append(ql.SwapRateHelper(rate_ql,ql.Period(index),calendar_ql,fixed_paymentFrequency_ql,paymentconvention_ql_fixed,fixed_daycount_ql,index_ql))
entonces creo la curva / yts / enlace de índice / motor etc ...
curve_ql = ql.PiecewiseLogLinearDiscount(date_ql,helpers,fixed_daycount_ql)
yts = ql.RelinkableYieldTermStructureHandle(curve_ql)
# Enlazar índice a la curva de descuento
index_ql = index_ql.clone(yts)
engine = ql.DiscountingSwapEngine(yts)
una vez que está creado, simplemente creo un swap simple con vencimiento a 10 años y cupón inicial del 4%
new_swap = ql.MakeVanillaSwap(ql.Period('10Y'), index_ql,
0.04, ql.Period('0D'), swapType=ql.VanillaSwap.Receiver,pricingEngine=engine,
Nominal=10e6,fixedLegTenor=ql.Period('1Y'),fixedLegDayCount=fixed_daycount_ql)
con los mismos datos, encuentro un NPV = -471426 vs BBG -476585, igualo las fechas / flujos de efectivo en la pata fija, pero no igualo la tasa reset y los importes de la pata flotante (pero aún así igualo las fechas)
mi pata flotante (no descontada)
Pata flotante de BBG (ver columna de pagos)
¿Puede darme algún consejo? Creo que el problema está en algún lugar en el cálculo de la tasa forward, que no parece coincidir, pero no tengo idea de por qué. Intenté cambiar el método de interpolación pero no cambia mucho.
Mire a continuación los datos en bruto, por favor avíseme si tiene alguna pregunta, gracias de nuevo por toda su ayuda,