Skip to content

Commit 1a3d44b

Browse files
pcaspersjenkins
authored andcommitted
QPR-11618 add fd engine builder
1 parent 0f1bb74 commit 1a3d44b

3 files changed

Lines changed: 46 additions & 1 deletion

File tree

OREData/ored/portfolio/builders/swaption.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ boost::shared_ptr<PricingEngine> LGMGridBermudanSwaptionEngineBuilder::engineImp
206206
const std::vector<Date>& expiries,
207207
const Date& maturity,
208208
const std::vector<Real>& strikes) {
209-
DLOG("Building Bermudan Swaption engine for trade " << id);
209+
DLOG("Building LGM Grid Bermudan Swaption engine for trade " << id);
210210

211211
boost::shared_ptr<QuantExt::LGM> lgm = model(id, key, expiries, maturity, strikes);
212212

@@ -224,6 +224,29 @@ boost::shared_ptr<PricingEngine> LGMGridBermudanSwaptionEngineBuilder::engineImp
224224
lgm, sy, ny, sx, nx, market_->discountCurve(ccy, configuration(MarketContext::pricing)));
225225
}
226226

227+
boost::shared_ptr<PricingEngine> LGMFDBermudanSwaptionEngineBuilder::engineImpl(const string& id, const string& key,
228+
const std::vector<Date>& expiries,
229+
const Date& maturity,
230+
const std::vector<Real>& strikes) {
231+
DLOG("Building LGM FD Bermudan Swaption engine for trade " << id);
232+
233+
boost::shared_ptr<QuantExt::LGM> lgm = model(id, key, expiries, maturity, strikes);
234+
235+
DLOG("Get engine data");
236+
Size stateGridPoints = parseInteger(engineParameter("StateGridPoints"));
237+
Size timeStepsPerYear = parseInteger(engineParameter("TimeStepsPerYear"));
238+
Real mesherEpsilon = parseReal(engineParameter("MesherEpsilon"));
239+
240+
Real maxTime = lgm->termStructure()->timeFromReference(maturity);
241+
242+
DLOG("Build engine (configuration " << configuration(MarketContext::pricing) << ")");
243+
boost::shared_ptr<IborIndex> index;
244+
std::string ccy = tryParseIborIndex(key, index) ? index->currency().code() : key;
245+
return boost::make_shared<QuantExt::NumericLgmMultiLegOptionEngine>(
246+
lgm, maxTime, stateGridPoints, timeStepsPerYear, mesherEpsilon,
247+
market_->discountCurve(ccy, configuration(MarketContext::pricing)));
248+
}
249+
227250
boost::shared_ptr<PricingEngine> LgmMcBermudanSwaptionEngineBuilder::engineImpl(const string& id, const string& key,
228251
const std::vector<Date>& expiries,
229252
const Date& maturity,

OREData/ored/portfolio/builders/swaption.hpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,27 @@ class LGMGridBermudanSwaptionEngineBuilder : public LGMBermudanSwaptionEngineBui
111111
const std::vector<Real>& strikes) override;
112112
};
113113

114+
//! Implementation of BermudanSwaptionEngineBuilder using LGM FD pricer
115+
/*! \ingroup builders
116+
*/
117+
class LGMFDBermudanSwaptionEngineBuilder : public LGMBermudanSwaptionEngineBuilder {
118+
public:
119+
LGMFDBermudanSwaptionEngineBuilder() : LGMBermudanSwaptionEngineBuilder("FD") {}
120+
121+
protected:
122+
virtual boost::shared_ptr<PricingEngine> engineImpl(
123+
//! a unique (trade) id, for caching
124+
const string& id,
125+
//! the key (index or ccy)
126+
const string& key,
127+
//! Excercise dates
128+
const std::vector<Date>& dates,
129+
//! maturity of the underlying
130+
const Date& maturity,
131+
//! Fixed rate (null means ATM)
132+
const std::vector<Real>& strikes) override;
133+
};
134+
114135
//! Implementation of LGMBermudanSwaptionEngineBuilder using MC pricer
115136
/*! \ingroup portfolio
116137
*/

OREData/ored/utilities/initbuilders.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ void initBuilders() {
418418
ORE_REGISTER_ENGINE_BUILDER(FxTouchOptionEngineBuilder, false)
419419
ORE_REGISTER_ENGINE_BUILDER(EuropeanSwaptionEngineBuilder, false)
420420
ORE_REGISTER_ENGINE_BUILDER(LGMGridBermudanSwaptionEngineBuilder, false)
421+
ORE_REGISTER_ENGINE_BUILDER(LGMFDBermudanSwaptionEngineBuilder, false)
421422
ORE_REGISTER_ENGINE_BUILDER(LgmMcBermudanSwaptionEngineBuilder, false)
422423
ORE_REGISTER_ENGINE_BUILDER(VarSwapEngineBuilder, false)
423424
ORE_REGISTER_ENGINE_BUILDER(FxDoubleTouchOptionAnalyticEngineBuilder, false)

0 commit comments

Comments
 (0)