Skip to content

Commit 8ce406a

Browse files
pcaspersjenkins
authored andcommitted
QPR-11618 expose scheme
1 parent 607757d commit 8ce406a

6 files changed

Lines changed: 39 additions & 23 deletions

File tree

OREData/ored/portfolio/builders/swaption.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ boost::shared_ptr<PricingEngine> LGMFDBermudanSwaptionEngineBuilder::engineImpl(
233233
boost::shared_ptr<QuantExt::LGM> lgm = model(id, key, expiries, maturity, strikes);
234234

235235
DLOG("Get engine data");
236+
QuantLib::FdmSchemeDesc scheme = parseFdmSchemeDesc(engineParameter("Scheme"));
236237
Size stateGridPoints = parseInteger(engineParameter("StateGridPoints"));
237238
Size timeStepsPerYear = parseInteger(engineParameter("TimeStepsPerYear"));
238239
Real mesherEpsilon = parseReal(engineParameter("MesherEpsilon"));
@@ -243,7 +244,7 @@ boost::shared_ptr<PricingEngine> LGMFDBermudanSwaptionEngineBuilder::engineImpl(
243244
boost::shared_ptr<IborIndex> index;
244245
std::string ccy = tryParseIborIndex(key, index) ? index->currency().code() : key;
245246
return boost::make_shared<QuantExt::NumericLgmMultiLegOptionEngine>(
246-
lgm, maxTime, stateGridPoints, timeStepsPerYear, mesherEpsilon,
247+
lgm, maxTime, scheme, stateGridPoints, timeStepsPerYear, mesherEpsilon,
247248
market_->discountCurve(ccy, configuration(MarketContext::pricing)));
248249
}
249250

OREData/ored/utilities/parsers.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -669,11 +669,15 @@ QuantLib::CPI::InterpolationType parseObservationInterpolation(const std::string
669669
}
670670

671671
FdmSchemeDesc parseFdmSchemeDesc(const std::string& s) {
672-
static std::map<std::string, FdmSchemeDesc> m = {
673-
{"Hundsdorfer", FdmSchemeDesc::Hundsdorfer()}, {"Douglas", FdmSchemeDesc::Douglas()},
674-
{"CraigSneyd", FdmSchemeDesc::CraigSneyd()}, {"ModifiedCraigSneyd", FdmSchemeDesc::ModifiedCraigSneyd()},
675-
{"ImplicitEuler", FdmSchemeDesc::ImplicitEuler()}, {"ExplicitEuler", FdmSchemeDesc::ExplicitEuler()},
676-
{"MethodOfLines", FdmSchemeDesc::MethodOfLines()}, {"TrBDF2", FdmSchemeDesc::TrBDF2()}};
672+
static std::map<std::string, FdmSchemeDesc> m = {{"CrankNicolson", FdmSchemeDesc::CrankNicolson()},
673+
{"Hundsdorfer", FdmSchemeDesc::Hundsdorfer()},
674+
{"Douglas", FdmSchemeDesc::Douglas()},
675+
{"CraigSneyd", FdmSchemeDesc::CraigSneyd()},
676+
{"ModifiedCraigSneyd", FdmSchemeDesc::ModifiedCraigSneyd()},
677+
{"ImplicitEuler", FdmSchemeDesc::ImplicitEuler()},
678+
{"ExplicitEuler", FdmSchemeDesc::ExplicitEuler()},
679+
{"MethodOfLines", FdmSchemeDesc::MethodOfLines()},
680+
{"TrBDF2", FdmSchemeDesc::TrBDF2()}};
677681

678682
auto it = m.find(s);
679683
if (it != m.end())

QuantExt/qle/models/lgmfdsolver.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,18 @@
2626
namespace QuantExt {
2727

2828
LgmFdSolver::LgmFdSolver(const boost::shared_ptr<LinearGaussMarkovModel>& model, const Real maxTime,
29-
const Size stateGridPoints, const Size timeStepsPerYear, const Real mesherEpsilon)
30-
: model_(model), maxTime_(maxTime), stateGridPoints_(stateGridPoints), timeStepsPerYear_(timeStepsPerYear),
31-
mesherEpsilon_(mesherEpsilon) {
29+
const QuantLib::FdmSchemeDesc scheme, const Size stateGridPoints, const Size timeStepsPerYear,
30+
const Real mesherEpsilon)
31+
: model_(model), maxTime_(maxTime), scheme_(scheme), stateGridPoints_(stateGridPoints),
32+
timeStepsPerYear_(timeStepsPerYear), mesherEpsilon_(mesherEpsilon) {
3233
mesher_ = boost::make_shared<FdmMesherComposite>(boost::make_shared<FdmSimpleProcess1dMesher>(
3334
stateGridPoints, boost::dynamic_pointer_cast<StochasticProcess1D>(model->stateProcess()), maxTime_,
3435
timeStepsPerYear_, mesherEpsilon_));
3536
mesherLocations_ = RandomVariable(mesher_->locations(0));
3637
operator_ = boost::make_shared<QuantExt::FdmLgmOp>(
3738
mesher_, boost::dynamic_pointer_cast<StochasticProcess1D>(model->stateProcess()));
3839
solver_ = boost::make_shared<FdmBackwardSolver>(
39-
operator_, std::vector<boost::shared_ptr<BoundaryCondition<FdmLinearOp>>>(), nullptr, FdmSchemeDesc::Douglas());
40+
operator_, std::vector<boost::shared_ptr<BoundaryCondition<FdmLinearOp>>>(), nullptr, scheme_);
4041
}
4142

4243
Size LgmFdSolver::gridSize() const { return stateGridPoints_; }

QuantExt/qle/models/lgmfdsolver.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ namespace QuantExt {
3636
class LgmFdSolver : public LgmBackwardSolver {
3737
public:
3838
LgmFdSolver(const boost::shared_ptr<LinearGaussMarkovModel>& model, const Real maxTime = 50.0,
39+
const QuantLib::FdmSchemeDesc scheme = QuantLib::FdmSchemeDesc::Douglas(),
3940
const Size stateGridPoints = 64, const Size timeStepsPerYear = 24, const Real mesherEpsilon = 1E-4);
4041
Size gridSize() const override;
4142
RandomVariable stateGrid(const Real t) const override;
@@ -47,6 +48,7 @@ class LgmFdSolver : public LgmBackwardSolver {
4748
private:
4849
boost::shared_ptr<LinearGaussMarkovModel> model_;
4950
Real maxTime_;
51+
QuantLib::FdmSchemeDesc scheme_;
5052
Size stateGridPoints_;
5153
Size timeStepsPerYear_;
5254
Real mesherEpsilon_;

QuantExt/qle/pricingengines/numericlgmmultilegoptionengine.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -375,11 +375,12 @@ NumericLgmMultiLegOptionEngine::NumericLgmMultiLegOptionEngine(const boost::shar
375375
}
376376

377377
NumericLgmMultiLegOptionEngine::NumericLgmMultiLegOptionEngine(const boost::shared_ptr<LinearGaussMarkovModel>& model,
378-
const Real maxTime, const Size stateGridPoints,
379-
const Size timeStepsPerYear, const Real mesherEpsilon,
378+
const Real maxTime, const QuantLib::FdmSchemeDesc scheme,
379+
const Size stateGridPoints, const Size timeStepsPerYear,
380+
const Real mesherEpsilon,
380381
const Handle<YieldTermStructure>& discountCurve)
381382
: NumericLgmMultiLegOptionEngineBase(
382-
boost::make_shared<LgmFdSolver>(model, maxTime, stateGridPoints, timeStepsPerYear, mesherEpsilon),
383+
boost::make_shared<LgmFdSolver>(model, maxTime, scheme, stateGridPoints, timeStepsPerYear, mesherEpsilon),
383384
discountCurve) {
384385
registerWith(solver_->model());
385386
registerWith(discountCurve_);
@@ -411,11 +412,12 @@ NumericLgmSwaptionEngine::NumericLgmSwaptionEngine(const boost::shared_ptr<Linea
411412
}
412413

413414
NumericLgmSwaptionEngine::NumericLgmSwaptionEngine(const boost::shared_ptr<LinearGaussMarkovModel>& model,
414-
const Real maxTime, const Size stateGridPoints,
415-
const Size timeStepsPerYear, const Real mesherEpsilon,
415+
const Real maxTime, const QuantLib::FdmSchemeDesc scheme,
416+
const Size stateGridPoints, const Size timeStepsPerYear,
417+
const Real mesherEpsilon,
416418
const Handle<YieldTermStructure>& discountCurve)
417419
: NumericLgmMultiLegOptionEngineBase(
418-
boost::make_shared<LgmFdSolver>(model, maxTime, stateGridPoints, timeStepsPerYear, mesherEpsilon),
420+
boost::make_shared<LgmFdSolver>(model, maxTime, scheme, stateGridPoints, timeStepsPerYear, mesherEpsilon),
419421
discountCurve) {
420422
registerWith(solver_->model());
421423
registerWith(discountCurve_);
@@ -446,10 +448,11 @@ NumericLgmNonstandardSwaptionEngine::NumericLgmNonstandardSwaptionEngine(
446448
}
447449

448450
NumericLgmNonstandardSwaptionEngine::NumericLgmNonstandardSwaptionEngine(
449-
const boost::shared_ptr<LinearGaussMarkovModel>& model, const Real maxTime, const Size stateGridPoints,
450-
const Size timeStepsPerYear, const Real mesherEpsilon, const Handle<YieldTermStructure>& discountCurve)
451+
const boost::shared_ptr<LinearGaussMarkovModel>& model, const Real maxTime, const QuantLib::FdmSchemeDesc scheme,
452+
const Size stateGridPoints, const Size timeStepsPerYear, const Real mesherEpsilon,
453+
const Handle<YieldTermStructure>& discountCurve)
451454
: NumericLgmMultiLegOptionEngineBase(
452-
boost::make_shared<LgmFdSolver>(model, maxTime, stateGridPoints, timeStepsPerYear, mesherEpsilon),
455+
boost::make_shared<LgmFdSolver>(model, maxTime, scheme, stateGridPoints, timeStepsPerYear, mesherEpsilon),
453456
discountCurve) {
454457
registerWith(solver_->model());
455458
registerWith(discountCurve_);

QuantExt/qle/pricingengines/numericlgmmultilegoptionengine.hpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@
1818

1919
#pragma once
2020

21-
#include <ql/instruments/nonstandardswaption.hpp>
22-
#include <ql/instruments/swaption.hpp>
2321
#include <qle/instruments/multilegoption.hpp>
2422
#include <qle/models/lgmbackwardsolver.hpp>
2523

24+
#include <ql/instruments/nonstandardswaption.hpp>
25+
#include <ql/instruments/swaption.hpp>
26+
#include <ql/methods/finitedifferences/solvers/fdmbackwardsolver.hpp>
2627
#include <ql/pricingengines/genericmodelengine.hpp>
2728

2829
namespace QuantExt {
@@ -61,6 +62,7 @@ class NumericLgmMultiLegOptionEngine
6162
const Handle<YieldTermStructure>& discountCurve = Handle<YieldTermStructure>());
6263

6364
NumericLgmMultiLegOptionEngine(const boost::shared_ptr<LinearGaussMarkovModel>& model, const Real maxTime = 50.0,
65+
const QuantLib::FdmSchemeDesc scheme = QuantLib::FdmSchemeDesc::Douglas(),
6466
const Size stateGridPoints = 64, const Size timeStepsPerYear = 24,
6567
const Real mesherEpsilon = 1E-4,
6668
const Handle<YieldTermStructure>& discountCurve = Handle<YieldTermStructure>());
@@ -76,6 +78,7 @@ class NumericLgmSwaptionEngine : public QuantLib::GenericEngine<Swaption::argume
7678
const Handle<YieldTermStructure>& discountCurve = Handle<YieldTermStructure>());
7779

7880
NumericLgmSwaptionEngine(const boost::shared_ptr<LinearGaussMarkovModel>& model, const Real maxTime = 50.0,
81+
const QuantLib::FdmSchemeDesc scheme = QuantLib::FdmSchemeDesc::Douglas(),
7982
const Size stateGridPoints = 64, const Size timeStepsPerYear = 24,
8083
const Real mesherEpsilon = 1E-4,
8184
const Handle<YieldTermStructure>& discountCurve = Handle<YieldTermStructure>());
@@ -92,8 +95,10 @@ class NumericLgmNonstandardSwaptionEngine
9295
const Handle<YieldTermStructure>& discountCurve = Handle<YieldTermStructure>());
9396

9497
NumericLgmNonstandardSwaptionEngine(const boost::shared_ptr<LinearGaussMarkovModel>& model,
95-
const Real maxTime = 50.0, const Size stateGridPoints = 64,
96-
const Size timeStepsPerYear = 24, const Real mesherEpsilon = 1E-4,
98+
const Real maxTime = 50.0,
99+
const QuantLib::FdmSchemeDesc scheme = QuantLib::FdmSchemeDesc::Douglas(),
100+
const Size stateGridPoints = 64, const Size timeStepsPerYear = 24,
101+
const Real mesherEpsilon = 1E-4,
97102
const Handle<YieldTermStructure>& discountCurve = Handle<YieldTermStructure>());
98103

99104
void calculate() const override;

0 commit comments

Comments
 (0)