No voy a adjuntar todo el código porque sería un gran desperdicio de espacio y no sería útil para el propósito de esta pregunta.
Lo que voy a adjuntar aquí es un fragmento de código y su salida, que muestra lo que no soy capaz de entender.
La salida
Today is November 29th, 2013
Settlement date is December 4th, 2013
Evaluation date is November 29th, 2013
Actual and implied curve evaluated at November 29th, 2013
The reference date is December 4th, 2013 for the Actual curve
The reference date is June 3rd, 2014 for the Implied curve
---- Actual ----- Implied
1 - 0.995917 --- 0.995485
2 - 0.990663 --- 0.987753
3 - 0.981329 --- 0.975887
4 - 0.966947 --- 0.959062
5 - 0.947756 --- 0.938374
6 - 0.925654 --- 0.914803
7 - 0.900713 --- 0.889055
8 - 0.874264 --- 0.862391
9 - 0.847481 --- 0.835015
10 - 0.819623 --- 0.806789
We've just amended the evaluation date from November 29th, 2013 to May 29th, 2014
Actual and implied curve evaluated at May 29th, 2014
The reference date is June 3rd, 2014 for the Actual curve
The reference date is June 3rd, 2014 for the Implied curve
---- Actual ----- Implied
1 - 0.995917 --- 0.995917
2 - 0.990673 --- 0.990673
3 - 0.981353 --- 0.981353
4 - 0.966986 --- 0.966986
5 - 0.947756 --- 0.947756
6 - 0.925689 --- 0.925689
7 - 0.900707 --- 0.900707
8 - 0.874121 --- 0.874121
9 - 0.847552 --- 0.847552
10 - 0.819667 --- 0.819667
Esta salida muestra que, si su fecha de evaluación es igual al 29 de noviembre de 2013 y pide una estructura de plazos implícita cuya fecha de referencia es el 3 de junio de 2014, obtiene dos curvas que son diferentes, como cabría esperar
Pero, si se modifica la fecha de evaluación fijándola en el 3 de junio de 2014 y se pregunta por la estructura de plazos implícita, ésta cambia de forma.
El fragmento de código
...
// +---------------------------------
// | Dates at which to forecast term structures
// +---------------------------------
Period forwardPeriod = 6 * Months;
Date forwardDate = calendar.advance(todaysDate, forwardPeriod);
Date forwardSettlementDate = calendar.advance(forwardDate, settlementDays, Days);
// +---------------------------------
// | Implied term structure
// +---------------------------------
RelinkableHandle<YieldTermStructure> actualDiscountCurve;
actualDiscountCurve.linkTo(depoSwapTermStructure);
boost::shared_ptr<YieldTermStructure> impliedDiscountCurve(new ImpliedTermStructure( actualDiscountCurve, // Handle<YieldTermStructure>
forwardSettlementDate // Date referenceDate
));
// +---------------------------------
// | Printing today's discount factors
// +---------------------------------
std::cout << std::endl;
std::cout << "Actual and implied curve evaluated at " << todaysDate << std::endl;
std::cout << "The reference date is " << actualDiscountCurve->referenceDate() << " for the Actual curve" << std::endl;
std::cout << "The reference date is " << impliedDiscountCurve->referenceDate() << " for the Implied curve" << std::endl;
std::cout << std::endl;
std::cout << "---- Actual ----- Implied" << std::endl;
std::cout << std::endl;
for(Time d = 1; d <= 10.0; d+= 1.0)
{
std::cout << d << " - " << depoSwapTermStructure->discount(d) << " --- " << impliedDiscountCurve->discount(d) << std::endl;
}
// +---------------------------------
// | Evaluate the bond with the implied curve at forward date
// +---------------------------------
discountingTermStructure.linkTo(impliedDiscountCurve);
Settings::instance().evaluationDate() = forwardDate;
std::cout << std::endl;
std::cout << "We've just amended the evaluation date from " << todaysDate << " to " << forwardDate << std::endl;
// +---------------------------------
// | Printing discount factors at forward date
// +---------------------------------
std::cout << std::endl;
std::cout << "Actual and implied curve evaluated at " << forwardDate << std::endl;
std::cout << "The reference date is " << actualDiscountCurve->referenceDate() << " for the Actual curve" << std::endl;
std::cout << "The reference date is " << impliedDiscountCurve->referenceDate() << " for the Implied curve" << std::endl;
std::cout << std::endl;
std::cout << "---- Actual ----- Implied" << std::endl;
std::cout << std::endl;
for(Time d = 1; d <= 10.0; d+= 1.0)
{
std::cout << d << " - " << depoSwapTermStructure->discount(d) << " --- " << impliedDiscountCurve->discount(d) << std::endl;
...
Mi pregunta está relacionada con mi objetivo, que describo brevemente en los siguientes puntos:
- con la fecha de evaluación igual a hoy, quiero obtener la estructura de plazos implícita con fecha de referencia igual a hoy + 6M;
- con la fecha de evaluación igual a hoy + 6M, quiero valorar un bono cuyo
DiscountingBondEngine()
utiliza la estructura de plazos implícita anterior; - esto me permitiría estimar una especie de "Theta" para el bono según una previsión (*) de la curva de descuento y no de una curva constante.
Cualquiera podría aclarar cómo hacer tal cosa sin tener una estructura de plazos implícita completamente cambiada después de la fecha de evaluación que modifica ?
(*) En realidad, la previsión procede de la curva de tipos a plazo.