@@ -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 {
0 commit comments