1 votos

Fecha de fijación de valoración de swap QuantLibXL

Estoy tratando de construir una hoja de cálculo de Excel con QuantLib 1.4 para la valoración de permutas de "vivo"; IRSs con una fecha de inicio en el pasado y una fecha de vencimiento en el futuro. Esto es lo que tengo hasta ahora...

IRDValServer.xls

Básicamente es una versión reducida de la hoja de ejemplo InterestRateDerivatives.xls, con Cap, Floor, FRA y Swaptions eliminados. En la pestaña DateCalc he agregado una llamada a qlScheduleDates en la columna D para saber qué fechas pasadas requieren ajustes. Sin embargo, las fechas suministradas por qlScheduleDates no son las que qlInstrumentNPV necesita. ohRangeRetrieveError da este mensaje de error: "qlInstrumentNPV - 2nd leg: Missing Euribor6M Actual/360 fixing for August 10th, 2017"

Intenté lanzar Excel desde Visual Studio, así que podría poner un breakpoint en el código que arroja ese error. Esta fue la pila de llamadas al error.

QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::Error::Error(const std::basic_string,std::allocator > & file, long line, const std::basic_string,std::allocator > & function, const std::basic_string,std::allocator > & message)  Line 97 C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::IborCoupon::indexFixing()  Line 102 + 0x146 bytes    C++
    // fixingDate_ = 42957 (10 Aug 2017), today = 42962 (15 Aug 2017)
    // fixingValueDate_ = 42961 (14 Aug 2017)
    // this is BlackIborCouponPricer::coupon_
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::BlackIborCouponPricer::adjustedFixing(double fixing)  Line 101 + 0x17 bytes  C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::BlackIborCouponPricer::swapletPrice()  Line 148 + 0x24 bytes C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::BlackIborCouponPricer::swapletRate()  Line 153 + 0xe bytes   C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::FloatingRateCoupon::rate()  Line 93 + 0x29 bytes C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::FloatingRateCoupon::amount()  Line 62 + 0x2d bytes   C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::CashFlows::npvbps(const std::vector,std::allocator > > & leg, const QuantLib::YieldTermStructure & discountCurve, bool includeSettlementDateFlows, QuantLib::Date settlementDate, QuantLib::Date npvDate, double & npv, double & bps)  Line 515 + 0xf bytes  C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::DiscountingSwapEngine::calculate()  Line 86 + 0x88 bytes C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::Instrument::performCalculations()  Line 168 + 0x26 bytes C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::LazyObject::calculate()  Line 150 + 0xf bytes    C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::Instrument::calculate()  Line 155    C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!QuantLib::Instrument::NPV()  Line 187 + 0xe bytes  C++
QuantLibXL-vc90-mt-sgd-1_4_0.xll!qlInstrumentNPV(char * ObjectId, xloper * Trigger)  Line 155 + 0x19 bytes  C++

Al poner un breakpoint en IborCoupon::indexFixing encontré que la fixingValueDate_ en IborCoupon se alineaba con las fechas suministradas por qlScheduleDates, pero fixingDate_ no lo hacía. En el depurador capturé estos valores en diferentes visitas a IborCoupon::indexFixing( )

fixingDate      2017-08-10  2015-08-12  2016-02-11  2016-08-11  2017-02-10  2017-08-10
fixingValueDate 2017-08-14  2015-08-14  2016-02-15  2016-08-15  2017-02-14  2017-08-14
fixingEndDate   2018-02-14  2016-02-15  2016-08-15  2017-02-14  2017-08-14  2018-02-14

¿Cómo puedo resolver esta discrepancia de fechas para poder suministrar los ajustes correctos? ¿Puedo hacer que qlScheduleDates me muestre los valores de fixingDate en lugar de fixingValueDates? ¿O puedo cambiar la lógica de fijación de la tasa de cupón flotante para tomar las fechas que reporta qlScheduleDates?

0 votos

Acabo de leer esto: quant.stackexchange.com/questions/16862/… Siguiendo el consejo de @atkins apliqué un qlCalendarAdvance(..., "-2D", ...) a las fechas proporcionadas por qlScheduledDates antes de pasarlas a qlIndexAddFixings, y eso parece haber solucionado el problema.

3voto

Brad Tutterow Puntos 5628

Retrasándose 2 días con qlCalendarAdvance(..., "-2D", ...) funciona en este caso particular. Para ser más robusto y tener en cuenta el número de días de corrección y las convenciones del índice que estás utilizando, puedes usar la función qlInterestRateIndexFixingDate. Esta función toma el índice de tasa de interés y una fecha de valor (es decir, el inicio de tu cupón) y devuelve la fecha de corrección correspondiente.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X