Skip to content

Commit b0e143c

Browse files
Merge branch 'QPR-11586' into 'master'
QPR-11586 add ctor for date-dependent strikes Closes QPR-11586 See merge request qs/quantlib!50
2 parents fe0a799 + d8a7100 commit b0e143c

2 files changed

Lines changed: 64 additions & 26 deletions

File tree

ql/termstructures/volatility/optionlet/strippedoptionlet.cpp

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,44 @@ namespace QuantLib {
3333
const Calendar& calendar,
3434
BusinessDayConvention bdc,
3535
ext::shared_ptr<IborIndex> iborIndex,
36-
const std::vector<Date>& optionletDates,
36+
const vector<Date>& optionletDates,
3737
const vector<Rate>& strikes,
38-
vector<vector<Handle<Quote> > > v,
38+
vector<vector<Handle<Quote>>> v,
39+
DayCounter dc,
40+
VolatilityType type,
41+
Real displacement)
42+
: StrippedOptionlet(settlementDays,
43+
calendar,
44+
bdc,
45+
iborIndex,
46+
optionletDates,
47+
vector<vector<Rate>>(optionletDates.size(), strikes),
48+
v,
49+
dc,
50+
type,
51+
displacement) {}
52+
53+
StrippedOptionlet::StrippedOptionlet(Natural settlementDays,
54+
const Calendar& calendar,
55+
BusinessDayConvention bdc,
56+
ext::shared_ptr<IborIndex> iborIndex,
57+
const vector<Date>& optionletDates,
58+
const vector<vector<Rate>>& strikes,
59+
vector<vector<Handle<Quote>>> v,
3960
DayCounter dc,
4061
VolatilityType type,
4162
Real displacement)
4263
: calendar_(calendar), settlementDays_(settlementDays), businessDayConvention_(bdc),
4364
dc_(std::move(dc)), iborIndex_(std::move(iborIndex)), type_(type),
4465
displacement_(displacement), nOptionletDates_(optionletDates.size()),
4566
optionletDates_(optionletDates), optionletTimes_(nOptionletDates_),
46-
optionletAtmRates_(nOptionletDates_), optionletStrikes_(nOptionletDates_, strikes),
47-
nStrikes_(strikes.size()), optionletVolQuotes_(std::move(v)),
48-
optionletVolatilities_(nOptionletDates_, vector<Volatility>(nStrikes_))
49-
50-
{
67+
optionletAtmRates_(nOptionletDates_), optionletStrikes_(strikes),
68+
optionletVolQuotes_(std::move(v)) {
5169
checkInputs();
70+
71+
for (Size i = 0; i < nOptionletDates_; ++i)
72+
optionletVolatilities_.push_back(vector<Volatility>(strikes[i].size()));
73+
5274
registerWith(Settings::instance().evaluationDate());
5375
registerWithMarketData();
5476

@@ -73,28 +95,35 @@ namespace QuantLib {
7395
"non increasing option dates: " << io::ordinal(i) <<
7496
" is " << optionletDates_[i-1] << ", " <<
7597
io::ordinal(i+1) << " is " << optionletDates_[i]);
76-
77-
QL_REQUIRE(nStrikes_==optionletVolQuotes_[0].size(),
78-
"mismatch between strikes(" << optionletStrikes_[0].size() <<
79-
") and vol columns (" << optionletVolQuotes_[0].size() << ")");
80-
for (Size j=1; j<nStrikes_; ++j)
81-
QL_REQUIRE(optionletStrikes_[0][j-1]<optionletStrikes_[0][j],
82-
"non increasing strikes: " << io::ordinal(j) <<
83-
" is " << io::rate(optionletStrikes_[0][j-1]) << ", " <<
84-
io::ordinal(j+1) << " is " << io::rate(optionletStrikes_[0][j]));
85-
}
86-
87-
void StrippedOptionlet::registerWithMarketData()
88-
{
89-
for (Size i=0; i<nOptionletDates_; ++i)
90-
for (Size j=0; j<nStrikes_; ++j)
98+
QL_REQUIRE(nOptionletDates_ == optionletStrikes_.size(),
99+
"mismatch between number of option tenors (" << nOptionletDates_
100+
<< ") and number of strikes ("
101+
<< optionletStrikes_.size() << ")");
102+
for (Size i = 0; i < nOptionletDates_; ++i) {
103+
QL_REQUIRE(optionletStrikes_[i].size() == optionletVolQuotes_[i].size(),
104+
"mismatch between number of option tenors ("
105+
<< nOptionletDates_ << ") and number of vol columns at date " << i
106+
<< " (" << optionletVolQuotes_[i].size());
107+
for (Size j = 1; j < optionletStrikes_[i].size(); ++j)
108+
QL_REQUIRE(optionletStrikes_[i][j - 1] < optionletStrikes_[i][j],
109+
"non increasing strikes at date "
110+
<< i << ": " << io::ordinal(j) << " is "
111+
<< io::rate(optionletStrikes_[0][j - 1]) << ", "
112+
<< io::ordinal(j + 1) << " is "
113+
<< io::rate(optionletStrikes_[0][j]));
114+
}
115+
}
116+
117+
void StrippedOptionlet::registerWithMarketData() {
118+
for (Size i = 0; i < nOptionletDates_; ++i)
119+
for (Size j = 0; j < optionletVolQuotes_[i].size(); ++j)
91120
registerWith(optionletVolQuotes_[i][j]);
92121
}
93122

94123
void StrippedOptionlet::performCalculations() const {
95-
for (Size i=0; i<nOptionletDates_; ++i)
96-
for (Size j=0; j<nStrikes_; ++j)
97-
optionletVolatilities_[i][j] = optionletVolQuotes_[i][j]->value();
124+
for (Size i = 0; i < nOptionletDates_; ++i)
125+
for (Size j = 0; j < optionletVolQuotes_[i].size(); ++j)
126+
optionletVolatilities_[i][j] = optionletVolQuotes_[i][j]->value();
98127
}
99128

100129
const vector<Rate>& StrippedOptionlet::optionletStrikes(Size i) const{

ql/termstructures/volatility/optionlet/strippedoptionlet.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ namespace QuantLib {
4848
DayCounter dc,
4949
VolatilityType type = ShiftedLognormal,
5050
Real displacement = 0.0);
51+
StrippedOptionlet(Natural settlementDays,
52+
const Calendar& calendar,
53+
BusinessDayConvention bdc,
54+
ext::shared_ptr<IborIndex> iborIndex,
55+
const std::vector<Date>& optionletDates,
56+
const std::vector<std::vector<Rate>>& strikes,
57+
std::vector<std::vector<Handle<Quote>>>,
58+
DayCounter dc,
59+
VolatilityType type = ShiftedLognormal,
60+
Real displacement = 0.0);
5161
//! \name StrippedOptionletBase interface
5262
//@{
5363
const std::vector<Rate>& optionletStrikes(Size i) const override;
@@ -85,7 +95,6 @@ namespace QuantLib {
8595
std::vector<Time> optionletTimes_;
8696
mutable std::vector<Rate> optionletAtmRates_;
8797
std::vector<std::vector<Rate> > optionletStrikes_;
88-
Size nStrikes_;
8998

9099
std::vector<std::vector<Handle<Quote> > > optionletVolQuotes_;
91100
mutable std::vector<std::vector<Volatility> > optionletVolatilities_;

0 commit comments

Comments
 (0)