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 ;
}
}
Free forum by Nabble | Edit this page |