Login  Register

Pricing a vanilla swap with a given zero curve instead of boostrapping

Posted by semiparametric on Feb 19, 2014; 12:59am
URL: http://quantlib.414.s1.nabble.com/Pricing-a-vanilla-swap-with-a-given-zero-curve-instead-of-boostrapping-tp14987.html

Dear All:

I am a newbie to quantlib. I run below code to price a vanilla swap with a given zero curve. The code can be complied smoothly in VS2010, however, when I tried to run the programme, something went wrong, and the NPV couldn't be generated. Could anyone give me a hint on how to revise the code? Thanks in advance.


#include <fstream>
#include <vector>
#include <ql/quantlib.hpp>

using namespace QuantLib;

#if defined(QL_ENABLE_SESSIONS)
namespace QuantLib {

    Integer sessionId() { return 0; }

}
#endif

int main(int, char*[])

{       /////////////////////////////////// Settings  ///////////////////////////////

        Calendar calendar = TARGET();
        Date settlementDate(15, October, 2013);
        // must be a business day
        settlementDate = calendar.adjust(settlementDate);

        Integer fixingDays = 0;
        Date todaysDate = calendar.advance(settlementDate, -fixingDays, Days);
        // nothing to do with Date::todaysDate
        Settings::instance().evaluationDate() = todaysDate;
 

        // LIBOR Curve

        std::vector<Date> dates;                                    std::vector<Rate> rates;
        dates.push_back(settlementDate);                            rates.push_back(0.26/100.0);
        dates.push_back(calendar.advance(settlementDate,3,Months)); rates.push_back(0.26/100.0);
        dates.push_back(calendar.advance(settlementDate,6,Months)); rates.push_back(0.412/100.0);
                dates.push_back(calendar.advance(settlementDate,9,Months)); rates.push_back(0.572/100.0);
        dates.push_back(calendar.advance(settlementDate,1,Years)); rates.push_back(0.735/100.0);
        dates.push_back(calendar.advance(settlementDate,2,Years)); rates.push_back(0.715/100.0);
        dates.push_back(calendar.advance(settlementDate,3,Years)); rates.push_back(1.173/100.0);
        dates.push_back(calendar.advance(settlementDate,4,Years)); rates.push_back(1.621/100.0);
        dates.push_back(calendar.advance(settlementDate,5,Years)); rates.push_back(2.027/100.0);
        dates.push_back(calendar.advance(settlementDate,6,Years)); rates.push_back(2.372/100.0);
        dates.push_back(calendar.advance(settlementDate,7,Years)); rates.push_back(2.654/100.0);
        dates.push_back(calendar.advance(settlementDate,8,Years)); rates.push_back(2.884/100.0);
        dates.push_back(calendar.advance(settlementDate,9,Years)); rates.push_back(3.072/100.0);
        dates.push_back(calendar.advance(settlementDate,10,Years)); rates.push_back(3.227/100.0);

                //daycounter for the curve inputed.
            DayCounter dayCounter = Actual360();
        boost::shared_ptr<YieldTermStructure> LiborCurvePtr(
                new InterpolatedZeroCurve<LogLinear>(dates, rates, dayCounter));
               
               
                Handle<YieldTermStructure> liborTS(LiborCurvePtr);
        boost::shared_ptr<IborIndex> index(
                                                       new USDLibor(Period(3, Months), liborTS));
                       
        /*********************
        * SWAPS TO BE PRICED *
        **********************/

        // constant nominal 1,000,000 Euro
        Real nominal = 1000000.0;
        // fixed leg
        Frequency fixedLegFrequency =Quarterly;
        BusinessDayConvention fixedLegConvention = Unadjusted;
        BusinessDayConvention floatingLegConvention = ModifiedFollowing;
        DayCounter fixedLegDayCounter = Thirty360(Thirty360::European);
        Rate fixedRate = 0.04;
        DayCounter floatingLegDayCounter = Actual360();

        // floating leg
        Frequency floatingLegFrequency = Quarterly;
        Spread spread = 0.0;

        Integer lenghtInYears = 5;
        VanillaSwap::Type swapType = VanillaSwap::Payer;

        Date maturity = settlementDate + lenghtInYears*Years;
        Schedule fixedSchedule(settlementDate, maturity,
                               Period(fixedLegFrequency),
                               calendar, fixedLegConvention,
                               fixedLegConvention,
                               DateGeneration::Forward,false);
        Schedule floatSchedule(settlementDate, maturity,
                               Period(floatingLegFrequency),
                               calendar, floatingLegConvention,
                               floatingLegConvention,
                               DateGeneration::Forward,false);
                VanillaSwap spot5YearSwap(swapType, nominal,
            fixedSchedule, fixedRate, fixedLegDayCounter,
            floatSchedule, index, spread,
            floatingLegDayCounter);

             spot5YearSwap.setPricingEngine(boost::shared_ptr<PricingEngine>(
                                                         new DiscountingSwapEngine(liborTS,false,settlementDate,settlementDate)));
                 /***************
        * SWAP PRICING *
        ****************/

        // utilities for reporting
        std::vector<std::string> headers(4);
        headers[0] = "term structure";
        headers[1] = "net present value";
        headers[2] = "fair spread";
        headers[3] = "fair fixed rate";
        std::string separator = " | ";
        Size width = headers[0].size() + separator.size()
                   + headers[1].size() + separator.size()
                   + headers[2].size() + separator.size()
                   + headers[3].size() + separator.size() - 1;
        std::string rule(width, '-'), dblrule(width, '=');
        std::string tab(8, ' ');

        Real NPV;
        Rate fairRate;
        Spread fairSpread;
               
        NPV = spot5YearSwap.NPV();
        fairSpread = spot5YearSwap.fairSpread();
        fairRate = spot5YearSwap.fairRate();

        std::cout << std::setw(headers[0].size())
                  << "Spot-swap" << separator;
        std::cout << std::setw(headers[1].size())
                  << std::fixed << std::setprecision(2) << NPV << separator;
        std::cout << std::setw(headers[2].size())
                  << io::rate(fairSpread) << separator;
        std::cout << std::setw(headers[3].size())
                  << io::rate(fairRate) << separator;
        std::cout << std::endl;

                 std::cin.get();

 return 0;
 
}