@@ -78,27 +78,8 @@ QuantLib::ext::shared_ptr<SmileSection> ProxyOptionletVolatility::smileSectionIm
7878
7979 // compute the base and target forward rate levels
8080
81- Real baseAtmLevel;
82- if (isOis (baseIndex_))
83- baseAtmLevel = getOisAtmLevel (QuantLib::ext::dynamic_pointer_cast<OvernightIndex>(baseIndex_),
84- baseIndex_->fixingCalendar ().adjust (fixingDate), baseRateComputationPeriod_);
85- else if (isBMA (baseIndex_))
86- baseAtmLevel = getBMAAtmLevel (QuantLib::ext::dynamic_pointer_cast<BMAIndexWrapper>(baseIndex_)->bma (),
87- baseIndex_->fixingCalendar ().adjust (fixingDate), baseRateComputationPeriod_);
88- else
89- baseAtmLevel = baseIndex_->fixing (baseIndex_->fixingCalendar ().adjust (fixingDate));
90-
91- Real targetAtmLevel;
92- if (isOis (targetIndex_))
93- targetAtmLevel =
94- getOisAtmLevel (QuantLib::ext::dynamic_pointer_cast<OvernightIndex>(targetIndex_),
95- targetIndex_->fixingCalendar ().adjust (fixingDate), targetRateComputationPeriod_);
96- else if (isBMA (targetIndex_))
97- targetAtmLevel =
98- getBMAAtmLevel (QuantLib::ext::dynamic_pointer_cast<BMAIndexWrapper>(targetIndex_)->bma (),
99- targetIndex_->fixingCalendar ().adjust (fixingDate), targetRateComputationPeriod_);
100- else
101- targetAtmLevel = targetIndex_->fixing (targetIndex_->fixingCalendar ().adjust (fixingDate));
81+ Real baseAtmLevel = ProxyOptionletVolatility::getAtmLevel (fixingDate, baseIndex_, baseRateComputationPeriod_);
82+ Real targetAtmLevel = ProxyOptionletVolatility::getAtmLevel (fixingDate, targetIndex_, targetRateComputationPeriod_);
10283
10384 // build the atm-adjusted smile section and return it
10485
@@ -111,4 +92,18 @@ Volatility ProxyOptionletVolatility::volatilityImpl(Time optionTime, Rate strike
11192 return smileSection (optionTime)->volatility (strike) * scalingFactor_;
11293}
11394
95+ Real ProxyOptionletVolatility::getAtmLevel (
96+ const QuantLib::Date& fixingDate,
97+ const QuantLib::ext::shared_ptr<QuantLib::IborIndex>& index,
98+ const QuantLib::Period& rateComputationPeriod) {
99+ if (isOis (index))
100+ return getOisAtmLevel (QuantLib::ext::dynamic_pointer_cast<OvernightIndex>(index),
101+ index->fixingCalendar ().adjust (fixingDate), rateComputationPeriod);
102+ else if (isBMA (index))
103+ return getBMAAtmLevel (QuantLib::ext::dynamic_pointer_cast<BMAIndexWrapper>(index)->bma (),
104+ index->fixingCalendar ().adjust (fixingDate), rateComputationPeriod);
105+ else
106+ return index->fixing (index->fixingCalendar ().adjust (fixingDate));
107+ }
108+
114109} // namespace QuantExt
0 commit comments