Swap valution with eurodollar futures

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

Swap valution with eurodollar futures

ramjig
Hi
I am trying to replicate an example from Fabozzi's book. This is to  price a 3 year swap with fixed rate 4.98% and
         // deposits
        Rate d3mQuote=0.0405;
 
        // futures
        Real fut1Quote=95.85;
        Real fut2Quote=95.45;
        Real fut3Quote=95.28;
        Real fut4Quote=95.10;
        Real fut5Quote=94.97;
        Real fut6Quote=94.85;
        Real fut7Quote=94.75;
        Real fut8Quote=94.60;
        Real fut9Quote=94.50;
        Real fut10Quote=94.35;
        Real fut11Quote=94.24;
I followed the swap valuation example provided in Quantlib documentation (dep-future). But the value of the cash flows are different from Fabozzi's book. Coupon rates are also different from second quarter onwards.  For example quantlib computed cupon rate for 3rd quarter was 4.20 instead of 4.55 recorded in the book.
Any suggestions please?
Thanks
Ramji
 
 

------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev

_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Swap valution with eurodollar futures

Luigi Ballabio
On Mon, 2009-12-07 at 23:48 -0500, [hidden email] wrote:

> I am trying to replicate an example from Fabozzi's book. This is to
>  price a 3 year swap with fixed rate 4.98% and
>          // deposits
>         Rate d3mQuote=0.0405;
>  
>         // futures
>         Real fut1Quote=95.85;
>         Real fut2Quote=95.45;
>         Real fut3Quote=95.28;
>         Real fut4Quote=95.10;
>         Real fut5Quote=94.97;
>         Real fut6Quote=94.85;
>         Real fut7Quote=94.75;
>         Real fut8Quote=94.60;
>         Real fut9Quote=94.50;
>         Real fut10Quote=94.35;
>         Real fut11Quote=94.24;
> I followed the swap valuation example provided in Quantlib
> documentation (dep-future). But the value of the cash flows are
> different from Fabozzi's book. Coupon rates are also different from
> second quarter onwards.  For example quantlib computed cupon rate for
> 3rd quarter was 4.20 instead of 4.55 recorded in the book.

Do you have more details?  For instance, how do you extract coupon rates
from QuantLib? And what does Fabozzi do?

Luigi



--

Vin: It's like this fellow I knew in El Paso. One day, he just took
all his clothes off and jumped in a mess of cactus. I asked him that
same question, "Why?"
Calvera: And?
Vin: He said, "It seemed like a good idea at the time."
-- The Magnificent Seven



------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Swap valution with eurodollar futures

ramjig
Faboozi
 First column is Floating Cash flow at End of Quarter, and last column is PV
of cash flow.
Amount: 1012500-----Rate:0.0405----Days: 90 --- 1002351 (PV of Cash Flow)
Amount: 1049028-----Rate:0.0415----Days: 91 --- 1027732
Amount: 1162778-----Rate:0.0455----Days: 92 --- 1126079
Amount: 1206222-----Rate:0.0475----Days: 92 --- 1154229
Amount: 1225000-----Rate:0.0490----Days: 90 --- 1158012
Amount: 1271472-----Rate:0.0503----Days: 91 --- 1186852
Amount: 1316111-----Rate:0.0515----Days: 92 --- 1212562
Amount: 1341667-----Rate:0.0525----Days: 92 --- 1219742
Amount: 1350500-----Rate:0.0540----Days: 90 --- 1210970
Amount: 1390278-----Rate:0.0550----Days: 91 --- 1229999
Amount: 1443889-----Rate:0.0565----Days: 92 --- 1259248
Amount: 1472000-----Rate:0.0576----Days: 92 --- 1265140

Quantlib results:
Today: Thursday, December 30th, 2004
Settlement date: Saturday, January 1st, 2005
Amount: 1.01227e+006-----Rate: 0.0404909-----Days: 90
Amount: 1.03979e+006-----Rate: 0.0411346-----Days: 91
Amount: 1.07986e+006-----Rate: 0.0422554-----Days: 92
Amount: 1.16847e+006-----Rate: 0.0457227-----Days: 92
Amount: 1.18679e+006-----Rate: 0.0474715-----Days: 90
Amount: 1.24657e+006-----Rate: 0.0493149-----Days: 91
Amount: 1.28915e+006-----Rate: 0.0504450-----Days: 92
Amount: 1.31987e+006-----Rate: 0.0516471-----Days: 92
Amount: 1.31777e+006-----Rate: 0.0527107-----Days: 90
Amount: 1.36803e+006-----Rate: 0.0541197-----Days: 91
Amount: 1.41024e+006-----Rate: 0.0551835-----Days: 92
Amount: 1.44831e+006-----Rate: 0.0566731-----Days: 92

int main(int, char* []) {
    try {
        boost::timer timer;
        std::cout << std::endl;
        /*********************
         ***  MARKET DATA  ***
         *********************/

        Calendar calendar = TARGET();
        Date settlementDate(1, January, 2005);
  
        Integer fixingDays = 2;
        Date todaysDate = calendar.advance(settlementDate, -fixingDays, Days);
        // nothing to do with Date::todaysDate
        Settings::instance().evaluationDate() = todaysDate;

        todaysDate = Settings::instance().evaluationDate();
        std::cout << "Today: " << todaysDate.weekday()
                  << ", " << todaysDate << std::endl;
        std::cout << "Settlement date: " << settlementDate.weekday()
                  << ", " << settlementDate << std::endl;
        // deposits
        Rate d3mQuote=0.0405;
        // futures
        Real fut1Quote=95.85;
        Real fut2Quote=95.45;
        Real fut3Quote=95.28;
        Real fut4Quote=95.10;
        Real fut5Quote=94.97;
        Real fut6Quote=94.85;
        Real fut7Quote=94.75;
        Real fut8Quote=94.60;
 Real fut9Quote=94.50;
 Real fut10Quote=94.35;
 Real fut11Quote=94.24;

        // deposits
        boost::shared_ptr<Quote> d3mRate(new SimpleQuote(d3mQuote));
        // futures
        boost::shared_ptr<Quote> fut1Price(new SimpleQuote(fut1Quote));
        boost::shared_ptr<Quote> fut2Price(new SimpleQuote(fut2Quote));
        boost::shared_ptr<Quote> fut3Price(new SimpleQuote(fut3Quote));
        boost::shared_ptr<Quote> fut4Price(new SimpleQuote(fut4Quote));
        boost::shared_ptr<Quote> fut5Price(new SimpleQuote(fut5Quote));
        boost::shared_ptr<Quote> fut6Price(new SimpleQuote(fut6Quote));
        boost::shared_ptr<Quote> fut7Price(new SimpleQuote(fut7Quote));
        boost::shared_ptr<Quote> fut8Price(new SimpleQuote(fut8Quote));
 boost::shared_ptr<Quote> fut9Price(new SimpleQuote(fut9Quote));
        boost::shared_ptr<Quote> fut10Price(new SimpleQuote(fut10Quote));
 boost::shared_ptr<Quote> fut11Price(new SimpleQuote(fut11Quote));
        DayCounter depositDayCounter = Actual360();

        boost::shared_ptr<RateHelper> d3m(new DepositRateHelper(
            Handle<Quote>(d3mRate),
            3*Months, fixingDays,
            calendar, Unadjusted,
            true, depositDayCounter));
        // setup futures
        Integer futMonths = 3;
        Date imm = IMM::nextDate(settlementDate);
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut1(new FuturesRateHelper(
            Handle<Quote>(fut1Price),
            imm,
            futMonths, calendar, Unadjusted,
           true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut2(new FuturesRateHelper(
            Handle<Quote>(fut2Price),
            imm,
            futMonths, calendar, Unadjusted,
            true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut3(new FuturesRateHelper(
            Handle<Quote>(fut3Price),
            imm,
            futMonths, calendar, Unadjusted,
            true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut4(new FuturesRateHelper(
            Handle<Quote>(fut4Price),
            imm,
            futMonths, calendar, Unadjusted,
            true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut5(new FuturesRateHelper(
            Handle<Quote>(fut5Price),
            imm,
            futMonths, calendar, Unadjusted,
            true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut6(new FuturesRateHelper(
            Handle<Quote>(fut6Price),
            imm,
            futMonths, calendar, Unadjusted,
            true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut7(new FuturesRateHelper(
            Handle<Quote>(fut7Price),
            imm,
            futMonths, calendar, Unadjusted,
            true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut8(new FuturesRateHelper(
             Handle<Quote>(fut8Price),
             imm,
             futMonths, calendar, ModifiedFollowing,
             true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut9(new FuturesRateHelper(
             Handle<Quote>(fut9Price),
             imm,
             futMonths, calendar, ModifiedFollowing,
             true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut10(new FuturesRateHelper(
             Handle<Quote>(fut10Price),
             imm,
             futMonths, calendar, ModifiedFollowing,
             true, depositDayCounter));
        imm = IMM::nextDate(imm+1);
        boost::shared_ptr<RateHelper> fut11(new FuturesRateHelper(
             Handle<Quote>(fut11Price),
             imm,
             futMonths, calendar, ModifiedFollowing,
             true, depositDayCounter));
        DayCounter termStructureDayCounter = Actual360();
                
        double tolerance = 1.0e-15;

        // A depo-futures-swap curve
        std::vector<boost::shared_ptr<RateHelper> > depoFutSwapInstruments;
        depoFutSwapInstruments.push_back(d3m);
        depoFutSwapInstruments.push_back(fut1);
        depoFutSwapInstruments.push_back(fut2);
        depoFutSwapInstruments.push_back(fut3);
        depoFutSwapInstruments.push_back(fut4);
        depoFutSwapInstruments.push_back(fut5);
        depoFutSwapInstruments.push_back(fut6);
        depoFutSwapInstruments.push_back(fut7);
        depoFutSwapInstruments.push_back(fut8);
 depoFutSwapInstruments.push_back(fut9);
 depoFutSwapInstruments.push_back(fut10);
 depoFutSwapInstruments.push_back(fut11);
        boost::shared_ptr<YieldTermStructure> depoFutSwapTermStructure(
            new PiecewiseYieldCurve<Discount, Linear>(
                             settlementDate, depoFutSwapInstruments,
                             termStructureDayCounter,
                             std::vector<Handle<Quote> >(),
                             std::vector<Date>(),
                             tolerance));
        RelinkableHandle<YieldTermStructure> discountingTermStructure;
        RelinkableHandle<YieldTermStructure> forecastingTermStructure;

        // constant nominal 100,000,000 Euro
        Real nominal = 100000000.0;
        // fixed leg
        Frequency fixedLegFrequency = Quarterly;
        BusinessDayConvention fixedLegConvention = Unadjusted;
        BusinessDayConvention floatingLegConvention = Unadjusted;
        DayCounter fixedLegDayCounter = Thirty360(Thirty360::European);
        Rate fixedRate = 0.0498;
        DayCounter floatingLegDayCounter = Actual360();
        // floating leg
        Frequency floatingLegFrequency = Quarterly;
        boost::shared_ptr<IborIndex> euriborIndex(
                          new Euribor3M(forecastingTermStructure));
        Spread spread = 0.0;
        Integer lenghtInYears = 3;
        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 spot3YearSwap(swapType, nominal,
                    fixedSchedule, fixedRate, fixedLegDayCounter,
                    floatSchedule, euriborIndex, spread,
                    floatingLegDayCounter);

        boost::shared_ptr<PricingEngine> swapEngine(
                                 new DiscountingSwapEngine
(discountingTermStructure));
        spot3YearSwap.setPricingEngine(swapEngine);
        // Of course, you're not forced to really use different curves
        forecastingTermStructure.linkTo(depoFutSwapTermStructure);
        discountingTermStructure.linkTo(depoFutSwapTermStructure);
        const Leg& floatingCoupons = spot3YearSwap.floatingLeg();
        for (Size i = 0; i < floatingCoupons.size(); ++i){
             boost::shared_ptr<IborCoupon> coupon1 =
boost::dynamic_pointer_cast<IborCoupon>(floatingCoupons[i]);
        std::cout << "Amount: " << coupon1->amount();
        std::cout << "-----" << "Rate: " << coupon1->rate();
        std::cout << "-----" << "Days: " << coupon1->accrualDays() <<
std::endl;
       }
       return 0;
     } catch (std::exception& e) {
         std::cout << e.what() << std::endl;
         return 1;
     } catch (...) {
         std::cout << "unknown error" << std::endl;
          return 1;
     }
  }



 
-----Original Message-----
From: Luigi Ballabio <[hidden email]>
To: [hidden email]
Cc: [hidden email]
Sent: Wed, Dec 9, 2009 9:08 am
Subject: Re: [Quantlib-users] Swap valution with eurodollar futures

On Mon, 2009-12-07 at 23:48 -0500, [hidden email] wrote:
> I am trying to replicate an example from Fabozzi's book. This is to
>  price a 3 year swap with fixed rate 4.98% and 
>          // deposits
>         Rate d3mQuote=0.0405;
>  
>         // futures
>         Real fut1Quote=95.85;
>         Real fut2Quote=95.45;
>         Real fut3Quote=95.28;
>         Real fut4Quote=95.10;
>         Real fut5Quote=94.97;
>         Real fut6Quote=94.85;
>         Real fut7Quote=94.75;
>         Real fut8Quote=94.60;
>         Real fut9Quote=94.50;
>         Real fut10Quote=94.35;
>         Real fut11Quote=94.24;
> I followed the swap valuation example provided in Quantlib
> documentation (dep-future). But the value of the cash flows are
> different from Fabozzi's book. Coupon rates are also different from
> second quarter onwards.  For example quantlib computed cupon rate for
> 3rd quarter was 4.20 instead of 4.55 recorded in the book.

Do you have more details?  For instance, how do you extract coupon rates
from QuantLib? And what does Fabozzi do?

Luigi



-- 

Vin: It's like this fellow I knew in El Paso. One day, he just took 
all his clothes off and jumped in a mess of cactus. I asked him that 
same question, "Why?" 
Calvera: And? 
Vin: He said, "It seemed like a good idea at the time." 
-- The Magnificent Seven 



------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev

_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Swap valution with eurodollar futures

Ferdinando M. Ametrano-3
Hi Ramji

without going into further detailed examination, I wonder what is the
reference date you should work with: Settlement date: Saturday,
January 1st, 2005 is wrong for sure.
Do you really want to use TARGET calendar ? Is Fabozzi's example EUR or USD ?

If you're really into this example and need help you might consider
attaching a scan of the relevant Fabozzi pages...

ciao -- Nando

RSS feed: http://www.google.com/reader/shared/ferdinando.ametrano



On Thu, Dec 10, 2009 at 3:54 AM,  <[hidden email]> wrote:

> Faboozi
>  First column is Floating Cash flow at End of Quarter, and last column is PV
> of cash flow.
> Amount: 1012500-----Rate:0.0405----Days: 90 --- 1002351 (PV of Cash Flow)
> Amount: 1049028-----Rate:0.0415----Days: 91 --- 1027732
> Amount: 1162778-----Rate:0.0455----Days: 92 --- 1126079
> Amount: 1206222-----Rate:0.0475----Days: 92 --- 1154229
> Amount: 1225000-----Rate:0.0490----Days: 90 --- 1158012
> Amount: 1271472-----Rate:0.0503----Days: 91 --- 1186852
> Amount: 1316111-----Rate:0.0515----Days: 92 --- 1212562
> Amount: 1341667-----Rate:0.0525----Days: 92 --- 1219742
> Amount: 1350500-----Rate:0.0540----Days: 90 --- 1210970
> Amount: 1390278-----Rate:0.0550----Days: 91 --- 1229999
> Amount: 1443889-----Rate:0.0565----Days: 92 --- 1259248
> Amount: 1472000-----Rate:0.0576----Days: 92 --- 1265140
> Quantlib results:
> Today: Thursday, December 30th, 2004
> Settlement date: Saturday, January 1st, 2005
> Amount: 1.01227e+006-----Rate: 0.0404909-----Days: 90
> Amount: 1.03979e+006-----Rate: 0.0411346-----Days: 91
> Amount: 1.07986e+006-----Rate: 0.0422554-----Days: 92
> Amount: 1.16847e+006-----Rate: 0.0457227-----Days: 92
> Amount: 1.18679e+006-----Rate: 0.0474715-----Days: 90
> Amount: 1.24657e+006-----Rate: 0.0493149-----Days: 91
> Amount: 1.28915e+006-----Rate: 0.0504450-----Days: 92
> Amount: 1.31987e+006-----Rate: 0.0516471-----Days: 92
> Amount: 1.31777e+006-----Rate: 0.0527107-----Days: 90
> Amount: 1.36803e+006-----Rate: 0.0541197-----Days: 91
> Amount: 1.41024e+006-----Rate: 0.0551835-----Days: 92
> Amount: 1.44831e+006-----Rate: 0.0566731-----Days: 92
> int main(int, char* []) {
>     try {
>         boost::timer timer;
>         std::cout << std::endl;
>         /*********************
>          ***  MARKET DATA  ***
>          *********************/
>         Calendar calendar = TARGET();
>         Date settlementDate(1, January, 2005);
>
>         Integer fixingDays = 2;
>         Date todaysDate = calendar.advance(settlementDate, -fixingDays,
> Days);
>         // nothing to do with Date::todaysDate
>         Settings::instance().evaluationDate() = todaysDate;
>         todaysDate = Settings::instance().evaluationDate();
>         std::cout << "Today: " << todaysDate.weekday()
>                   << ", " << todaysDate << std::endl;
>         std::cout << "Settlement date: " << settlementDate.weekday()
>                   << ", " << settlementDate << std::endl;
>         // deposits
>         Rate d3mQuote=0.0405;
>         // futures
>         Real fut1Quote=95.85;
>         Real fut2Quote=95.45;
>         Real fut3Quote=95.28;
>         Real fut4Quote=95.10;
>         Real fut5Quote=94.97;
>         Real fut6Quote=94.85;
>         Real fut7Quote=94.75;
>         Real fut8Quote=94.60;
>  Real fut9Quote=94.50;
>  Real fut10Quote=94.35;
>  Real fut11Quote=94.24;
>         // deposits
>         boost::shared_ptr<Quote> d3mRate(new SimpleQuote(d3mQuote));
>         // futures
>         boost::shared_ptr<Quote> fut1Price(new SimpleQuote(fut1Quote));
>         boost::shared_ptr<Quote> fut2Price(new SimpleQuote(fut2Quote));
>         boost::shared_ptr<Quote> fut3Price(new SimpleQuote(fut3Quote));
>         boost::shared_ptr<Quote> fut4Price(new SimpleQuote(fut4Quote));
>         boost::shared_ptr<Quote> fut5Price(new SimpleQuote(fut5Quote));
>         boost::shared_ptr<Quote> fut6Price(new SimpleQuote(fut6Quote));
>         boost::shared_ptr<Quote> fut7Price(new SimpleQuote(fut7Quote));
>         boost::shared_ptr<Quote> fut8Price(new SimpleQuote(fut8Quote));
>  boost::shared_ptr<Quote> fut9Price(new SimpleQuote(fut9Quote));
>         boost::shared_ptr<Quote> fut10Price(new SimpleQuote(fut10Quote));
>  boost::shared_ptr<Quote> fut11Price(new SimpleQuote(fut11Quote));
>         DayCounter depositDayCounter = Actual360();
>         boost::shared_ptr<RateHelper> d3m(new DepositRateHelper(
>             Handle<Quote>(d3mRate),
>             3*Months, fixingDays,
>             calendar, Unadjusted,
>             true, depositDayCounter));
>         // setup futures
>         Integer futMonths = 3;
>         Date imm = IMM::nextDate(settlementDate);
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut1(new FuturesRateHelper(
>             Handle<Quote>(fut1Price),
>             imm,
>             futMonths, calendar, Unadjusted,
>            true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut2(new FuturesRateHelper(
>             Handle<Quote>(fut2Price),
>             imm,
>             futMonths, calendar, Unadjusted,
>             true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut3(new FuturesRateHelper(
>             Handle<Quote>(fut3Price),
>             imm,
>             futMonths, calendar, Unadjusted,
>             true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut4(new FuturesRateHelper(
>             Handle<Quote>(fut4Price),
>             imm,
>             futMonths, calendar, Unadjusted,
>             true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut5(new FuturesRateHelper(
>             Handle<Quote>(fut5Price),
>             imm,
>             futMonths, calendar, Unadjusted,
>             true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut6(new FuturesRateHelper(
>             Handle<Quote>(fut6Price),
>             imm,
>             futMonths, calendar, Unadjusted,
>             true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut7(new FuturesRateHelper(
>             Handle<Quote>(fut7Price),
>             imm,
>             futMonths, calendar, Unadjusted,
>             true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut8(new FuturesRateHelper(
>              Handle<Quote>(fut8Price),
>              imm,
>              futMonths, calendar, ModifiedFollowing,
>              true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut9(new FuturesRateHelper(
>              Handle<Quote>(fut9Price),
>              imm,
>              futMonths, calendar, ModifiedFollowing,
>              true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut10(new FuturesRateHelper(
>              Handle<Quote>(fut10Price),
>              imm,
>              futMonths, calendar, ModifiedFollowing,
>              true, depositDayCounter));
>         imm = IMM::nextDate(imm+1);
>         boost::shared_ptr<RateHelper> fut11(new FuturesRateHelper(
>              Handle<Quote>(fut11Price),
>              imm,
>              futMonths, calendar, ModifiedFollowing,
>              true, depositDayCounter));
>         DayCounter termStructureDayCounter = Actual360();
>
>         double tolerance = 1.0e-15;
>         // A depo-futures-swap curve
>         std::vector<boost::shared_ptr<RateHelper> > depoFutSwapInstruments;
>         depoFutSwapInstruments.push_back(d3m);
>         depoFutSwapInstruments.push_back(fut1);
>         depoFutSwapInstruments.push_back(fut2);
>         depoFutSwapInstruments.push_back(fut3);
>         depoFutSwapInstruments.push_back(fut4);
>         depoFutSwapInstruments.push_back(fut5);
>         depoFutSwapInstruments.push_back(fut6);
>         depoFutSwapInstruments.push_back(fut7);
>         depoFutSwapInstruments.push_back(fut8);
>  depoFutSwapInstruments.push_back(fut9);
>  depoFutSwapInstruments.push_back(fut10);
>  depoFutSwapInstruments.push_back(fut11);
>         boost::shared_ptr<YieldTermStructure> depoFutSwapTermStructure(
>             new PiecewiseYieldCurve<Discount, Linear>(
>                              settlementDate, depoFutSwapInstruments,
>                              termStructureDayCounter,
>                              std::vector<Handle<Quote> >(),
>                              std::vector<Date>(),
>                              tolerance));
>         RelinkableHandle<YieldTermStructure> discountingTermStructure;
>         RelinkableHandle<YieldTermStructure> forecastingTermStructure;
>         // constant nominal 100,000,000 Euro
>         Real nominal = 100000000.0;
>         // fixed leg
>         Frequency fixedLegFrequency = Quarterly;
>         BusinessDayConvention fixedLegConvention = Unadjusted;
>         BusinessDayConvention floatingLegConvention = Unadjusted;
>         DayCounter fixedLegDayCounter = Thirty360(Thirty360::European);
>         Rate fixedRate = 0.0498;
>         DayCounter floatingLegDayCounter = Actual360();
>         // floating leg
>         Frequency floatingLegFrequency = Quarterly;
>         boost::shared_ptr<IborIndex> euriborIndex(
>                           new Euribor3M(forecastingTermStructure));
>         Spread spread = 0.0;
>         Integer lenghtInYears = 3;
>         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 spot3YearSwap(swapType, nominal,
>                     fixedSchedule, fixedRate, fixedLegDayCounter,
>                     floatSchedule, euriborIndex, spread,
>                     floatingLegDayCounter);
>         boost::shared_ptr<PricingEngine> swapEngine(
>                                  new DiscountingSwapEngine
> (discountingTermStructure));
>         spot3YearSwap.setPricingEngine(swapEngine);
>         // Of course, you're not forced to really use different curves
>         forecastingTermStructure.linkTo(depoFutSwapTermStructure);
>         discountingTermStructure.linkTo(depoFutSwapTermStructure);
>         const Leg& floatingCoupons = spot3YearSwap.floatingLeg();
>         for (Size i = 0; i < floatingCoupons.size(); ++i){
>              boost::shared_ptr<IborCoupon> coupon1 =
> boost::dynamic_pointer_cast<IborCoupon>(floatingCoupons[i]);
>         std::cout << "Amount: " << coupon1->amount();
>         std::cout << "-----" << "Rate: " << coupon1->rate();
>         std::cout << "-----" << "Days: " << coupon1->accrualDays() <<
> std::endl;
>        }
>        return 0;
>      } catch (std::exception& e) {
>          std::cout << e.what() << std::endl;
>          return 1;
>      } catch (...) {
>          std::cout << "unknown error" << std::endl;
>           return 1;
>      }
>   }
>
>
>
> -----Original Message-----
> From: Luigi Ballabio <[hidden email]>
> To: [hidden email]
> Cc: [hidden email]
> Sent: Wed, Dec 9, 2009 9:08 am
> Subject: Re: [Quantlib-users] Swap valution with eurodollar futures
>
> On Mon, 2009-12-07 at 23:48 -0500, [hidden email] wrote:
>> I am trying to replicate an example from Fabozzi's book. This is to
>>  price a 3 year swap with fixed rate 4.98% and
>>          // deposits
>>         Rate d3mQuote=0.0405;
>>
>>         // futures
>>         Real fut1Quote=95.85;
>>         Real fut2Quote=95.45;
>>         Real fut3Quote=95.28;
>>         Real fut4Quote=95.10;
>>         Real fut5Quote=94.97;
>>         Real fut6Quote=94.85;
>>         Real fut7Quote=94.75;
>>         Real fut8Quote=94.60;
>>         Real fut9Quote=94.50;
>>         Real fut10Quote=94.35;
>>         Real fut11Quote=94.24;
>> I followed the swap valuation example provided in Quantlib
>> documentation (dep-future). But the value of the cash flows are
>> different from Fabozzi's book. Coupon rates are also different from
>> second quarter onwards.  For example quantlib computed cupon rate for
>> 3rd quarter was 4.20 instead of 4.55 recorded in the book.
>
> Do you have more details?  For instance, how do you extract coupon rates
> from QuantLib? And what does Fabozzi do?
>
> Luigi
>
>
>
> --
>
> Vin: It's like this fellow I knew in El Paso. One day, he just took
> all his clothes off and jumped in a mess of cactus. I asked him that
> same question, "Why?"
> Calvera: And?
> Vin: He said, "It seemed like a good idea at the time."
> -- The Magnificent Seven
>
>
>
> ------------------------------------------------------------------------------
> Return on Information:
> Google Enterprise Search pays you back
> Get the facts.
> http://p.sf.net/sfu/google-dev2dev
>
> _______________________________________________
> QuantLib-users mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/quantlib-users
>
>

------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Swap valution with eurodollar futures

Luigi Ballabio
In reply to this post by ramjig
On Wed, 2009-12-09 at 21:54 -0500, [hidden email] wrote:
> Faboozi
>  First column is Floating Cash flow at End of Quarter, and last column
> is PV
> of cash flow.

How does Fabozzi calculate the above?

Luigi


--

Grabel's Law:
2 is not equal to 3 -- not even for large values of 2.



------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Swap valution with eurodollar futures

ramjig
Luigi Ballabio <luigi.ballabio <at> gmail.com> writes:

>
> On Wed, 2009-12-09 at 21:54 -0500, ramjig <at> mail.com wrote:
> > Faboozi
> >  First column is Floating Cash flow at End of Quarter, and last column
> > is PV
> > of cash flow.
>
> How does Fabozzi calculate the above?
>
> Luigi
>


I sent scaned pages from Faboozi book. I believe admin has to approval to post
it to the list.

Thanks
Ramji



------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Swap valuation with eurodollar futures

ramjig
In reply to this post by Luigi Ballabio
Faboozi calculated casflows as follows.
 
Futures rate = 100 -Eurodollar Future Price. (In the following table second column represents futures rate).
 
Cash flow = notional amount  * futures rate * ( days in period / 360). The first column represents cash flow per each quarter.
 
period forward rate = annual forward rate * (days in period / 360)
 
forward discount factor of period 1  = 1 /  (1 + (period forward rate of 1 /100) )
 
In general
     forward discount factor of period t = 1  / (  (1 + (period forward rate of 1 /100) ) * (1 + (period forward rate of 2 /100) ) * .... * (1 + (period forward rate of t /100) )  )
 
PV of Cash flow of period t =  Cash flow of period t *  forward discount factor of period t.
 Last column in the followig table was calculated using the above formula.
 
 
Amount: 1012500-----Rate:0.0405----Days: 90 --- 1002351 (PV of Cash Flow)
Amount: 1049028-----Rate:0.0415----Days: 91 --- 1027732
Amount: 1162778-----Rate:0.0455----Days: 92 --- 1126079
Amount: 1206222-----Rate:0.0475----Days: 92 --- 1154229
Amount: 1225000-----Rate:0.0490----Days: 90 --- 1158012
Amount: 1271472-----Rate:0.0503----Days: 91 --- 1186852
Amount: 1316111-----Rate:0.0515----Days: 92 --- 1212562
Amount: 1341667-----Rate:0.0525----Days: 92 --- 1219742
Amount: 1350500-----Rate:0.0540----Days: 90 --- 1210970
Amount: 1390278-----Rate:0.0550----Days: 91 --- 1229999
Amount: 1443889-----Rate:0.0565----Days: 92 --- 1259248
Amount: 1472000-----Rate:0.0576----Days: 92 --- 1265140
 

Thanks
Ramji

-----Original Message-----
From: Luigi Ballabio <[hidden email]>
To: [hidden email]
Cc: [hidden email]
Sent: Thu, Dec 10, 2009 4:10 am
Subject: Re: [Quantlib-users] Swap valution with eurodollar futures

On Wed, 2009-12-09 at 21:54 -0500, [hidden email] wrote:
> Faboozi
>  First column is Floating Cash flow at End of Quarter, and last column
> is PV 
> of cash flow.

How does Fabozzi calculate the above?

Luigi


-- 

Grabel's Law: 
2 is not equal to 3 -- not even for large values of 2. 



------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev

_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Reply | Threaded
Open this post in threaded view
|

SwaptionVolCube2

Yan Kuang
In reply to this post by ramjig

Hi All,

Just about one year inaction. I am back to try quantlib again. I am still using 0.9.7.

I am doing a test on CMS replication. I use SwaptionVolCube2 to get black vol at different strikes. The market data
for swaption is skew (vol drops when strike increase), see row 82 in Sheet 'Swaption Vol Market Data'.

ATM swap rate is about 6.14%, yet I get the higher vol than atm vol when strikes above 6.14, see column E and F in sheet 'cms rep'.

Enclosed please the workbook and relevant code.

Many thanks for the help,

Yan


PS, has anyone has luck to build a cash-future-swap curve which match Murex reasonable well? By that I mean forward simple
rate difference is with 1bp. I don't have the luck, as some section of the curve has more than 10bp difference in my experience.


Unless otherwise stated, this email is confidential. If received in error, please delete and inform the sender by return email. Unauthorised use, copying or distribution is prohibited. Westpac Banking Corporation (ABN 33 007 457 141) is not responsible for viruses, or for delays, errors or interception in transmission. Unless stated or apparent from its terms, any opinion is not the opinion of Westpac Banking Corporation. This message also includes information on Westpac Institutional Bank available at westpac.com.au/wibinfo

------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:

Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users

code.cpp (6K) Download Attachment
swaption_vol_report.xls (78K) Download Attachment