Skip to content

Commit 13360e3

Browse files
committed
QPR-11992 include time zero and evaluation date in option date interpolation
ql pr is here: lballabio#1783
1 parent b22dcd3 commit 13360e3

2 files changed

Lines changed: 24 additions & 17 deletions

File tree

ql/termstructures/volatility/swaption/swaptionvoldiscrete.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,26 @@ namespace QuantLib {
3636
optionTenors_(optionTenors),
3737
optionDates_(nOptionTenors_),
3838
optionTimes_(nOptionTenors_),
39-
optionDatesAsReal_(nOptionTenors_),
39+
optionInterpolatorTimes_(nOptionTenors_ + 1),
40+
optionInterpolatorDatesAsReal_(nOptionTenors_ + 1),
4041
nSwapTenors_(swapTenors.size()),
4142
swapTenors_(swapTenors),
4243
swapLengths_(nSwapTenors_) {
4344

4445
checkOptionTenors();
46+
evaluationDate_ = Settings::instance().evaluationDate();
4547
initializeOptionDatesAndTimes();
4648

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();
5557

5658
registerWith(Settings::instance().evaluationDate());
57-
evaluationDate_ = Settings::instance().evaluationDate();
5859
}
5960

6061
SwaptionVolatilityDiscrete::SwaptionVolatilityDiscrete(
@@ -69,7 +70,8 @@ namespace QuantLib {
6970
optionTenors_(optionTenors),
7071
optionDates_(nOptionTenors_),
7172
optionTimes_(nOptionTenors_),
72-
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
}
@@ -99,7 +101,8 @@ namespace QuantLib {
99101
optionTenors_(nOptionTenors_),
100102
optionDates_(optionDates),
101103
optionTimes_(nOptionTenors_),
102-
optionDatesAsReal_(nOptionTenors_),
104+
optionInterpolatorTimes_(nOptionTenors_ + 1),
105+
optionInterpolatorDatesAsReal_(nOptionTenors_ + 1),
103106
nSwapTenors_(swapTenors.size()),
104107
swapTenors_(swapTenors),
105108
swapLengths_(nSwapTenors_) {
@@ -110,9 +113,9 @@ namespace QuantLib {
110113
checkSwapTenors();
111114
initializeSwapLengths();
112115

113-
optionInterpolator_= LinearInterpolation(optionTimes_.begin(),
114-
optionTimes_.end(),
115-
optionDatesAsReal_.begin());
116+
optionInterpolator_= LinearInterpolation(optionInterpolatorTimes_.begin(),
117+
optionInterpolatorTimes_.end(),
118+
optionInterpolatorDatesAsReal_.begin());
116119
optionInterpolator_.update();
117120
optionInterpolator_.enableExtrapolation();
118121
}
@@ -152,17 +155,20 @@ namespace QuantLib {
152155
}
153156

154157
void SwaptionVolatilityDiscrete::initializeOptionDatesAndTimes() const {
158+
optionInterpolatorDatesAsReal_[0] = static_cast<Real>(evaluationDate_.serialNumber());
155159
for (Size i=0; i<nOptionTenors_; ++i) {
156160
optionDates_[i] = optionDateFromTenor(optionTenors_[i]);
157-
optionDatesAsReal_[i] =
161+
optionInterpolatorDatesAsReal_[i + 1] =
158162
static_cast<Real>(optionDates_[i].serialNumber());
159163
}
160164
initializeOptionTimes();
161165
}
162166

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

168174
void SwaptionVolatilityDiscrete::initializeSwapLengths() const {

ql/termstructures/volatility/swaption/swaptionvoldiscrete.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ 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<Time> optionInterpolatorTimes_;
78+
mutable std::vector<Real> optionInterpolatorDatesAsReal_;
7879

7980
Size nSwapTenors_;
8081
std::vector<Period> swapTenors_;

0 commit comments

Comments
 (0)