strange output from zeroRate() ?

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

strange output from zeroRate() ?

Venkatesh Rao

Hi, the zeroRate() function (applied to YieldTermStructure object) appears to be returning zero rates that are too large.  To illustrate, I constructed a simple example based largely on code snippets from /testsuite/piecewiseyieldcurve.cpp.  In brief:

 

* Input  a flat term structure of  deposit + swap rates of 5.0% out to 30 years.

 

    Datum depositData[] = { { 1, Weeks,  5.0 }};

    Datum swapData[] = {

        {  1, Years, 5.0 }, {  2, Years, 5.0 },  {  3, Years, 5.0 },

        ....         { 30, Years, 5.0 }     };

 

* Very minor changes to settings in CommonVars, to construction of "rates" and "instruments" vectors  [adpated to USDLibor rather than Euribor---conclusions are unaffected by that switch]. 

 -> all the info from this stage goes into "vars".

 

*   PiecewiseYieldCurve set up as follows:

    template <class T, class I, template<class C> class B>

    CommonVars CurveMake(CommonVars& vars,

           const I& interpolator = I(),  Real tolerance = 1.0e-9) {

 

        vars.termStructure = boost::shared_ptr<YieldTermStructure>(new

            PiecewiseYieldCurve<T,I,B>(vars.settlement, vars.instruments,

                                       Actual360(), interpolator));

     ...etc....

 

*  Called CurveMake as follows (from main):

     CommonVars varsOut =

      CurveMake<ZeroYield,Linear,IterativeBootstrap>(vars);

 

*  Retrieve  curve info via:

     boost::shared_ptr<YieldTermStructure> yc=  varsOut.termStructure;

 

* For output, set up  vector of target dates (rTdates), and called zeroRate() and discount(); & computed implied zero from discount() as follows:

 

     d0=varsOut.settlement;

     for (Size i=0; i<rtDates.size(); i++) {

         Real rx, df;     dx=rtDates[i];

         rx = Rate(yc->zeroRate(dx,dc, Simple, Annual, true));

         df = yc->discount(dx, true);

         Real zeroFromDf= -log(df)/((dx-d0)/365.);

         wtfil2 <<  std::setw(7) <<std::setprecision(2) << (dx-d0)/365.

                << std::setw(10) <<  std::setprecision(4) << rx

                <<std::setw(10) <<  std::setprecision(6) << df

                << std::setw(10) << std::setprecision(4) <<  zeroFromDf

                <<std::endl;

     }

 

*  OUTPUT:

 

[DayCounter= Actual/Actual (ISDA]

 

                                                         Implied

                                                        Zero rate from

t (Yrs)  zeroRate()  discount()  discount()

    0.5       0.0507  0.975209     0.05007

      1      0.05069  0.951751     0.04945

      2        0.052  0.905711     0.04945

      5      0.05614  0.780837     0.04945

     10      0.06402  0.609626     0.04945

     20      0.08447  0.371827     0.04943

     30       0.1138  0.226552     0.04946

     35       0.1331  0.176776     0.04948

********************************************

 

So,  the implied zero from discount() is close to (but not dead on) the expected 5.0%, but the zeroRate() seems to drift away considerably.  Similar patterns are observed after toggling various settings and parameters (e.g., DayCounters, call CurveMake with Discount instead of ZeroYield, etc.)

 

Am I doing something wrong or misunderstanding what zeroRate() is supposed to be returning?

Any help appreciated.   Thanks

 

P.C. Venkatesh 
Stress Testing
Division of Banking Supervision & Regulation
Board of Governors of the Federal Reserve System
vox: 202 452 3847
email: [hidden email]


 


------------------------------------------------------------------------------

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

Re: strange output from zeroRate() ?

Smith, Dale (Norcross)

Hi,

 

It would help if you could post a working program. I am also interested in understanding this as well.

 

Thanks,

Dale Smith, Ph.D.

Senior Financial Quantitative Analyst

Financial & Risk Management Solutions

Fiserv

Office: 678-375-5315

www.fiserv.com

 

From: Venkatesh Rao [mailto:[hidden email]]
Sent: Friday, April 04, 2014 8:30 AM
To: [hidden email]
Cc: Venkatesh Rao
Subject: [Quantlib-users] strange output from zeroRate() ?

 

Hi, the zeroRate() function (applied to YieldTermStructure object) appears to be returning zero rates that are too large.  To illustrate, I constructed a simple example based largely on code snippets from /testsuite/piecewiseyieldcurve.cpp.  In brief:

 

* Input  a flat term structure of  deposit + swap rates of 5.0% out to 30 years.

 

    Datum depositData[] = { { 1, Weeks,  5.0 }};

    Datum swapData[] = {

        {  1, Years, 5.0 }, {  2, Years, 5.0 },  {  3, Years, 5.0 },

        ....         { 30, Years, 5.0 }     };

 

* Very minor changes to settings in CommonVars, to construction of "rates" and "instruments" vectors  [adpated to USDLibor rather than Euribor---conclusions are unaffected by that switch]. 

 -> all the info from this stage goes into "vars".

 

*   PiecewiseYieldCurve set up as follows:

    template <class T, class I, template<class C> class B>

    CommonVars CurveMake(CommonVars& vars,

           const I& interpolator = I(),  Real tolerance = 1.0e-9) {

 

        vars.termStructure = boost::shared_ptr<YieldTermStructure>(new

            PiecewiseYieldCurve<T,I,B>(vars.settlement, vars.instruments,

                                       Actual360(), interpolator));

     ...etc....

 

*  Called CurveMake as follows (from main):

     CommonVars varsOut =

      CurveMake<ZeroYield,Linear,IterativeBootstrap>(vars);

 

*  Retrieve  curve info via:

     boost::shared_ptr<YieldTermStructure> yc=  varsOut.termStructure;

 

* For output, set up  vector of target dates (rTdates), and called zeroRate() and discount(); & computed implied zero from discount() as follows:

 

     d0=varsOut.settlement;

     for (Size i=0; i<rtDates.size(); i++) {

         Real rx, df;     dx=rtDates[i];

         rx = Rate(yc->zeroRate(dx,dc, Simple, Annual, true));

         df = yc->discount(dx, true);

         Real zeroFromDf= -log(df)/((dx-d0)/365.);

         wtfil2 <<  std::setw(7) <<std::setprecision(2) << (dx-d0)/365.

                << std::setw(10) <<  std::setprecision(4) << rx

                <<std::setw(10) <<  std::setprecision(6) << df

                << std::setw(10) << std::setprecision(4) <<  zeroFromDf

                <<std::endl;

     }

 

*  OUTPUT:

 

[DayCounter= Actual/Actual (ISDA]

 

                                                         Implied

                                                        Zero rate from

t (Yrs)  zeroRate()  discount()  discount()

    0.5       0.0507  0.975209     0.05007

      1      0.05069  0.951751     0.04945

      2        0.052  0.905711     0.04945

      5      0.05614  0.780837     0.04945

     10      0.06402  0.609626     0.04945

     20      0.08447  0.371827     0.04943

     30       0.1138  0.226552     0.04946

     35       0.1331  0.176776     0.04948

********************************************

 

So,  the implied zero from discount() is close to (but not dead on) the expected 5.0%, but the zeroRate() seems to drift away considerably.  Similar patterns are observed after toggling various settings and parameters (e.g., DayCounters, call CurveMake with Discount instead of ZeroYield, etc.)

 

Am I doing something wrong or misunderstanding what zeroRate() is supposed to be returning?

Any help appreciated.   Thanks

 

P.C. Venkatesh 
Stress Testing
Division of Banking Supervision & Regulation
Board of Governors of the Federal Reserve System
vox: 202 452 3847
email: [hidden email]


 


------------------------------------------------------------------------------

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

Re: strange output from zeroRate() ?

Luigi Ballabio

Hello,
    you're asking for zero rates with Simple compounding, that is, df = 1/(1+rT). Use Continuous instead.

Luigi

On Apr 4, 2014 3:00 PM, "Smith, Dale (Norcross)" <[hidden email]> wrote:

Hi,

 

It would help if you could post a working program. I am also interested in understanding this as well.

 

Thanks,

Dale Smith, Ph.D.

Senior Financial Quantitative Analyst

Financial & Risk Management Solutions

Fiserv

Office: 678-375-5315

www.fiserv.com

 

From: Venkatesh Rao [mailto:[hidden email]]
Sent: Friday, April 04, 2014 8:30 AM
To: [hidden email]
Cc: Venkatesh Rao
Subject: [Quantlib-users] strange output from zeroRate() ?

 

Hi, the zeroRate() function (applied to YieldTermStructure object) appears to be returning zero rates that are too large.  To illustrate, I constructed a simple example based largely on code snippets from /testsuite/piecewiseyieldcurve.cpp.  In brief:

 

* Input  a flat term structure of  deposit + swap rates of 5.0% out to 30 years.

 

    Datum depositData[] = { { 1, Weeks,  5.0 }};

    Datum swapData[] = {

        {  1, Years, 5.0 }, {  2, Years, 5.0 },  {  3, Years, 5.0 },

        ....         { 30, Years, 5.0 }     };

 

* Very minor changes to settings in CommonVars, to construction of "rates" and "instruments" vectors  [adpated to USDLibor rather than Euribor---conclusions are unaffected by that switch]. 

 -> all the info from this stage goes into "vars".

 

*   PiecewiseYieldCurve set up as follows:

    template <class T, class I, template<class C> class B>

    CommonVars CurveMake(CommonVars& vars,

           const I& interpolator = I(),  Real tolerance = 1.0e-9) {

 

        vars.termStructure = boost::shared_ptr<YieldTermStructure>(new

            PiecewiseYieldCurve<T,I,B>(vars.settlement, vars.instruments,

                                       Actual360(), interpolator));

     ...etc....

 

*  Called CurveMake as follows (from main):

     CommonVars varsOut =

      CurveMake<ZeroYield,Linear,IterativeBootstrap>(vars);

 

*  Retrieve  curve info via:

     boost::shared_ptr<YieldTermStructure> yc=  varsOut.termStructure;

 

* For output, set up  vector of target dates (rTdates), and called zeroRate() and discount(); & computed implied zero from discount() as follows:

 

     d0=varsOut.settlement;

     for (Size i=0; i<rtDates.size(); i++) {

         Real rx, df;     dx=rtDates[i];

         rx = Rate(yc->zeroRate(dx,dc, Simple, Annual, true));

         df = yc->discount(dx, true);

         Real zeroFromDf= -log(df)/((dx-d0)/365.);

         wtfil2 <<  std::setw(7) <<std::setprecision(2) << (dx-d0)/365.

                << std::setw(10) <<  std::setprecision(4) << rx

                <<std::setw(10) <<  std::setprecision(6) << df

                << std::setw(10) << std::setprecision(4) <<  zeroFromDf

                <<std::endl;

     }

 

*  OUTPUT:

 

[DayCounter= Actual/Actual (ISDA]

 

                                                         Implied

                                                        Zero rate from

t (Yrs)  zeroRate()  discount()  discount()

    0.5       0.0507  0.975209     0.05007

      1      0.05069  0.951751     0.04945

      2        0.052  0.905711     0.04945

      5      0.05614  0.780837     0.04945

     10      0.06402  0.609626     0.04945

     20      0.08447  0.371827     0.04943

     30       0.1138  0.226552     0.04946

     35       0.1331  0.176776     0.04948

********************************************

 

So,  the implied zero from discount() is close to (but not dead on) the expected 5.0%, but the zeroRate() seems to drift away considerably.  Similar patterns are observed after toggling various settings and parameters (e.g., DayCounters, call CurveMake with Discount instead of ZeroYield, etc.)

 

Am I doing something wrong or misunderstanding what zeroRate() is supposed to be returning?

Any help appreciated.   Thanks

 

P.C. Venkatesh 
Stress Testing
Division of Banking Supervision & Regulation
Board of Governors of the Federal Reserve System
vox: 202 452 3847
email: [hidden email]


 


------------------------------------------------------------------------------

_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users


------------------------------------------------------------------------------

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

Re: strange output from zeroRate() ?

Venkatesh Rao

Ah yes.  Thought I’d toggled that too but apparently not.   Here’re the revised #’s, which are looking  MUCH BETTER J  was going down the non-obvious rabbit holes!!  Much obliged

 

[Changed rx to; rx = Rate(yc->zeroRate(dx,dc, Continuous, Annual, true));]

                                          

                                                        Implied         

                                                       zero from

t (Yrs)  zeroRate()  discount()  discount()

    0.5   0.05007     0.975209   0.05007

      1   0.04945     0.951751   0.04945

      2   0.04947     0.905711   0.04945

      5   0.04948     0.780837   0.04945

     10   0.04948     0.609626   0.04945

     20   0.04947     0.371827   0.04943

     30   0.04949     0.226552   0.04946

     35   0.04951     0.176776   0.04948

********************************************

 

From: Luigi Ballabio [mailto:[hidden email]]
Sent: Friday, April 04, 2014 9:55 AM
To: Smith, Dale (Norcross)
Cc: QuantLib users; Venkatesh Rao
Subject: Re: [Quantlib-users] strange output from zeroRate() ?

 

Hello,
    you're asking for zero rates with Simple compounding, that is, df = 1/(1+rT). Use Continuous instead.

Luigi

On Apr 4, 2014 3:00 PM, "Smith, Dale (Norcross)" <[hidden email]> wrote:

Hi,

 

It would help if you could post a working program. I am also interested in understanding this as well.

 

Thanks,

Dale Smith, Ph.D.

Senior Financial Quantitative Analyst

Financial & Risk Management Solutions

Fiserv

Office: 678-375-5315

www.fiserv.com

 

From: Venkatesh Rao [mailto:[hidden email]]
Sent: Friday, April 04, 2014 8:30 AM
To: [hidden email]
Cc: Venkatesh Rao
Subject: [Quantlib-users] strange output from zeroRate() ?

 

Hi, the zeroRate() function (applied to YieldTermStructure object) appears to be returning zero rates that are too large.  To illustrate, I constructed a simple example based largely on code snippets from /testsuite/piecewiseyieldcurve.cpp.  In brief:

 

* Input  a flat term structure of  deposit + swap rates of 5.0% out to 30 years.

 

    Datum depositData[] = { { 1, Weeks,  5.0 }};

    Datum swapData[] = {

        {  1, Years, 5.0 }, {  2, Years, 5.0 },  {  3, Years, 5.0 },

        ....         { 30, Years, 5.0 }     };

 

* Very minor changes to settings in CommonVars, to construction of "rates" and "instruments" vectors  [adpated to USDLibor rather than Euribor---conclusions are unaffected by that switch]. 

 -> all the info from this stage goes into "vars".

 

*   PiecewiseYieldCurve set up as follows:

    template <class T, class I, template<class C> class B>

    CommonVars CurveMake(CommonVars& vars,

           const I& interpolator = I(),  Real tolerance = 1.0e-9) {

 

        vars.termStructure = boost::shared_ptr<YieldTermStructure>(new

            PiecewiseYieldCurve<T,I,B>(vars.settlement, vars.instruments,

                                       Actual360(), interpolator));

     ...etc....

 

*  Called CurveMake as follows (from main):

     CommonVars varsOut =

      CurveMake<ZeroYield,Linear,IterativeBootstrap>(vars);

 

*  Retrieve  curve info via:

     boost::shared_ptr<YieldTermStructure> yc=  varsOut.termStructure;

 

* For output, set up  vector of target dates (rTdates), and called zeroRate() and discount(); & computed implied zero from discount() as follows:

 

     d0=varsOut.settlement;

     for (Size i=0; i<rtDates.size(); i++) {

         Real rx, df;     dx=rtDates[i];

         rx = Rate(yc->zeroRate(dx,dc, Simple, Annual, true));

         df = yc->discount(dx, true);

         Real zeroFromDf= -log(df)/((dx-d0)/365.);

         wtfil2 <<  std::setw(7) <<std::setprecision(2) << (dx-d0)/365.

                << std::setw(10) <<  std::setprecision(4) << rx

                <<std::setw(10) <<  std::setprecision(6) << df

                << std::setw(10) << std::setprecision(4) <<  zeroFromDf

                <<std::endl;

     }

 

*  OUTPUT:

 

[DayCounter= Actual/Actual (ISDA]

 

                                                         Implied

                                                        Zero rate from

t (Yrs)  zeroRate()  discount()  discount()

    0.5       0.0507  0.975209     0.05007

      1      0.05069  0.951751     0.04945

      2        0.052  0.905711     0.04945

      5      0.05614  0.780837     0.04945

     10      0.06402  0.609626     0.04945

     20      0.08447  0.371827     0.04943

     30       0.1138  0.226552     0.04946

     35       0.1331  0.176776     0.04948

********************************************

 

So,  the implied zero from discount() is close to (but not dead on) the expected 5.0%, but the zeroRate() seems to drift away considerably.  Similar patterns are observed after toggling various settings and parameters (e.g., DayCounters, call CurveMake with Discount instead of ZeroYield, etc.)

 

Am I doing something wrong or misunderstanding what zeroRate() is supposed to be returning?

Any help appreciated.   Thanks

 

P.C. Venkatesh 
Stress Testing
Division of Banking Supervision & Regulation
Board of Governors of the Federal Reserve System
vox: 202 452 3847
email: [hidden email]


 


------------------------------------------------------------------------------

_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users


------------------------------------------------------------------------------

_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users