http://quantlib.414.s1.nabble.com/Swap-valution-with-eurodollar-futures-tp6459p6462.html
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