Skip to content

Commit db507bf

Browse files
authored
Avoid possible segfault when bootstrapping over OIS rates (lballabio#1738)
2 parents 3855164 + 4eda1bb commit db507bf

3 files changed

Lines changed: 30 additions & 4 deletions

File tree

ql/termstructures/yield/oisratehelper.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ namespace QuantLib {
5151

5252
overnightIndex_ =
5353
ext::dynamic_pointer_cast<OvernightIndex>(overnightIndex->clone(termStructureHandle_));
54+
// We want to be notified of changes of fixings, but we don't
55+
// want notifications from termStructureHandle_ (they would
56+
// interfere with bootstrapping.)
57+
overnightIndex_->unregisterWith(termStructureHandle_);
5458

5559
registerWith(overnightIndex_);
5660
registerWith(discountHandle_);
@@ -161,6 +165,10 @@ namespace QuantLib {
161165

162166
auto clonedOvernightIndex =
163167
ext::dynamic_pointer_cast<OvernightIndex>(overnightIndex->clone(termStructureHandle_));
168+
// We want to be notified of changes of fixings, but we don't
169+
// want notifications from termStructureHandle_ (they would
170+
// interfere with bootstrapping.)
171+
clonedOvernightIndex->unregisterWith(termStructureHandle_);
164172

165173
registerWith(clonedOvernightIndex);
166174
registerWith(discountHandle_);

test-suite/overnightindexedswap.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <ql/termstructures/yield/piecewiseyieldcurve.hpp>
2828
#include <ql/termstructures/yield/flatforward.hpp>
2929
#include <ql/time/calendars/nullcalendar.hpp>
30+
#include <ql/time/calendars/target.hpp>
3031
#include <ql/time/daycounters/actual360.hpp>
3132
#include <ql/time/daycounters/thirty360.hpp>
3233
#include <ql/time/daycounters/actual365fixed.hpp>
@@ -499,18 +500,34 @@ void OvernightIndexedSwapTest::testBootstrapRegression() {
499500
}
500501

501502

503+
void OvernightIndexedSwapTest::test131BootstrapRegression() {
504+
BOOST_TEST_MESSAGE("Testing 1.31 regression with OIS bootstrap...");
505+
506+
Date today(11, December, 2012);
507+
Settings::instance().evaluationDate() = today;
508+
509+
auto eonia = ext::make_shared<Eonia>();
510+
511+
std::vector<ext::shared_ptr<RateHelper>> helpers;
512+
helpers.push_back(ext::make_shared<OISRateHelper>(2, 1 * Weeks, Handle<Quote>(ext::make_shared<SimpleQuote>(0.070/100)), eonia));
513+
helpers.push_back(ext::make_shared<DatedOISRateHelper>(Date(16, January, 2013), Date(13, February, 2013), Handle<Quote>(ext::make_shared<SimpleQuote>(0.046/100)), eonia));
514+
515+
auto curve = PiecewiseYieldCurve<ForwardRate,BackwardFlat>(0, TARGET(), helpers, Actual365Fixed());
516+
BOOST_CHECK_NO_THROW(curve.nodes());
517+
}
518+
519+
502520
test_suite* OvernightIndexedSwapTest::suite() {
503521
auto* suite = BOOST_TEST_SUITE("Overnight-indexed swap tests");
504522
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::testFairRate));
505523
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::testFairSpread));
506524
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::testCachedValue));
507525
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::testBootstrap));
508526
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::testBootstrapWithArithmeticAverage));
509-
suite->add(QUANTLIB_TEST_CASE(
510-
&OvernightIndexedSwapTest::testBootstrapWithTelescopicDates));
511-
suite->add(QUANTLIB_TEST_CASE(
512-
&OvernightIndexedSwapTest::testBootstrapWithTelescopicDatesAndArithmeticAverage));
527+
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::testBootstrapWithTelescopicDates));
528+
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::testBootstrapWithTelescopicDatesAndArithmeticAverage));
513529
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::testSeasonedSwaps));
514530
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::testBootstrapRegression));
531+
suite->add(QUANTLIB_TEST_CASE(&OvernightIndexedSwapTest::test131BootstrapRegression));
515532
return suite;
516533
}

test-suite/overnightindexedswap.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class OvernightIndexedSwapTest {
3737
static void testBootstrapWithTelescopicDatesAndArithmeticAverage();
3838
static void testSeasonedSwaps();
3939
static void testBootstrapRegression();
40+
static void test131BootstrapRegression();
4041
static boost::unit_test_framework::test_suite* suite();
4142
};
4243

0 commit comments

Comments
 (0)