Skip to content

Commit 6840c20

Browse files
author
sebastien.bouvard
committed
QPR-11556 Resolve fixing issue
1 parent ae31445 commit 6840c20

6 files changed

Lines changed: 17 additions & 27 deletions

File tree

OREAnalytics/orea/scenario/scenariosimmarket.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@
5959
#include <qle/termstructures/interpolateddiscountcurve2.hpp>
6060
#include <qle/termstructures/pricecurve.hpp>
6161
#include <qle/termstructures/pricetermstructureadapter.hpp>
62-
#include <qle/termstructures/proxyoptionletvolatility.hpp>
6362
#include <qle/termstructures/proxyswaptionvolatility.hpp>
6463
#include <qle/termstructures/spreadedblackvolatilitycurve.hpp>
6564
#include <qle/termstructures/spreadedblackvolatilitysurfacemoneyness.hpp>
@@ -1207,13 +1206,8 @@ ScenarioSimMarket::ScenarioSimMarket(
12071206
string decayModeString = parameters->capFloorVolDecayMode();
12081207
ReactionToTimeDecay decayMode = parseDecayMode(decayModeString);
12091208

1210-
auto proxyVolConfig = QuantLib::ext::dynamic_pointer_cast<ProxyOptionletVolatility>(*wrapper);
1211-
QuantLib::ext::shared_ptr<OptionletVolatilityStructure> capletVol = nullptr;
1212-
if(proxyVolConfig){
1213-
capletVol = QuantLib::ext::make_shared<DynamicOptionletVolatilityStructure>(*wrapper, NullCalendar(), decayMode);
1214-
}else{
1215-
capletVol = QuantLib::ext::make_shared<DynamicOptionletVolatilityStructure>(*wrapper, 0, NullCalendar(), decayMode);
1216-
}
1209+
QuantLib::ext::shared_ptr<OptionletVolatilityStructure> capletVol =
1210+
QuantLib::ext::make_shared<DynamicOptionletVolatilityStructure>(*wrapper, 0, NullCalendar(), decayMode);
12171211

12181212
hCapletVol = Handle<OptionletVolatilityStructure>(capletVol);
12191213
}

OREData/ored/portfolio/capfloor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ void CapFloor::build(const QuantLib::ext::shared_ptr<EngineFactory>& engineFacto
548548
QuantLib::ext::make_shared<VanillaInstrument>(qlInstrument, multiplier, additionalInstruments, additionalMultipliers);
549549

550550
// axdd required fixings
551-
auto fdg = QuantLib::ext::make_shared<FixingDateGetter>(requiredFixings_, engineFactory->market());
551+
auto fdg = QuantLib::ext::make_shared<FixingDateGetter>(requiredFixings_, engineFactory->market(), maturity_);
552552
for (auto const& l : legs_)
553553
addToRequiredFixings(l, fdg);
554554

OREData/ored/portfolio/fixingdates.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,17 @@ void FixingDateGetter::visit(QuantExt::CappedFlooredOvernightIndexedCoupon& c) {
644644
QuantLib::ext::shared_ptr<QuantExt::ProxyOptionletVolatility> pov = QuantLib::ext::dynamic_pointer_cast<QuantExt::ProxyOptionletVolatility>(source);
645645
if(pov){
646646
QuantLib::ext::shared_ptr<QuantLib::IborIndex> baseIndex = pov->getBaseIndex();
647-
requiredFixings_.addFixingDates(c.underlying()->fixingDates(), IndexNameTranslator::instance().oreName(baseIndex->name()), c.date());
647+
// Create a window of fixings [min, max_] to cover all potential fixings
648+
auto test = c.underlying()->fixingDates();
649+
std::sort(test.begin(), test.end());
650+
QuantLib::Date minDate = test.front() > Settings::instance().evaluationDate()?Settings::instance().evaluationDate():test.front();
651+
std::vector<QuantLib::Date> businessDates;
652+
for (QuantLib::Date d = minDate; d <= max_; d = d + 1) {
653+
if (baseIndex->fixingCalendar().isBusinessDay(d)) {
654+
businessDates.push_back(d);
655+
}
656+
}
657+
requiredFixings_.addFixingDates(businessDates, IndexNameTranslator::instance().oreName(baseIndex->name()), c.date());
648658
}
649659
}
650660
}

OREData/ored/portfolio/fixingdates.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,8 @@ class FixingDateGetter : public QuantLib::AcyclicVisitor,
276276

277277
public:
278278
//! Constructor
279-
FixingDateGetter(RequiredFixings& requiredFixings, const QuantLib::ext::shared_ptr<ore::data::Market>& market = nullptr) :
280-
requiredFixings_(requiredFixings), market_(market) {}
279+
FixingDateGetter(RequiredFixings& requiredFixings, const QuantLib::ext::shared_ptr<ore::data::Market>& market = nullptr, const QuantLib::Date& maturity = Null<Date>()) :
280+
requiredFixings_(requiredFixings), market_(market), max_(maturity) {}
281281

282282
//! \name Visitor interface
283283
//@{
@@ -329,6 +329,7 @@ class FixingDateGetter : public QuantLib::AcyclicVisitor,
329329
private:
330330
// flag to indicate if coupon start date fixings are always required, even if initial prices provided
331331
bool requireFixingStartDates_ = false;
332+
QuantLib::Date max_;
332333
// We may need fixings for an additional FX Index at every fixing date
333334
QuantLib::ext::shared_ptr<QuantExt::FxIndex> additionalFxIndex_;
334335
};

QuantExt/qle/termstructures/dynamicoptionletvolatilitystructure.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,6 @@ DynamicOptionletVolatilityStructure::DynamicOptionletVolatilityStructure(
3030
enableExtrapolation(source->allowsExtrapolation());
3131
}
3232

33-
DynamicOptionletVolatilityStructure::DynamicOptionletVolatilityStructure(
34-
const QuantLib::ext::shared_ptr<OptionletVolatilityStructure>& source, const Calendar& calendar,
35-
ReactionToTimeDecay decayMode)
36-
: OptionletVolatilityStructure(source->referenceDate(), calendar, source->businessDayConvention(), source->dayCounter()),
37-
source_(source), decayMode_(decayMode), originalReferenceDate_(source->referenceDate()),
38-
volatilityType_(source->volatilityType()), displacement_(source->displacement()) {
39-
QL_REQUIRE(decayMode_ != ForwardForwardVariance,
40-
"ForwardVariance not yet supported for DynamicOptionletVolatilityStructure");
41-
enableExtrapolation(source->allowsExtrapolation());
42-
}
43-
4433
Rate DynamicOptionletVolatilityStructure::minStrike() const { return source_->minStrike(); }
4534

4635
Rate DynamicOptionletVolatilityStructure::maxStrike() const { return source_->maxStrike(); }

QuantExt/qle/termstructures/dynamicoptionletvolatilitystructure.hpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,6 @@ class DynamicOptionletVolatilityStructure : public OptionletVolatilityStructure
4646
DynamicOptionletVolatilityStructure(const QuantLib::ext::shared_ptr<OptionletVolatilityStructure>& source,
4747
Natural settlementDays, const Calendar& calendar,
4848
ReactionToTimeDecay decayMode = ConstantVariance);
49-
// Constructor to initialize with a fixed reference date
50-
DynamicOptionletVolatilityStructure(const QuantLib::ext::shared_ptr<OptionletVolatilityStructure>& source,
51-
const Calendar& calendar,
52-
ReactionToTimeDecay decayMode = ConstantVariance);
5349

5450
QuantLib::ext::shared_ptr<OptionletVolatilityStructure> getSource() { return source_; }
5551

0 commit comments

Comments
 (0)