Re: Piecewise Yield Curve Errors

Posted by Marianne James on
URL: http://quantlib.414.s1.nabble.com/Piecewise-Yield-Curve-Errors-tp16656p16663.html

Hi Guan,

The deposit check is requesting a rate for the zerodate and hence getting a negative time of 1 day in years (for 360 days). Change the deposit check to this so you are actually asking for a rate on the deposit data point.

 

       for (Size i = 0; i<libors; i++) {

              //USDLibor index(depositData[i].n*depositData[i].units, ycHandle);

              Libor index("USDLibor", depositData[i].n*depositData[i].units, 2,

                     USDCurrency(),

                     calendar,

                     Actual360(), ycHandle);

              Rate inputRate = depositData[i].rate / 100;

              Date l_DateToUse = pricingDate + (depositData[i].n*depositData[i].units);

              Rate estimatedRate = index.fixing(l_DateToUse);

              //if (std::fabs(estimatedRate - inputRate) > tolerance)

              cout << depositData[i].n*depositData[i].units << " (" << l_DateToUse << ") "

                     << " Deposit:"

                     << setprecision(8)

                     << "\n\t estimated rate: " << estimatedRate

                     << "\n\t input rate: " << inputRate

                     << endl;

       }

 

I get the following output – the deposit rates for 1M and 3M are off although the zero yield rates for 0M and 3M look better – I’m not sure why at the moment.

 

Thanks

Ed

 

 

zero date is January 22nd, 2014

Checking estimated rates against input...

1M (February 17th, 2014)  Deposit:

                estimated rate: 0.0020672531

                input rate: 0.00157

3M (April 17th, 2014)  Deposit:

                estimated rate: 0.0021845006

                input rate: 0.002366

5Y Swap :

                estimated rate: 0.0173377

                input rate: 0.0173377

6Y Swap :

                estimated rate: 0.02074532

                input rate: 0.02074532

7Y Swap :

                estimated rate: 0.0236113

                input rate: 0.0236113

8Y Swap :

                estimated rate: 0.02592213

                input rate: 0.02592213

9Y Swap :

                estimated rate: 0.02781181

                input rate: 0.02781181

10Y Swap :

                estimated rate: 0.02937271

                input rate: 0.02937271

15Y Swap :

                estimated rate: 0.03418712

                input rate: 0.03418712

30Y Swap :

                estimated rate: 0.03742963

                input rate: 0.03742963

35Y Swap :

                estimated rate: 0.03742963

                input rate: 0.03742963

40Y Swap :

                estimated rate: 0.03742963

                input rate: 0.03742963

45Y Swap :

                estimated rate: 0.03742963

                input rate: 0.03742963

50Y Swap :

                estimated rate: 0.03742963

                input rate: 0.03742963

Zero-yield Rates...

Zero 0M: January 22nd, 2014 0.001569887 discount factor 1

Zero 3M: April 22nd, 2014 0.0023653005 discount factor 0.99940885

Zero 6M: July 22nd, 2014 0.0022751584 discount factor 0.99885675

Zero 9M: October 22nd, 2014 0.0026115489 discount factor 0.99802154

Zero 12M: January 22nd, 2015 0.002851819 discount factor 0.99711275

Zero 15M: April 22nd, 2015 0.003226952 discount factor 0.9959298

Zero 18M: July 22nd, 2015 0.003708467 discount factor 0.99439128

Zero 21M: October 22nd, 2015 0.0043166678 discount factor 0.99237909

Zero 24M: January 22nd, 2016 0.0050454544 discount factor 0.9898211

Zero 27M: April 22nd, 2016 0.0058911916 discount factor 0.98665466

Zero 30M: July 22nd, 2016 0.006853368 discount factor 0.98278798

Zero 33M: October 22nd, 2016 0.0078990854 discount factor 0.97821121

Zero 36M: January 22nd, 2017 0.0089884804 discount factor 0.9730061

Zero 39M: April 22nd, 2017 0.010082293 discount factor 0.96733002

Zero 42M: July 22nd, 2017 0.011174645 discount factor 0.9611364

Zero 45M: October 22nd, 2017 0.012259943 discount factor 0.95444826

Zero 48M: January 22nd, 2018 0.013324237 discount factor 0.94736181

Zero 51M: April 22nd, 2018 0.014343294 discount factor 0.94007493

Zero 54M: July 22nd, 2018 0.015349671 discount factor 0.93238305

Zero 57M: October 22nd, 2018 0.016340753 discount factor 0.92430982

Zero 60M: January 22nd, 2019 0.017303495 discount factor 0.91597412

Zero 63M: April 22nd, 2019 0.018216268 discount factor 0.90760046

Zero 66M: July 22nd, 2019 0.019109012 discount factor 0.89894562

Zero 69M: October 22nd, 2019 0.019979907 discount factor 0.89003548

Zero 72M: January 22nd, 2020 0.02081814 discount factor 0.8809966

Zero 75M: April 22nd, 2020 0.02161429 discount factor 0.871961

Zero 78M: July 22nd, 2020 0.02237673 discount factor 0.86286249

Zero 81M: October 22nd, 2020 0.02311232 discount factor 0.85363191

Zero 84M: January 22nd, 2021 0.023811523 discount factor 0.84440085

Zero 87M: April 22nd, 2021 0.02446009 discount factor 0.83539584

Zero 90M: July 22nd, 2021 0.025082903 discount factor 0.82632311

Zero 93M: October 22nd, 2021 0.025682361 discount factor 0.81718326

Zero 96M: January 22nd, 2022 0.026254993 discount factor 0.80807288

Zero 99M: April 22nd, 2022 0.026792146 discount factor 0.79918649

Zero 102M: July 22nd, 2022 0.027312938 discount factor 0.79023702

Zero 105M: October 22nd, 2022 0.027816886 discount factor 0.78123845

Zero 108M: January 22nd, 2023 0.028298407 discount factor 0.77230157

Zero 111M: April 22nd, 2023 0.028748215 discount factor 0.76362822

Zero 114M: July 22nd, 2023 0.029182995 discount factor 0.75493055

Zero 117M: October 22nd, 2023 0.029603684 discount factor 0.7462105

Zero 120M: January 22nd, 2024 0.030007023 discount factor 0.73756241

Zero 123M: April 22nd, 2024 0.030390789 discount factor 0.72907418

Zero 126M: July 22nd, 2024 0.030760488 discount factor 0.7206518

Zero 129M: October 22nd, 2024 0.031120285 discount factor 0.71220891

Zero 132M: January 22nd, 2025 0.031466383 discount factor 0.70384311

Zero 135M: April 22nd, 2025 0.03179203 discount factor 0.69573782

Zero 138M: July 22nd, 2025 0.032108624 discount factor 0.68762516

Zero 141M: October 22nd, 2025 0.032416082 discount factor 0.67951111

Zero 144M: January 22nd, 2026 0.032711196 discount factor 0.67148821

Zero 147M: April 22nd, 2026 0.03298828 discount factor 0.66373031

Zero 150M: July 22nd, 2026 0.03325709 discount factor 0.65597933

Zero 153M: October 22nd, 2026 0.033517587 discount factor 0.6482401

Zero 156M: January 22nd, 2027 0.033767097 discount factor 0.64059972

Zero 159M: April 22nd, 2027 0.034000878 discount factor 0.63322212

Zero 162M: July 22nd, 2027 0.034227224 discount factor 0.62586052

Zero 165M: October 22nd, 2027 0.034446139 discount factor 0.61851863

Zero 168M: January 22nd, 2028 0.034655422 discount factor 0.6112781

Zero 171M: April 22nd, 2028 0.034853289 discount factor 0.60421592

Zero 174M: July 22nd, 2028 0.035042398 discount factor 0.59725252

Zero 177M: October 22nd, 2028 0.035225017 discount factor 0.59031249

Zero 180M: January 22nd, 2029 0.035399364 discount factor 0.58347209

Zero 183M: April 22nd, 2029 0.035563263 discount factor 0.57686678

Zero 186M: July 22nd, 2029 0.035723509 discount factor 0.57026567

Zero 189M: October 22nd, 2029 0.035880014 discount factor 0.56367193

Zero 192M: January 22nd, 2030 0.036031083 discount factor 0.55715903

Zero 195M: April 22nd, 2030 0.0361737 discount factor 0.5508663

Zero 198M: July 22nd, 2030 0.036312798 discount factor 0.54458294

Zero 201M: October 22nd, 2030 0.036448302 discount factor 0.53831177

Zero 204M: January 22nd, 2031 0.036578751 discount factor 0.53212234

Zero 207M: April 22nd, 2031 0.036701566 discount factor 0.52614657

Zero 210M: July 22nd, 2031 0.036821012 discount factor 0.52018385

Zero 213M: October 22nd, 2031 0.036937028 discount factor 0.51423665

Zero 216M: January 22nd, 2032 0.03704837 discount factor 0.50837069

Zero 219M: April 22nd, 2032 0.037153998 discount factor 0.50264808

Zero 222M: July 22nd, 2032 0.037255241 discount factor 0.49700425

Zero 225M: October 22nd, 2032 0.037353234 discount factor 0.49137804

Zero 228M: January 22nd, 2033 0.037446935 discount factor 0.48583137

Zero 231M: April 22nd, 2033 0.037534539 discount factor 0.4804817

Zero 234M: July 22nd, 2033 0.037619126 discount factor 0.47514882

Zero 237M: October 22nd, 2033 0.037700659 discount factor 0.46983458

Zero 240M: January 22nd, 2034 0.037778282 discount factor 0.46459728

Zero 243M: April 22nd, 2034 0.037850526 discount factor 0.45954754

Zero 246M: July 22nd, 2034 0.037919953 discount factor 0.454515

Zero 249M: October 22nd, 2034 0.037986539 discount factor 0.44950125

Zero 252M: January 22nd, 2035 0.038049596 discount factor 0.4445611

Zero 255M: April 22nd, 2035 0.038107959 discount factor 0.43979867

Zero 258M: July 22nd, 2035 0.038163723 discount factor 0.4350531

Zero 261M: October 22nd, 2035 0.038216873 discount factor 0.43032573

Zero 264M: January 22nd, 2036 0.038266876 discount factor 0.42566807

Zero 267M: April 22nd, 2036 0.038313333 discount factor 0.42112858

Zero 270M: July 22nd, 2036 0.038356897 discount factor 0.41665523

Zero 273M: October 22nd, 2036 0.038398095 discount factor 0.41219887

Zero 276M: January 22nd, 2037 0.038436527 discount factor 0.4078079

Zero 279M: April 22nd, 2037 0.03847154 discount factor 0.40357457

Zero 282M: July 22nd, 2037 0.038504436 discount factor 0.39935562

Zero 285M: October 22nd, 2037 0.038535227 discount factor 0.39515195

Zero 288M: January 22nd, 2038 0.038563634 discount factor 0.39100908

Zero 291M: April 22nd, 2038 0.038589209 discount factor 0.38701395

Zero 294M: July 22nd, 2038 0.038612933 discount factor 0.38303127

Zero 297M: October 22nd, 2038 0.038634831 discount factor 0.37906173

Zero 300M: January 22nd, 2039 0.038654725 discount factor 0.37514819

Zero 303M: April 22nd, 2039 0.038672341 discount factor 0.37137273

Zero 306M: July 22nd, 2039 0.038688389 discount factor 0.36760743

Zero 309M: October 22nd, 2039 0.038702905 discount factor 0.3638528

Zero 312M: January 22nd, 2040 0.038715799 discount factor 0.36014925

Zero 315M: April 22nd, 2040 0.038727052 discount factor 0.35653498

Zero 318M: July 22nd, 2040 0.038736905 discount factor 0.35296826

Zero 321M: October 22nd, 2040 0.038745538 discount factor 0.34940945

Zero 324M: January 22nd, 2041 0.038752931 discount factor 0.34589673

Zero 327M: April 22nd, 2041 0.038759057 discount factor 0.34250378

Zero 330M: July 22nd, 2041 0.038764229 discount factor 0.33911557

Zero 333M: October 22nd, 2041 0.038768509 discount factor 0.33573228

Zero 336M: January 22nd, 2042 0.038771931 discount factor 0.33239012

Zero 339M: April 22nd, 2042 0.03877454 discount factor 0.32915922

Zero 342M: July 22nd, 2042 0.038776529 discount factor 0.32593004

Zero 345M: October 22nd, 2042 0.038777969 discount factor 0.32270261

Zero 348M: January 22nd, 2043 0.038778931 discount factor 0.3195114

Zero 351M: April 22nd, 2043 0.038779504 discount factor 0.31642341

Zero 354M: July 22nd, 2043 0.038779803 discount factor 0.31333398

Zero 357M: October 22nd, 2043 0.038779915 discount factor 0.31024301

Zero 360M: January 22nd, 2044 0.038779931 discount factor 0.3071834

 

3m Forward Rates...

0 x 3 Fwd : 0.0023653005

3 x 6 Fwd : 0.0021860069

6 x 9 Fwd : 0.0032733606

9 x 12 Fwd : 0.0035647945

12 x 15 Fwd : 0.0047483244

15 x 18 Fwd : 0.0061160423

18 x 21 Fwd : 0.0079262072

21 x 24 Fwd : 0.010099431

24 x 27 Fwd : 0.012675677

27 x 30 Fwd : 0.015534102

30 x 33 Fwd : 0.018265327

33 x 36 Fwd : 0.020877095

36 x 39 Fwd : 0.023402501

39 x 42 Fwd : 0.025411231

42 x 45 Fwd : 0.027324354

45 x 48 Fwd : 0.029161396

48 x 51 Fwd : 0.030885983

51 x 54 Fwd : 0.032502315

54 x 57 Fwd : 0.034029417

57 x 60 Fwd : 0.035449091

60 x 63 Fwd : 0.036735406

63 x 66 Fwd : 0.037905685

66 x 69 Fwd : 0.038978677

69 x 72 Fwd : 0.039942605

72 x 75 Fwd : 0.04078315

75 x 78 Fwd : 0.041496367

78 x 81 Fwd : 0.042085756

81 x 84 Fwd : 0.042545605

84 x 87 Fwd : 0.042886573

87 x 90 Fwd : 0.043199236

90 x 93 Fwd : 0.043522775

93 x 96 Fwd : 0.043869627

96 x 99 Fwd : 0.044231727

99 x 102 Fwd : 0.044550577

102 x 105 Fwd : 0.04481419

105 x 108 Fwd : 0.045020768

108 x 111 Fwd : 0.045176223

111 x 114 Fwd : 0.045317632

114 x 117 Fwd : 0.045461827

117 x 120 Fwd : 0.045614485

120 x 123 Fwd : 0.045792055

123 x 126 Fwd : 0.04596687

126 x 129 Fwd : 0.04611445

129 x 132 Fwd : 0.046235741

132 x 135 Fwd : 0.046330338

135 x 138 Fwd : 0.046400593

138 x 141 Fwd : 0.046448871

141 x 144 Fwd : 0.046475719

144 x 147 Fwd : 0.046482225

147 x 150 Fwd : 0.046470149

150 x 153 Fwd : 0.046440521

153 x 156 Fwd : 0.046394441

156 x 159 Fwd : 0.046334137

159 x 162 Fwd : 0.046260894

162 x 165 Fwd : 0.046174758

165 x 168 Fwd : 0.046077263

168 x 171 Fwd : 0.045970816

171 x 174 Fwd : 0.045856891

174 x 177 Fwd : 0.045735577

177 x 180 Fwd : 0.04560813

180 x 183 Fwd : 0.045541077

183 x 186 Fwd : 0.045530178

186 x 189 Fwd : 0.045508462

189 x 192 Fwd : 0.045476174

192 x 195 Fwd : 0.045434309

195 x 198 Fwd : 0.045383208

198 x 201 Fwd : 0.045322345

201 x 204 Fwd : 0.045252216

204 x 207 Fwd : 0.045174418

207 x 210 Fwd : 0.045089064

210 x 213 Fwd : 0.044995071

213 x 216 Fwd : 0.044893149

216 x 219 Fwd : 0.044784786

219 x 222 Fwd : 0.044670457

222 x 225 Fwd : 0.044549284

225 x 228 Fwd : 0.044421557

228 x 231 Fwd : 0.044289787

231 x 234 Fwd : 0.044153728

234 x 237 Fwd : 0.044011474

237 x 240 Fwd : 0.043864071

240 x 243 Fwd : 0.043714334

243 x 246 Fwd : 0.043561893

246 x 249 Fwd : 0.043404574

249 x 252 Fwd : 0.043243543

252 x 255 Fwd : 0.043081824

255 x 258 Fwd : 0.04291895

258 x 261 Fwd : 0.042752583

261 x 264 Fwd : 0.042583974

264 x 267 Fwd : 0.042415333

267 x 270 Fwd : 0.042247049

270 x 273 Fwd : 0.042077651

273 x 276 Fwd : 0.041907517

276 x 279 Fwd : 0.041739792

279 x 282 Fwd : 0.041573917

282 x 285 Fwd : 0.04140752

285 x 288 Fwd : 0.041241923

288 x 291 Fwd : 0.041080184

291 x 294 Fwd : 0.040921743

294 x 297 Fwd : 0.040764365

297 x 300 Fwd : 0.040609354

300 x 303 Fwd : 0.040459583

303 x 306 Fwd : 0.040314529

306 x 309 Fwd : 0.040172185

309 x 312 Fwd : 0.04003381

312 x 315 Fwd : 0.039901286

315 x 318 Fwd : 0.039774917

318 x 321 Fwd : 0.039653689

321 x 324 Fwd : 0.039538069

324 x 327 Fwd : 0.03943026

327 x 330 Fwd : 0.039329909

330 x 333 Fwd : 0.039235765

333 x 336 Fwd : 0.039148896

336 x 339 Fwd : 0.039071023

339 x 342 Fwd : 0.039001926

342 x 345 Fwd : 0.038940882

345 x 348 Fwd : 0.038888814

348 x 351 Fwd : 0.03884686

351 x 354 Fwd : 0.038814969

354 x 357 Fwd : 0.038793041

357 x 360 Fwd : 0.038781823

360 x 363 Fwd : 0.03858163

 

 

From: Guan Wang [mailto:[hidden email]]
Sent: 11 June 2015 21:47
To: [hidden email]
Subject: [Quantlib-users] Piecewise Yield Curve Errors

 

Hi,

 

I am trying to build a yield curve using the following inputs:

 

USD Libor 1m, 3m

EDF prices (12 of them, 3m apart, let's suppose convexity adjustment is zero)

Swap rates (5yr to 50yr)

 

To be able to interpolate with swap rates, I have to set my calendar to be the joint calendar of US and UK. Theses are the errors I am getting:

 

For pricing date 1/17/2014:

negative time (-0.00277778) given

 

For pricing date 2/13/2014:

interpolation range is [0.0777778, 7.10278]: extrapolation at 0.075 not allowed

 

To avoid out of range errors, I also have to enable extrapolation for the yield curve builder.

 

Can anybody help me with this? The stand alone code is as follows:

 

#include <ql/quantlib.hpp>

#include <stdio.h>

#include <iostream>

#include <fstream>

#include <sstream>

#include <ql/termstructures/yield/ratehelpers.hpp>

 

using namespace std;

using namespace QuantLib;

using namespace boost;

void testPiecewiseCurve(int yyyymmdd);

int main(int argc, char* argv[])

{

int yyyymmdd = 20140117;

try {

testPiecewiseCurve(yyyymmdd);

}

catch (std::exception& e) {

cout << "Couldn't build yield curve: " << e.what() << endl;

}

return 0;

}

struct Datum {

int n;

TimeUnit units;

Rate rate;

};

struct EDFDatum {

Date expiry;

Real price;

Rate convexityAdj;

};

Datum depositData[] = {

{ 1, Months, 0.157 },

{ 3, Months, 0.2366 }

};

EDFDatum edfData[] = {

{ Date(41715), 99.75, 0.00 },

{ Date(41806), 99.71, 0.00 },

{ Date(41897), 99.66, 0.00 },

{ Date(41988), 99.575, 0.00 },

{ Date(42079), 99.445, 0.00 },

{ Date(42170), 99.28, 0.00 },

{ Date(42261), 99.08, 0.00 },

{ Date(42352), 98.84, 0.00 },

{ Date(42443), 98.56, 0.00 },

{ Date(42534), 98.275, 0.00 },

{ Date(42632), 98.00, 0.00 },

{ Date(42723), 97.735, 0.00 }

};

Datum swapData[] = {

{ 5, Years, 1.73377 },

{ 6, Years, 2.074532 },

{ 7, Years, 2.36113 },

{ 8, Years, 2.592213 },

{ 9, Years, 2.781181 },

{ 10, Years, 2.937271 },

{ 15, Years, 3.418712 },

{ 30, Years, 3.742963 },

{ 35, Years, 3.742963 },

{ 40, Years, 3.742963 },

{ 45, Years, 3.742963 },

{ 50, Years, 3.742963 }

};

 

 

void testPiecewiseCurve(int yyyymmdd){

Calendar calendar = JointCalendar(UnitedStates(UnitedStates::Settlement), UnitedKingdom(UnitedKingdom::Exchange), JoinHolidays);

 

int dd = yyyymmdd%100;

int mm = (yyyymmdd/100)%100;

int yyyy = yyyymmdd/10000;

Date pricingDate = calendar.adjust(Date(dd , Month(mm), yyyy));

Date zeroDate = calendar.advance (pricingDate , 2 , Days );

vector<boost::shared_ptr<SimpleQuote> > rates, prices;

vector <boost::shared_ptr < RateHelper >> instruments;

Size libors = 2;

Size edfs = 12 ;

Size swaps = 12;

instruments = std::vector<boost::shared_ptr<RateHelper> >(libors + edfs + swaps);

rates = vector<boost::shared_ptr<SimpleQuote> >(libors + swaps);

prices = vector<boost::shared_ptr<SimpleQuote> >(edfs);

for (Size i=0; i<libors; i++) {

rates[i] = boost::shared_ptr<SimpleQuote>(new SimpleQuote(depositData[i].rate/100));

}

for (Size i=0; i<edfs; i++) {

prices[i] = boost::shared_ptr<SimpleQuote>(new SimpleQuote(edfData[i].price));

}

for (Size i=0; i<swaps; i++) {

rates[i+libors] = boost::shared_ptr<SimpleQuote>(new SimpleQuote(swapData[i].rate/100));

}

Settings::instance().evaluationDate() = pricingDate;

//For USD Libor Swap, the fixed leg frequency is semiannual

Frequency fixedLegFrequency = Semiannual;

//For USD Libor Swap, the fixed leg convention is modified following

//Modified Following: Choose the first business day after the given holiday unless it belongs to a different month,

//in which case choose the first business day before the holiday.

BusinessDayConvention fixedLegConvention = ModifiedFollowing;

//For USD Libor Swap, the fixed leg day counter is 30/360

DayCounter fixedLegDayCounter = Thirty360();

boost::shared_ptr<IborIndex> libor1m(new USDLibor(1*Months));

boost::shared_ptr<IborIndex> libor3m(new USDLibor(3*Months));

boost::shared_ptr<IborIndex> libor6m(new USDLibor(6*Months));

Handle<Quote> r0(rates[0]);

instruments[0] = boost::shared_ptr<RateHelper>(new DepositRateHelper(r0, 1*Months, libor1m->fixingDays(), calendar,

libor1m->businessDayConvention(),

libor1m->endOfMonth(),

libor1m->dayCounter()));

Handle<Quote> r1(rates[1]);

instruments[1] = boost::shared_ptr<RateHelper>(new DepositRateHelper(r1, 3*Months, libor3m->fixingDays(), calendar,

libor3m->businessDayConvention(),

libor3m->endOfMonth(),

libor3m->dayCounter()));

for (Size i=0; i<edfs; i++) {

Handle<Quote> p(prices[i]);

Date immDate = IMM::nextDate(edfData[i].expiry);

//EDF prices should be convexity adjusted

boost::shared_ptr<Quote> convexity(new SimpleQuote(edfData[i].convexityAdj/10000.0));

instruments[i+libors] = boost::shared_ptr<RateHelper>(new FuturesRateHelper(p, immDate, 3, calendar,

libor3m->businessDayConvention(),

libor3m->endOfMonth(),

libor3m->dayCounter(),

Handle<Quote>(convexity)));

}

for (Size i=0; i<swaps; i++) {

Handle<Quote> r(rates[i+libors]);

instruments[i+libors+edfs] = boost::shared_ptr<RateHelper>(new SwapRateHelper(r, swapData[i].n*swapData[i].units, calendar,

fixedLegFrequency, fixedLegConvention, fixedLegDayCounter, libor3m));

}

 

 

Cubic myCubic(CubicInterpolation::Spline, true,

CubicInterpolation::SecondDerivative, 0.0,

CubicInterpolation::SecondDerivative, 0.0);

DayCounter dc= Actual360 ();

cout << "zero date is " << zeroDate << endl;

boost::shared_ptr <QuantLib::YieldTermStructure> yieldCurve = boost::shared_ptr < YieldTermStructure >( new PiecewiseYieldCurve < ZeroYield , Cubic, IterativeBootstrap >( zeroDate , instruments , dc, myCubic));

yieldCurve -> enableExtrapolation();

Handle < YieldTermStructure > ycHandle ( yieldCurve );

boost::shared_ptr < IborIndex > libor3m_new ( new USDLibor ( Period (3, Months ), ycHandle ));

cout << "Checking estimated rates against input..." << endl;

Real tolerance = 1.0e-7;

// Check Results

// Check deposits

for (Size i=0; i<libors; i++) {

//USDLibor index(depositData[i].n*depositData[i].units, ycHandle);

Libor index("USDLibor", depositData[i].n*depositData[i].units, 2,

USDCurrency(),

calendar,

Actual360(), ycHandle);

Rate inputRate = depositData[i].rate/100,

estimatedRate = index.fixing(pricingDate);

if (std::fabs(estimatedRate - inputRate) > tolerance)

cout << depositData[i].n*depositData[i].units

<< " Deposit:"

<< setprecision(8)

<< "\n\t estimated rate: " << estimatedRate

<< "\n\t input rate: " << inputRate

<< endl;

}

// Check swap rate

for (Size i=0; i<swaps; i++) {

Period tenor = swapData[i].n*swapData[i].units;

// construct a vanilla swap

VanillaSwap swap = MakeVanillaSwap (tenor, libor3m_new)

. withEffectiveDate (zeroDate)

. withFixedLegConvention (ModifiedFollowing)

. withFixedLegTenor (6*Months);

Rate inputRate = swapData[i].rate/100,

estimatedRate = swap.fairRate();

if (std::fabs(estimatedRate - inputRate) > tolerance)

cout << tenor <<" Swap :" << setprecision(8)

<< "\n\t estimated rate: "<< estimatedRate

<< "\n\t input rate: "<< inputRate

<< endl ;

}

cout << "Zero-yield Rates..."<< endl;

for (int i=0; i<=120; i++){

Rate zeroRate = yieldCurve -> zeroRate ( zeroDate + 3*i* Months ,dc , Continuous );

DiscountFactor discountFactor = yieldCurve -> discount( zeroDate + 3*i* Months );

cout << " Zero " << 3*i << "M: " << zeroDate +3*i* Months<< " " << zeroRate << " discount factor " << discountFactor << endl ;

}

 

cout << "\n3m Forward Rates..."<< endl;

for (int i=0; i<=120; i++){

Date d1= zeroDate +3*i* Months, d2=d1 +3* Months ;

Rate forwardRate = yieldCurve -> forwardRate (d1 ,d2 ,dc , Continuous );

cout << 3*i << " x " << 3*i + 3 << " Fwd : " << forwardRate<< endl ;

}

 

}

 


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

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