> Hi, I am new to QuantLib. I am trying to build Treasury Curve using
> piecewiseYieldCurve by using T-Bills, T-Notes, and T-Bond. I am pretty much
> copied the code from bonds.cpp. It doesn't give the error with T-Bills
plus
> 2 yr and 3yr term T-Notes. But once adding longer term T-Note or T-Bond, it
> gives error at line 202 of solver1d.hpp:
> QL_REQUIRE(fxMin_*fxMax_ < 0.0,
> "root not bracketed: f["
> << xMin_ << "," << xMax_ << "] -> ["
> << std::scientific
> << fxMin_ << "," << fxMax_ << "]");
>
> Here is the code:
> int main(int, char* []) {
> try{
> boost::timer timer;
>
std::cout << std::endl;
>
> Calendar calendar = UnitedStates(UnitedStates::GovernmentBond);;
> Date settlementDate(6, April, 2013);
> cout << "Is BD:" << calendar.isBusinessDay( settlementDate ) << std::endl
> ;
> cout << "Is Holiday :" << calendar.isHoliday( settlementDate ) <<
> std::endl ;
> cout << "Is Weekend :" << calendar.isWeekend( Saturday ) << std::endl;
> cout << "Is Last BD :" << calendar.isEndOfMonth( settlementDate) <<
> std::endl;
>
>
settlementDate = calendar.adjust(settlementDate);
>
> Integer fixingDays = 1;
> Natural settlementDays = 1;
>
> Date todaysDate = calendar.advance(settlementDate, -fixingDays,
> Days);
> // nothing to do with Date::todaysDate
> Settings::instance().evaluationDate() = todaysDate;
>
> std::cout << "Today: " << todaysDate.weekday()
> << ", " << todaysDate << std::endl;
>
> std::cout << "Settlement date: " << settlementDate.weekday()
> << ", " << settlementDate << std::endl;
>
>
// ZC rates for the short end
> // use the quote in wsj:
>
http://online.wsj.com/mdc/public/page/2_3020-treasury.html#treasuryB> Rate TB4WKsQuote=0.045;
> Rate TB13WKsQuote=0.065;
> Rate TB26WKSQuote=0.095;
> Rate TB52WKSQuote=0.130;
>
> //pointer to the quote
> boost::shared_ptr TB4WKsRate(new SimpleQuote(TB4WKsQuote));
> boost::shared_ptr TB13WKsRate(new
SimpleQuote(TB13WKsQuote));
> boost::shared_ptr TB26WKSRate(new SimpleQuote(TB26WKSQuote));
> boost::shared_ptr TB52WKSRate(new SimpleQuote(TB52WKSQuote));
>
> //Treasury securities use actual/actual day count convention
> DayCounter zcBondsDayCounter = ActualActual();
> Date d1 (1,Oct ,2012);
> Date d2=d1 +2* Months ;
> std :: cout << " Days Between d1/ d2:" <<zcBondsDayCounter.dayCount (d1
> ,d2) << std :: endl ;
> std :: cout <<
" Year Fraction d1 /d2:"
> <<zcBondsDayCounter.yearFraction (d1 ,d2) << std :: endl ;
>
> //pointer to the instrument
> boost::shared_ptr<RateHelper> zc4WK(new DepositRateHelper(
> Handle(TB4WKsRate),
> 4*Weeks, fixingDays,
> calendar, ModifiedFollowing,
> true, zcBondsDayCounter));
> boost::shared_ptr<RateHelper> zc13WK(new DepositRateHelper(
> Handle(TB13WKsRate),
> 13*Weeks,
fixingDays,
> calendar, ModifiedFollowing,
> true, zcBondsDayCounter));
> boost::shared_ptr<RateHelper> zc26WK(new DepositRateHelper(
> Handle(TB26WKSRate),
> 26*Weeks, fixingDays,
> calendar, ModifiedFollowing,
> true, zcBondsDayCounter));
> boost::shared_ptr<RateHelper> zc52WK(new DepositRateHelper(
> Handle(TB52WKSRate),
>
52*Weeks, fixingDays,
> calendar, ModifiedFollowing,
> true, zcBondsDayCounter));
>
> //set up the on the run bond
> Real redemption = 100.0;
>
> const Size numberOfBonds = 6;
>
> Date issueDates[] = {
> Date (1, April, 2013),
> Date (15, March, 2013),
> Date (1, April, 2013),
> Date (1, April, 2013),
>
Date (15, March, 2013),
> Date (15, March, 2013)
> };
>
> Date maturities[] = {
> Date (31, March, 2015),
> Date (15, March, 2016),
> Date (31, March, 2018),
> Date (31, March, 2020),
> Date (15, February, 2023),
> Date (15, February, 2043)
> };
>
> Real
couponRates[] = {
> 0.25,
> 0.375,
> 0.750,
> 1.125 ,
> 2.0,
> 3.125
> };
>
> Real marketQuotes[] = {
> 100.0391 ,
> 100.1484 ,
> 100.3594 ,
> 100.1094 ,
> 102.7422
,
> 105.2422
> };
>
> //pointer to the quote
> std::vector< boost::shared_ptr<SimpleQuote> > quote;
> for (Size i=0; i<numberOfBonds; i++) {
> boost::shared_ptr<SimpleQuote> cp(new
> SimpleQuote(marketQuotes[i]));
> quote.push_back(cp);
> }
>
> //pointer to the pointer of the quote
> RelinkableHandle quoteHandle[numberOfBonds];
> for (Size i=0; i<numberOfBonds;
i++) {
> quoteHandle[i].linkTo(quote[i]);
> }
>
> // Definition of the rate helpers
> std::vector<boost::shared_ptr<FixedRateBondHelper> >
> bondsHelpers;
>
> //pointer to the bond instruments
> for (Size i=0; i<numberOfBonds; i++) {
>
> Schedule schedule(issueDates[i], maturities[i],
> Period(Semiannual), UnitedStates(UnitedStates::GovernmentBond),
> Unadjusted, Unadjusted, DateGeneration::Backward,
> false);
>
> boost::shared_ptr<FixedRateBondHelper> bondHelper(new
>
FixedRateBondHelper(
> quoteHandle[i],
> settlementDays,
> 100.0,
> schedule,
> std::vector<Rate>(1,couponRates[i]),
> ActualActual(ActualActual::Bond),
> Unadjusted,
> redemption,
> issueDates[i]));
>
>
bondsHelpers.push_back(bondHelper);
> }
>
> /*********************
> ** CURVE BUILDING **
> *********************/
> // ActualActual::ISDA ensures that 30 years is 30.0
> DayCounter termStructureDayCounter =
> ActualActual(ActualActual::ISDA);
>
> double tolerance = 1.0e-15;
>
> // A depo-bond curve
> std::vector<boost::shared_ptr<RateHelper> > bondInstruments;
> //covers all types of bond
>
> //add T-bills to the bondInstruments
vector for 4-52 weeks
> bondInstruments.push_back(zc4WK);
> bondInstruments.push_back(zc13WK);
> bondInstruments.push_back(zc26WK);
> bondInstruments.push_back(zc52WK);
>
> bondInstruments.push_back(bondsHelpers[0]); //2 yr T-Note
> bondInstruments.push_back(bondsHelpers[1]); //3 yr T-Note
> bondInstruments.push_back(bondsHelpers[2]); //5 yr T-Note, resulting
> error
>
>
//build the yieldtermstructure
> boost::shared_ptr<YieldTermStructure> bondDiscountingTermStructure(
> new PiecewiseYieldCurve<Discount,LogLinear>(
> settlementDate, bondInstruments,
> termStructureDayCounter,
> tolerance));
>
> ----------------
> I saw in one thread that the similar problem solved by adding line
> yieldtermstructure->enableExtrapolation();
> I tried but it causes the error at line 88 of errors.cpp:
> throw std::runtime_error(format(file, line, function,
>
"Boost assertion failed: " +
> std::string(expr)));
>
> Here is the code for invoking enableExtrapolation:
> boost::shared_ptr<YieldTermStructure> bondDiscountingTermStructure;
> bondDiscountingTermStructure->enableExtrapolation();
>
> bondDiscountingTermStructure =
> boost::shared_ptr<YieldTermStructure> (
> new PiecewiseYieldCurve<Discount,LogLinear>(settlementDate,
>
bondInstruments,
> termStructureDayCounter,tolerance));
>
> I have stuck on this issue for about a week. Your help will be really
> appreciated.
>
>
>
>
> --
> View this message in context:
http://quantlib.10058.n7.nabble.com/error-in-building-yieldtermstructure-using-T-Bills-T-Notes-and-T-Bond-tp14209.html> Sent from the quantlib-users mailing list archive at Nabble.com.
>
> ------------------------------------------------------------------------------
> Precog is a next-generation analytics platform capable of advanced
> analytics on semi-structured data. The platform includes APIs for building
> apps and a
phenomenal toolset for data science. Developers can use
> our toolset for easy data analysis & visualization. Get a free account!
>
http://www2.precog.com/precogplatform/slashdotnewsletter> _______________________________________________
> QuantLib-users mailing list
>
[hidden email]>
https://lists.sourceforge.net/lists/listinfo/quantlib-users