Skip to content

Commit cf4d0c8

Browse files
committed
Merge branch 'QPR-11992' into 'master'
QPR-11992 include time zero and evaluation date in option date interpolation Closes QPR-11992 See merge request qs/quantlib!58
2 parents 1d4bec4 + d706d7c commit cf4d0c8

3 files changed

Lines changed: 28 additions & 22 deletions

File tree

ql/termstructures/volatility/swaption/swaptionvolcube.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,6 @@ namespace QuantLib {
7676
swapIndexBase_->tenor() << ")");
7777

7878
registerWithVolatilitySpread();
79-
registerWith(Settings::instance().evaluationDate());
80-
evaluationDate_ = Settings::instance().evaluationDate();
8179
}
8280

8381
void SwaptionVolatilityCube::registerWithVolatilitySpread()

ql/termstructures/volatility/swaption/swaptionvoldiscrete.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ namespace QuantLib {
3737
optionDates_(nOptionTenors_),
3838
optionTimes_(nOptionTenors_),
3939
optionDatesAsReal_(nOptionTenors_),
40+
optionInterpolatorTimes_(nOptionTenors_ + 1),
41+
optionInterpolatorDatesAsReal_(nOptionTenors_ + 1),
4042
nSwapTenors_(swapTenors.size()),
4143
swapTenors_(swapTenors),
4244
swapLengths_(nSwapTenors_) {
@@ -47,14 +49,12 @@ namespace QuantLib {
4749
checkSwapTenors();
4850
initializeSwapLengths();
4951

50-
optionInterpolator_= LinearInterpolation(optionTimes_.begin(),
51-
optionTimes_.end(),
52-
optionDatesAsReal_.begin());
52+
optionInterpolator_= LinearInterpolation(optionInterpolatorTimes_.begin(),
53+
optionInterpolatorTimes_.end(),
54+
optionInterpolatorDatesAsReal_.begin());
5355
optionInterpolator_.update();
5456
optionInterpolator_.enableExtrapolation();
55-
56-
registerWith(Settings::instance().evaluationDate());
57-
evaluationDate_ = Settings::instance().evaluationDate();
57+
cachedReferenceDate_ = referenceDate();
5858
}
5959

6060
SwaptionVolatilityDiscrete::SwaptionVolatilityDiscrete(
@@ -70,6 +70,8 @@ namespace QuantLib {
7070
optionDates_(nOptionTenors_),
7171
optionTimes_(nOptionTenors_),
7272
optionDatesAsReal_(nOptionTenors_),
73+
optionInterpolatorTimes_(nOptionTenors_ + 1),
74+
optionInterpolatorDatesAsReal_(nOptionTenors_ + 1),
7375
nSwapTenors_(swapTenors.size()),
7476
swapTenors_(swapTenors),
7577
swapLengths_(nSwapTenors_) {
@@ -80,9 +82,9 @@ namespace QuantLib {
8082
checkSwapTenors();
8183
initializeSwapLengths();
8284

83-
optionInterpolator_= LinearInterpolation(optionTimes_.begin(),
84-
optionTimes_.end(),
85-
optionDatesAsReal_.begin());
85+
optionInterpolator_= LinearInterpolation(optionInterpolatorTimes_.begin(),
86+
optionInterpolatorTimes_.end(),
87+
optionInterpolatorDatesAsReal_.begin());
8688
optionInterpolator_.update();
8789
optionInterpolator_.enableExtrapolation();
8890
}
@@ -100,6 +102,8 @@ namespace QuantLib {
100102
optionDates_(optionDates),
101103
optionTimes_(nOptionTenors_),
102104
optionDatesAsReal_(nOptionTenors_),
105+
optionInterpolatorTimes_(nOptionTenors_ + 1),
106+
optionInterpolatorDatesAsReal_(nOptionTenors_ + 1),
103107
nSwapTenors_(swapTenors.size()),
104108
swapTenors_(swapTenors),
105109
swapLengths_(nSwapTenors_) {
@@ -110,9 +114,9 @@ namespace QuantLib {
110114
checkSwapTenors();
111115
initializeSwapLengths();
112116

113-
optionInterpolator_= LinearInterpolation(optionTimes_.begin(),
114-
optionTimes_.end(),
115-
optionDatesAsReal_.begin());
117+
optionInterpolator_= LinearInterpolation(optionInterpolatorTimes_.begin(),
118+
optionInterpolatorTimes_.end(),
119+
optionInterpolatorDatesAsReal_.begin());
116120
optionInterpolator_.update();
117121
optionInterpolator_.enableExtrapolation();
118122
}
@@ -152,17 +156,20 @@ namespace QuantLib {
152156
}
153157

154158
void SwaptionVolatilityDiscrete::initializeOptionDatesAndTimes() const {
159+
optionInterpolatorDatesAsReal_[0] = static_cast<Real>(referenceDate().serialNumber());
155160
for (Size i=0; i<nOptionTenors_; ++i) {
156161
optionDates_[i] = optionDateFromTenor(optionTenors_[i]);
157-
optionDatesAsReal_[i] =
162+
optionDatesAsReal_[i] = optionInterpolatorDatesAsReal_[i + 1] =
158163
static_cast<Real>(optionDates_[i].serialNumber());
159164
}
160165
initializeOptionTimes();
161166
}
162167

163168
void SwaptionVolatilityDiscrete::initializeOptionTimes() const {
164-
for (Size i=0; i<nOptionTenors_; ++i)
165-
optionTimes_[i] = timeFromReference(optionDates_[i]);
169+
optionInterpolatorTimes_[0] = 0.0;
170+
for (Size i = 0; i < nOptionTenors_; ++i) {
171+
optionTimes_[i] = optionInterpolatorTimes_[i + 1] = timeFromReference(optionDates_[i]);
172+
}
166173
}
167174

168175
void SwaptionVolatilityDiscrete::initializeSwapLengths() const {
@@ -173,9 +180,8 @@ namespace QuantLib {
173180
void SwaptionVolatilityDiscrete::performCalculations() const {
174181
// recalculate dates if necessary...
175182
if (moving_) {
176-
Date d = Settings::instance().evaluationDate();
177-
if (evaluationDate_ != d) {
178-
evaluationDate_ = d;
183+
if (cachedReferenceDate_ != referenceDate()) {
184+
cachedReferenceDate_ = referenceDate();
179185
initializeOptionDatesAndTimes();
180186
initializeSwapLengths();
181187
optionInterpolator_.update();

ql/termstructures/volatility/swaption/swaptionvoldiscrete.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,15 @@ namespace QuantLib {
7373
std::vector<Period> optionTenors_;
7474
mutable std::vector<Date> optionDates_;
7575
mutable std::vector<Time> optionTimes_;
76-
mutable std::vector<Real> optionDatesAsReal_;
7776
mutable Interpolation optionInterpolator_;
77+
mutable std::vector<Real> optionDatesAsReal_;
78+
mutable std::vector<Time> optionInterpolatorTimes_;
79+
mutable std::vector<Real> optionInterpolatorDatesAsReal_;
7880

7981
Size nSwapTenors_;
8082
std::vector<Period> swapTenors_;
8183
mutable std::vector<Time> swapLengths_;
82-
mutable Date evaluationDate_;
84+
mutable Date cachedReferenceDate_;
8385
private:
8486
void checkOptionTenors() const;
8587
void checkOptionDates(const Date& reference) const;

0 commit comments

Comments
 (0)