Skip to content

Commit 33e452e

Browse files
authored
Remove day counter argument from spreaded curves (#2365)
2 parents c068ec3 + 7419a68 commit 33e452e

File tree

7 files changed

+110
-102
lines changed

7 files changed

+110
-102
lines changed

ql/cashflows/cashflows.cpp

Lines changed: 14 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,55 +1142,6 @@ namespace QuantLib {
11421142
}
11431143

11441144
// Z-spread utility functions
1145-
namespace {
1146-
1147-
class ZSpreadFinder {
1148-
public:
1149-
ZSpreadFinder(const Leg& leg,
1150-
const ext::shared_ptr<YieldTermStructure>& discountCurve,
1151-
Real npv,
1152-
const DayCounter& dc,
1153-
Compounding comp,
1154-
Frequency freq,
1155-
bool includeSettlementDateFlows,
1156-
Date settlementDate,
1157-
Date npvDate)
1158-
: leg_(leg), npv_(npv), zSpread_(new SimpleQuote(0.0)),
1159-
curve_(Handle<YieldTermStructure>(discountCurve),
1160-
Handle<Quote>(zSpread_), comp, freq, dc),
1161-
includeSettlementDateFlows_(includeSettlementDateFlows),
1162-
settlementDate_(settlementDate),
1163-
npvDate_(npvDate) {
1164-
1165-
if (settlementDate_ == Date())
1166-
settlementDate_ = Settings::instance().evaluationDate();
1167-
1168-
if (npvDate_ == Date())
1169-
npvDate_ = settlementDate_;
1170-
1171-
// if the discount curve allows extrapolation, let's
1172-
// the spreaded curve do too.
1173-
curve_.enableExtrapolation(
1174-
discountCurve->allowsExtrapolation());
1175-
}
1176-
Real operator()(Rate zSpread) const {
1177-
zSpread_->setValue(zSpread);
1178-
Real NPV = CashFlows::npv(leg_, curve_,
1179-
includeSettlementDateFlows_,
1180-
settlementDate_, npvDate_);
1181-
return npv_ - NPV;
1182-
}
1183-
private:
1184-
const Leg& leg_;
1185-
Real npv_;
1186-
ext::shared_ptr<SimpleQuote> zSpread_;
1187-
ZeroSpreadedTermStructure curve_;
1188-
bool includeSettlementDateFlows_;
1189-
Date settlementDate_, npvDate_;
1190-
};
1191-
1192-
} // anonymous namespace ends here
1193-
11941145
Real CashFlows::npv(const Leg& leg,
11951146
const ext::shared_ptr<YieldTermStructure>& discountCurve,
11961147
Spread zSpread,
@@ -1216,9 +1167,7 @@ namespace QuantLib {
12161167

12171168
ZeroSpreadedTermStructure spreadedCurve(discountCurveHandle,
12181169
zSpreadQuoteHandle,
1219-
comp, freq, dc);
1220-
1221-
spreadedCurve.enableExtrapolation(discountCurveHandle->allowsExtrapolation());
1170+
comp, freq);
12221171

12231172
return npv(leg, spreadedCurve,
12241173
includeSettlementDateFlows,
@@ -1244,13 +1193,21 @@ namespace QuantLib {
12441193
if (npvDate == Date())
12451194
npvDate = settlementDate;
12461195

1196+
auto zSpreadQuote = ext::make_shared<SimpleQuote>();
1197+
ZeroSpreadedTermStructure spreadedCurve(Handle<YieldTermStructure>(discount),
1198+
Handle<Quote>(zSpreadQuote),
1199+
compounding,
1200+
frequency);
1201+
auto objFunction = [&](Rate zSpread) {
1202+
zSpreadQuote->setValue(zSpread);
1203+
Real NPV = CashFlows::npv(leg, spreadedCurve,
1204+
includeSettlementDateFlows,
1205+
settlementDate, npvDate);
1206+
return npv - NPV;
1207+
};
1208+
12471209
Brent solver;
12481210
solver.setMaxEvaluations(maxIterations);
1249-
ZSpreadFinder objFunction(leg,
1250-
discount,
1251-
npv,
1252-
dayCounter, compounding, frequency, includeSettlementDateFlows,
1253-
settlementDate, npvDate);
12541211
Real step = 0.01;
12551212
return solver.solve(objFunction, accuracy, guess, step);
12561213
}

ql/methods/finitedifferences/operators/fdmbatesop.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ namespace QuantLib {
4949
Handle<YieldTermStructure>(ext::make_shared<ZeroSpreadedTermStructure>(
5050
batesProcess->dividendYield(),
5151
Handle<Quote>(ext::shared_ptr<Quote>(new SimpleQuote(lambda_ * m_))),
52-
Continuous,
53-
NoFrequency,
54-
batesProcess->dividendYield()->dayCounter())),
52+
Continuous)),
5553
batesProcess->s0(),
5654
batesProcess->v0(),
5755
batesProcess->kappa(),

ql/termstructures/yield/piecewiseforwardspreadedtermstructure.hpp

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,19 @@ namespace QuantLib {
4949
class InterpolatedPiecewiseForwardSpreadedTermStructure : public ForwardRateStructure {
5050
public:
5151
InterpolatedPiecewiseForwardSpreadedTermStructure(Handle<YieldTermStructure>,
52-
std::vector<Handle<Quote> > spreads,
53-
const std::vector<Date>& dates,
54-
DayCounter dc = DayCounter(),
55-
const Interpolator& factory = Interpolator());
52+
std::vector<Handle<Quote>> spreads,
53+
std::vector<Date> dates,
54+
Interpolator factory = Interpolator());
55+
56+
/*! \deprecated Use the constructor without a day counter.
57+
Deprecated in version 1.41.
58+
*/
59+
[[deprecated("Use the constructor without DayCounter")]]
60+
InterpolatedPiecewiseForwardSpreadedTermStructure(Handle<YieldTermStructure>,
61+
std::vector<Handle<Quote>> spreads,
62+
std::vector<Date> dates,
63+
DayCounter dc,
64+
Interpolator factory = Interpolator());
5665
//! \name YieldTermStructure interface
5766
//@{
5867
DayCounter dayCounter() const override;
@@ -78,23 +87,22 @@ namespace QuantLib {
7887
std::vector<Spread> spreadValues_;
7988
Compounding comp_;
8089
Frequency freq_;
81-
DayCounter dc_;
8290
Interpolator factory_;
8391
Interpolation interpolator_;
8492
};
8593

8694
// inline definitions
8795

96+
#ifndef __DOXYGEN__
97+
8898
template <class T>
8999
inline InterpolatedPiecewiseForwardSpreadedTermStructure<
90100
T>::InterpolatedPiecewiseForwardSpreadedTermStructure(Handle<YieldTermStructure> h,
91-
std::vector<Handle<Quote> > spreads,
92-
const std::vector<Date>& dates,
93-
DayCounter dc,
94-
const T& factory)
95-
: originalCurve_(std::move(h)), spreads_(std::move(spreads)), dates_(dates),
96-
times_(dates.size()), spreadValues_(dates.size()), dc_(std::move(dc)),
97-
factory_(factory) {
101+
std::vector<Handle<Quote>> spreads,
102+
std::vector<Date> dates,
103+
T factory)
104+
: originalCurve_(std::move(h)), spreads_(std::move(spreads)), dates_(std::move(dates)),
105+
times_(dates_.size()), spreadValues_(dates_.size()), factory_(std::move(factory)) {
98106
QL_REQUIRE(!spreads_.empty(), "no spreads given");
99107
QL_REQUIRE(spreads_.size() == dates_.size(),
100108
"spread and date vector have different sizes");
@@ -105,6 +113,19 @@ namespace QuantLib {
105113
updateInterpolation();
106114
}
107115

116+
template <class T>
117+
inline InterpolatedPiecewiseForwardSpreadedTermStructure<
118+
T>::InterpolatedPiecewiseForwardSpreadedTermStructure(Handle<YieldTermStructure> h,
119+
std::vector<Handle<Quote>> spreads,
120+
std::vector<Date> dates,
121+
DayCounter dc,
122+
T factory)
123+
: InterpolatedPiecewiseForwardSpreadedTermStructure(
124+
std::move(h), std::move(spreads), std::move(dates), std::move(factory)
125+
) {}
126+
127+
#endif
128+
108129
template <class T>
109130
inline DayCounter InterpolatedPiecewiseForwardSpreadedTermStructure<T>::dayCounter() const {
110131
return originalCurve_->dayCounter();

ql/termstructures/yield/piecewisezerospreadedtermstructure.hpp

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,23 @@ namespace QuantLib {
4949
class InterpolatedPiecewiseZeroSpreadedTermStructure : public ZeroYieldStructure {
5050
public:
5151
InterpolatedPiecewiseZeroSpreadedTermStructure(Handle<YieldTermStructure>,
52-
std::vector<Handle<Quote> > spreads,
53-
const std::vector<Date>& dates,
52+
std::vector<Handle<Quote>> spreads,
53+
std::vector<Date> dates,
5454
Compounding comp = Continuous,
5555
Frequency freq = NoFrequency,
56-
DayCounter dc = DayCounter(),
57-
const Interpolator& factory = Interpolator());
56+
Interpolator factory = Interpolator());
57+
58+
/*! \deprecated Use the constructor without a day counter.
59+
Deprecated in version 1.41.
60+
*/
61+
[[deprecated("Use the constructor without DayCounter")]]
62+
InterpolatedPiecewiseZeroSpreadedTermStructure(Handle<YieldTermStructure>,
63+
std::vector<Handle<Quote>> spreads,
64+
std::vector<Date> dates,
65+
Compounding comp,
66+
Frequency freq,
67+
DayCounter dc,
68+
Interpolator factory = Interpolator());
5869
//! \name YieldTermStructure interface
5970
//@{
6071
DayCounter dayCounter() const override;
@@ -78,7 +89,6 @@ namespace QuantLib {
7889
std::vector<Spread> spreadValues_;
7990
Compounding comp_;
8091
Frequency freq_;
81-
DayCounter dc_;
8292
Interpolator factory_;
8393
Interpolation interpolator_;
8494
};
@@ -91,18 +101,19 @@ namespace QuantLib {
91101

92102
// inline definitions
93103

104+
#ifndef __DOXYGEN__
105+
94106
template <class T>
95107
inline InterpolatedPiecewiseZeroSpreadedTermStructure<
96108
T>::InterpolatedPiecewiseZeroSpreadedTermStructure(Handle<YieldTermStructure> h,
97-
std::vector<Handle<Quote> > spreads,
98-
const std::vector<Date>& dates,
109+
std::vector<Handle<Quote>> spreads,
110+
std::vector<Date> dates,
99111
Compounding comp,
100112
Frequency freq,
101-
DayCounter dc,
102-
const T& factory)
103-
: originalCurve_(std::move(h)), spreads_(std::move(spreads)), dates_(dates),
104-
times_(dates.size()), spreadValues_(dates.size()), comp_(comp), freq_(freq),
105-
dc_(std::move(dc)), factory_(factory) {
113+
T factory)
114+
: originalCurve_(std::move(h)), spreads_(std::move(spreads)), dates_(std::move(dates)),
115+
times_(dates_.size()), spreadValues_(dates_.size()), comp_(comp), freq_(freq),
116+
factory_(std::move(factory)) {
106117
QL_REQUIRE(!spreads_.empty(), "no spreads given");
107118
QL_REQUIRE(spreads_.size() == dates_.size(),
108119
"spread and date vector have different sizes");
@@ -113,6 +124,21 @@ namespace QuantLib {
113124
updateInterpolation();
114125
}
115126

127+
template <class T>
128+
inline InterpolatedPiecewiseZeroSpreadedTermStructure<
129+
T>::InterpolatedPiecewiseZeroSpreadedTermStructure(Handle<YieldTermStructure> h,
130+
std::vector<Handle<Quote>> spreads,
131+
std::vector<Date> dates,
132+
Compounding comp,
133+
Frequency freq,
134+
DayCounter dc,
135+
T factory)
136+
: InterpolatedPiecewiseZeroSpreadedTermStructure(
137+
std::move(h), std::move(spreads), std::move(dates), comp, freq, std::move(factory)
138+
) {}
139+
140+
#endif
141+
116142
template <class T>
117143
inline DayCounter InterpolatedPiecewiseZeroSpreadedTermStructure<T>::dayCounter() const {
118144
return originalCurve_->dayCounter();
@@ -192,4 +218,4 @@ namespace QuantLib {
192218
}
193219

194220

195-
#endif
221+
#endif

ql/termstructures/yield/zerospreadedtermstructure.hpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,17 @@ namespace QuantLib {
4949
ZeroSpreadedTermStructure(Handle<YieldTermStructure>,
5050
Handle<Quote> spread,
5151
Compounding comp = Continuous,
52-
Frequency freq = NoFrequency,
53-
DayCounter dc = DayCounter());
52+
Frequency freq = NoFrequency);
53+
54+
/*! \deprecated Use the constructor without a day counter.
55+
Deprecated in version 1.41.
56+
*/
57+
[[deprecated("Use the constructor without DayCounter")]]
58+
ZeroSpreadedTermStructure(Handle<YieldTermStructure>,
59+
Handle<Quote> spread,
60+
Compounding comp,
61+
Frequency freq,
62+
DayCounter dc);
5463
//! \name YieldTermStructure interface
5564
//@{
5665
DayCounter dayCounter() const override;
@@ -75,22 +84,26 @@ namespace QuantLib {
7584
Handle<Quote> spread_;
7685
Compounding comp_;
7786
Frequency freq_;
78-
DayCounter dc_;
7987
};
8088

8189
inline ZeroSpreadedTermStructure::ZeroSpreadedTermStructure(Handle<YieldTermStructure> h,
8290
Handle<Quote> spread,
8391
Compounding comp,
84-
Frequency freq,
85-
DayCounter dc)
86-
: originalCurve_(std::move(h)), spread_(std::move(spread)), comp_(comp), freq_(freq),
87-
dc_(std::move(dc)) {
92+
Frequency freq)
93+
: originalCurve_(std::move(h)), spread_(std::move(spread)), comp_(comp), freq_(freq) {
8894
if (!originalCurve_.empty())
8995
enableExtrapolation(originalCurve_->allowsExtrapolation());
9096
registerWith(originalCurve_);
9197
registerWith(spread_);
9298
}
9399

100+
inline ZeroSpreadedTermStructure::ZeroSpreadedTermStructure(Handle<YieldTermStructure> h,
101+
Handle<Quote> spread,
102+
Compounding comp,
103+
Frequency freq,
104+
DayCounter dc)
105+
: ZeroSpreadedTermStructure(std::move(h), std::move(spread), comp, freq) {}
106+
94107
inline DayCounter ZeroSpreadedTermStructure::dayCounter() const {
95108
return originalCurve_->dayCounter();
96109
}

test-suite/capfloor.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -663,9 +663,7 @@ BOOST_AUTO_TEST_CASE(testOptionLetsDelta) {
663663
ext::shared_ptr<YieldTermStructure> spreadCurve(new ZeroSpreadedTermStructure(
664664
baseCurveHandle,
665665
Handle<Quote>(spread),
666-
Continuous,
667-
Annual,
668-
Actual360()));
666+
Continuous));
669667
vars.termStructure.linkTo(spreadCurve);
670668
Date startDate = vars.termStructure->referenceDate();
671669
Leg leg = vars.makeLeg(startDate,20);
@@ -784,9 +782,7 @@ BOOST_AUTO_TEST_CASE(testBachelierOptionLetsDelta) {
784782
ext::shared_ptr<YieldTermStructure> spreadCurve(new ZeroSpreadedTermStructure(
785783
baseCurveHandle,
786784
Handle<Quote>(spread),
787-
Continuous,
788-
Annual,
789-
Actual360()));
785+
Continuous));
790786
vars.termStructure.linkTo(spreadCurve);
791787
Date startDate = vars.termStructure->referenceDate();
792788
Leg leg = vars.makeLeg(startDate,20);

test-suite/piecewisezerospreadedtermstructure.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,14 +368,11 @@ BOOST_AUTO_TEST_CASE(testSetInterpolationFactory) {
368368

369369
Frequency freq = NoFrequency;
370370

371-
Cubic factory;
372-
factory = Cubic(CubicInterpolation::Spline, false);
373-
374371
spreadedTermStructure =
375372
ext::make_shared<InterpolatedPiecewiseZeroSpreadedTermStructure<Cubic> >(
376373
Handle<YieldTermStructure>(vars.termStructure),
377374
spreads, spreadDates, vars.compounding,
378-
freq, vars.dayCount,factory);
375+
freq, Cubic(CubicInterpolation::Spline, false));
379376

380377
Time t = vars.dayCount.yearFraction(vars.today, interpolationDate);
381378
Rate interpolatedZeroRate = spreadedTermStructure->zeroRate(t,vars.compounding);

0 commit comments

Comments
 (0)