This example values a forward-rate agreement (FRA) at different forward dates under two yield curve assumptions. It thereby illustrates how set up a term structure, and to use it to price a simple forward-rate agreement.
#if !defined(BOOST_ALL_NO_LIB) && defined(BOOST_MSVC)
#endif
#include <iostream>
#define LENGTH(a) (sizeof(a)/sizeof(a[0]))
int main(int, char* []) {
try {
std::cout << std::endl;
auto euribor3m = ext::make_shared<Euribor3M>(euriborTermStructure);
Settings::instance().evaluationDate() = todaysDate;
Calendar calendar = euribor3m->fixingCalendar();
Integer fixingDays = euribor3m->fixingDays();
Date settlementDate = calendar.
advance(todaysDate, fixingDays, Days);
std::cout <<
"Today: " << todaysDate.
weekday()
<< ", " << todaysDate << std::endl;
std::cout <<
"Settlement date: " << settlementDate.
weekday()
<< ", " << settlementDate << std::endl;
Rate threeMonthFraQuote[10];
threeMonthFraQuote[1]=0.030;
threeMonthFraQuote[2]=0.031;
threeMonthFraQuote[3]=0.032;
threeMonthFraQuote[6]=0.033;
threeMonthFraQuote[9]=0.034;
auto fra1x4Rate = ext::make_shared<SimpleQuote>(threeMonthFraQuote[1]);
auto fra2x5Rate = ext::make_shared<SimpleQuote>(threeMonthFraQuote[2]);
auto fra3x6Rate = ext::make_shared<SimpleQuote>(threeMonthFraQuote[3]);
auto fra6x9Rate = ext::make_shared<SimpleQuote>(threeMonthFraQuote[6]);
auto fra9x12Rate = ext::make_shared<SimpleQuote>(threeMonthFraQuote[9]);
DayCounter fraDayCounter = euribor3m->dayCounter();
bool endOfMonth = euribor3m->endOfMonth();
auto fra1x4 = ext::make_shared<FraRateHelper>(h1x4, 1, 4,
fixingDays, calendar, convention,
endOfMonth, fraDayCounter);
auto fra2x5 = ext::make_shared<FraRateHelper>(h2x5, 2, 5,
fixingDays, calendar, convention,
endOfMonth, fraDayCounter);
auto fra3x6 = ext::make_shared<FraRateHelper>(h3x6, 3, 6,
fixingDays, calendar, convention,
endOfMonth, fraDayCounter);
auto fra6x9 = ext::make_shared<FraRateHelper>(h6x9, 6, 9,
fixingDays, calendar, convention,
endOfMonth, fraDayCounter);
auto fra9x12 = ext::make_shared<FraRateHelper>(h9x12, 9, 12,
fixingDays, calendar, convention,
endOfMonth, fraDayCounter);
std::vector<ext::shared_ptr<RateHelper>> fraInstruments;
fraInstruments.push_back(fra1x4);
fraInstruments.push_back(fra2x5);
fraInstruments.push_back(fra3x6);
fraInstruments.push_back(fra6x9);
fraInstruments.push_back(fra9x12);
auto fraTermStructure = ext::make_shared<PiecewiseYieldCurve<Discount, LogLinear>>(
settlementDate, fraInstruments,
termStructureDayCounter);
Calendar fraCalendar = euribor3m->fixingCalendar();
euribor3m->businessDayConvention();
Real fraNotional = 100.0;
Integer monthsToStart[] = { 1, 2, 3, 6, 9 };
euriborTermStructure.
linkTo(fraTermStructure);
cout << endl;
cout << "Test FRA construction, NPV calculation, and FRA purchase"
<< endl
<< endl;
for (i=0; i<LENGTH(monthsToStart); i++) {
settlementDate,monthsToStart[i],Months,
fraBusinessDayConvention);
Rate fraStrikeRate = threeMonthFraQuote[monthsToStart[i]];
fraFwdType,fraStrikeRate,
fraNotional);
cout << "3m Term FRA, Months to Start: "
<< monthsToStart[i]
<< endl;
cout << "strike FRA rate: "
<< io::rate(fraStrikeRate)
<< endl;
cout << "FRA 3m forward rate: "
<< endl;
cout << "FRA market quote: "
<< io::rate(threeMonthFraQuote[monthsToStart[i]])
<< endl;
cout << "FRA amount [should be zero]: "
<< endl;
cout << "FRA NPV [should be zero]: "
<< endl
<< endl;
}
cout << endl << endl;
cout << "Now take a 100 basis-point upward shift in FRA quotes "
<< "and examine NPV"
<< endl
<< endl;
const Real BpsShift = 0.01;
threeMonthFraQuote[1]=0.030+BpsShift;
threeMonthFraQuote[2]=0.031+BpsShift;
threeMonthFraQuote[3]=0.032+BpsShift;
threeMonthFraQuote[6]=0.033+BpsShift;
threeMonthFraQuote[9]=0.034+BpsShift;
fra1x4Rate->setValue(threeMonthFraQuote[1]);
fra2x5Rate->setValue(threeMonthFraQuote[2]);
fra3x6Rate->setValue(threeMonthFraQuote[3]);
fra6x9Rate->setValue(threeMonthFraQuote[6]);
fra9x12Rate->setValue(threeMonthFraQuote[9]);
for (i=0; i<LENGTH(monthsToStart); i++) {
settlementDate,monthsToStart[i],Months,
fraBusinessDayConvention);
threeMonthFraQuote[monthsToStart[i]] - BpsShift;
fraFwdType, fraStrikeRate,
fraNotional);
cout << "3m Term FRA, 100 notional, Months to Start = "
<< monthsToStart[i]
<< endl;
cout << "strike FRA rate: "
<< io::rate(fraStrikeRate)
<< endl;
cout << "FRA 3m forward rate: "
<< endl;
cout << "FRA market quote: "
<< io::rate(threeMonthFraQuote[monthsToStart[i]])
<< endl;
cout << "FRA amount [should be positive]: "
<< endl;
cout << "FRA NPV [should be positive]: "
<< endl
<< endl;
}
return 0;
} catch (exception& e) {
cerr << e.what() << endl;
return 1;
} catch (...) {
cerr << "unknown error" << endl;
return 1;
}
}
Date advance(const Date &, Integer n, TimeUnit unit, BusinessDayConvention convention=Following, bool endOfMonth=false) const
static Date advance(const Date &d, Integer units, TimeUnit)
Forward rate agreement (FRA) class
Real amount() const
The payoff on the value date.
InterestRate forwardRate() const
Returns the relevant forward rate associated with the FRA term.
Real NPV() const
returns the net present value of the instrument.
Relinkable handle to an observable.
void linkTo(const ext::shared_ptr< T > &h, bool registerAsObserver=true)
BusinessDayConvention
Business Day conventions.
QL_INTEGER Integer
integer number
std::size_t Size
size of a container
piecewise-interpolated term structure
Global definitions and compiler switches.
deposit, FRA, futures, and various swap rate helpers