como valorar un swap con dos curvas en QuantLib

Ejemplo de contrato de derivado financiero: Swap de tipos de interés:

Si este derivado financiero esta colateralizado con cash EUR tendriamos aplicar curva descuento EONIA. (market practice IFRS)

Swap de tipos de interés

maturity: 20 nov 2022
nominal: 1M
fecha inicio: 20 nov 2012
pata variable paga: Euribor 3meses + 2% cada 3 meses
pata fija paga:4% anualmente

calendario: TARGET
calculo días pata fija: 30/360
calculo días pata variable: Actual/360

Datos de mercado :

ultima fijación de tipo Euribor 3m : 1%

para descontar flujos del swap usaremos la curva EONIA (podemos obtener desde reuters o bloomberg):

(datos de mercado ficticios)

31 Dec 2013 0.99
31 Dec 2024 0.80

para calcular forwards curva de tipos de proyección Euribor 3m:

31 dec 2013 0.999
31 dec 2024 0.89

ejemplo de código QuantLib swap en C++ para valoración del swap a 31/dec/2012

 
#include 

using namespace std;
using namespace QuantLib;
using namespace boost;

int main()
{
vector dates; 
vector discountFactor; 

Date valuationDate(31,December,2012);
Settings::instance().evaluationDate()=valuationDate;

dates.push_back(valuationDate); discountFactor.push_back(1.0); 
dates.push_back(Date(31,December, 2013));  discountFactor.push_back(0.99); 
dates.push_back(Date(31,December, 2024));  discountFactor.push_back(0.80); 
shared_ptr forwardCurve(new InterpolatedDiscountCurve(dates,discountFactor,Actual360())); 

discountFactor.pop_back();discountFactor.pop_back();

discountFactor.push_back(0.999);
discountFactor.push_back(0.89);

shared_ptr oisCurve(new InterpolatedDiscountCurve(dates,discountFactor,Actual360())); 

Handle discountingTermStructure(oisCurve);
Handle forwardingTermStructure(forwardCurve);

Real nominal = 1000000.0;
Date previousResetDate(20,November,2012);
Date maturity(20,November,2022);
double spread = 0.02;
double fixedRate=0.04;

shared_ptr euribor(new Euribor(3*Months,forwardingTermStructure));
euribor->addFixing(euribor->fixingDate(previousResetDate),0.01,true);
		
VanillaSwap::Type swapType = VanillaSwap::Payer;

Schedule fixedSchedule(previousResetDate, maturity,1*Years,
                               TARGET(), ModifiedFollowing,ModifiedFollowing,
                               DateGeneration::Forward, false);

Schedule floatSchedule(previousResetDate,maturity,3*Months,
                               TARGET(),ModifiedFollowing ,ModifiedFollowing,
                               DateGeneration::Forward, false);
        
VanillaSwap swap(VanillaSwap::Payer, nominal,fixedSchedule, fixedRate, Thirty360(),
            floatSchedule, euribor, spread,Actual360());
     
shared_ptr swapEngine(new DiscountingSwapEngine(discountingTermStructure));

swap.setPricingEngine(swapEngine);
       
double res=swap.NPV();

}
Publicado en quantlib