Skip to content

Commit 47a8dad

Browse files
committed
Merge branch 'feature/QPR-10041' into 'master'
QPR-10041 Heston model -> ST Closes QPR-10041 See merge request qs/oreplus!3031
2 parents 4b10c79 + 99edc32 commit 47a8dad

36 files changed

Lines changed: 1928 additions & 1186 deletions

ORE-SWIG/OREData-SWIG/SWIG/ored_volcurves.i

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
%{
2525
using ore::data::GenericYieldVolCurve;
2626
using ore::data::SwaptionVolCurve;
27-
using ore::data::BlackScholesModelBuilderBase;
27+
using ore::data::AssetModelBuilderBase;
2828
using ore::data::LocalVolModelBuilder;
2929
using namespace std;
3030
%}
@@ -79,7 +79,7 @@ class LocalVolModelBuilder : public BlackScholesModelBuilderBase {
7979
const std::vector<Real>& calibrationMoneyness = {-2.0, -1.0, 0.0, 1.0, 2.0},
8080
const std::string& referenceCalibrationGrid = "", const bool dontCalibrate = false,
8181
const Handle<YieldTermStructure>& baseCurve = {});
82-
std::vector<ext::shared_ptr<GeneralizedBlackScholesProcess>> getCalibratedProcesses() const override;
82+
std::vector<ext::shared_ptr<StochasticProcess>> getCalibratedProcesses() const override;
8383
};
8484

8585

OREData/ored/CMakeLists.txt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ marketdata/todaysmarketparameters.cpp
6666
marketdata/wrappedmarket.cpp
6767
marketdata/yieldcurve.cpp
6868
marketdata/yieldvolcurve.cpp
69+
model/assetmodelbuilderbase.cpp
6970
model/blackscholesmodelbuilder.cpp
70-
model/blackscholesmodelbuilderbase.cpp
7171
model/calibrationbasket.cpp
7272
model/calibrationconfiguration.cpp
7373
model/calibrationinstrumentfactory.cpp
@@ -87,6 +87,7 @@ model/eqbsbuilder.cpp
8787
model/eqbsdata.cpp
8888
model/fxbsbuilder.cpp
8989
model/fxbsdata.cpp
90+
model/hestonmodelbuilder.cpp
9091
model/hwbuilder.cpp
9192
model/inflation/infdkbuilder.cpp
9293
model/inflation/infdkdata.cpp
@@ -349,12 +350,16 @@ scripting/engines/scriptedinstrumentamccalculator.cpp
349350
scripting/engines/scriptedinstrumentpricingengine.cpp
350351
scripting/engines/scriptedinstrumentpricingenginecg.cpp
351352
scripting/grammar.cpp
353+
scripting/models/assetmodel.cpp
352354
scripting/models/blackscholes.cpp
353355
scripting/models/blackscholescg.cpp
356+
scripting/models/blackscholeslocalvolbase.cpp
354357
scripting/models/fdgaussiancam.cpp
355358
scripting/models/gaussiancam.cpp
356359
scripting/models/gaussiancamcg.cpp
360+
scripting/models/heston.cpp
357361
scripting/models/lgmcg.cpp
362+
scripting/models/localvol.cpp
358363
scripting/models/modelcg.cpp
359364
scripting/models/modelcgimpl.cpp
360365
scripting/models/modelimpl.cpp
@@ -471,8 +476,8 @@ marketdata/todaysmarketparameters.hpp
471476
marketdata/wrappedmarket.hpp
472477
marketdata/yieldcurve.hpp
473478
marketdata/yieldvolcurve.hpp
479+
model/assetmodelbuilderbase.hpp
474480
model/blackscholesmodelbuilder.hpp
475-
model/blackscholesmodelbuilderbase.hpp
476481
model/calibrationbasket.hpp
477482
model/calibrationconfiguration.hpp
478483
model/calibrationinstrumentfactory.hpp
@@ -492,6 +497,7 @@ model/eqbsbuilder.hpp
492497
model/eqbsdata.hpp
493498
model/fxbsbuilder.hpp
494499
model/fxbsdata.hpp
500+
model/hestonmodelbuilder.hpp
495501
model/hwbuilder.hpp
496502
model/inflation/infdkbuilder.hpp
497503
model/inflation/infdkdata.hpp
@@ -770,13 +776,17 @@ scripting/engines/scriptedinstrumentpricingengine.hpp
770776
scripting/engines/scriptedinstrumentpricingenginecg.hpp
771777
scripting/grammar.hpp
772778
scripting/models/amcmodel.hpp
779+
scripting/models/assetmodel.hpp
773780
scripting/models/blackscholes.hpp
774781
scripting/models/blackscholescg.hpp
782+
scripting/models/blackscholeslocalvolbase.hpp
775783
scripting/models/dummymodel.hpp
776784
scripting/models/fdgaussiancam.hpp
777785
scripting/models/gaussiancam.hpp
778786
scripting/models/gaussiancamcg.hpp
787+
scripting/models/heston.hpp
779788
scripting/models/lgmcg.hpp
789+
scripting/models/localvol.hpp
780790
scripting/models/model.hpp
781791
scripting/models/modelcg.hpp
782792
scripting/models/modelcgimpl.hpp

OREData/ored/model/blackscholesmodelbuilderbase.cpp renamed to OREData/ored/model/assetmodelbuilderbase.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,29 @@
1616
FITNESS FOR A PARTICULAR PURPOSE. See the license for more details.
1717
*/
1818

19-
#include <ored/model/blackscholesmodelbuilderbase.hpp>
19+
#include <ored/model/assetmodelbuilderbase.hpp>
2020
#include <ored/model/utilities.hpp>
2121

2222
namespace ore {
2323
namespace data {
2424

25-
BlackScholesModelBuilderBase::BlackScholesModelBuilderBase(
26-
const Handle<YieldTermStructure>& curve, const QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>& process,
27-
const std::set<Date>& simulationDates, const std::set<Date>& addDates, const Size timeStepsPerYear,
28-
const Handle<YieldTermStructure>& baseCurve)
29-
: BlackScholesModelBuilderBase(std::vector<Handle<YieldTermStructure>>{curve},
30-
std::vector<QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>>{process},
31-
simulationDates, addDates, timeStepsPerYear, baseCurve) {}
25+
AssetModelBuilderBase::AssetModelBuilderBase(const Handle<YieldTermStructure>& curve,
26+
const QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>& process,
27+
const std::set<Date>& simulationDates, const std::set<Date>& addDates,
28+
const Size timeStepsPerYear, const Handle<YieldTermStructure>& baseCurve)
29+
: AssetModelBuilderBase(std::vector<Handle<YieldTermStructure>>{curve},
30+
std::vector<QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>>{process},
31+
simulationDates, addDates, timeStepsPerYear, baseCurve) {}
3232

33-
BlackScholesModelBuilderBase::BlackScholesModelBuilderBase(
33+
AssetModelBuilderBase::AssetModelBuilderBase(
3434
const std::vector<Handle<YieldTermStructure>>& curves,
3535
const std::vector<QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>>& processes,
3636
const std::set<Date>& simulationDates, const std::set<Date>& addDates, const Size timeStepsPerYear,
3737
const Handle<YieldTermStructure>& baseCurve)
3838
: curves_(curves), baseCurve_(baseCurve), processes_(processes), simulationDates_(simulationDates),
3939
addDates_(addDates), timeStepsPerYear_(timeStepsPerYear) {
4040

41-
QL_REQUIRE(!curves_.empty(), "BlackScholesModelBuilderBase: no curves given");
41+
QL_REQUIRE(!curves_.empty(), "AssetModelBuilderBase: no curves given");
4242

4343
marketObserver_ = QuantLib::ext::make_shared<MarketObserver>();
4444

@@ -59,7 +59,7 @@ BlackScholesModelBuilderBase::BlackScholesModelBuilderBase(
5959
alwaysForwardNotifications();
6060

6161
allCurves_ = curves_;
62-
if(!baseCurve_.empty())
62+
if (!baseCurve_.empty())
6363
allCurves_.push_back(baseCurve_);
6464
for (auto const& p : processes_) {
6565
vols_.push_back(p->blackVolatility());
@@ -68,29 +68,29 @@ BlackScholesModelBuilderBase::BlackScholesModelBuilderBase(
6868
}
6969
}
7070

71-
BlackScholesModelBuilderBase::BlackScholesModelBuilderBase(
72-
const Handle<YieldTermStructure>& curve, const QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>& process)
73-
: BlackScholesModelBuilderBase(curve, process, {}, {}, 1) {}
71+
AssetModelBuilderBase::AssetModelBuilderBase(const Handle<YieldTermStructure>& curve,
72+
const QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>& process)
73+
: AssetModelBuilderBase(curve, process, {}, {}, 1) {}
7474

75-
Handle<BlackScholesModelWrapper> BlackScholesModelBuilderBase::model() const {
75+
Handle<AssetModelWrapper> AssetModelBuilderBase::model() const {
7676
calculate();
7777
return model_;
7878
}
7979

80-
bool BlackScholesModelBuilderBase::requiresRecalibration() const {
80+
bool AssetModelBuilderBase::requiresRecalibration() const {
8181
setupDatesAndTimes();
8282
return calibrationPointsChanged(false) || marketObserver_->hasUpdated(false) || forceCalibration_;
8383
}
8484

85-
void BlackScholesModelBuilderBase::newCalcWithoutRecalibration() const { calculate(); }
85+
void AssetModelBuilderBase::newCalcWithoutRecalibration() const { calculate(); }
8686

87-
void BlackScholesModelBuilderBase::forceRecalculate() {
87+
void AssetModelBuilderBase::forceRecalculate() {
8888
forceCalibration_ = true;
8989
ModelBuilder::forceRecalculate();
9090
forceCalibration_ = false;
9191
}
9292

93-
void BlackScholesModelBuilderBase::setupDatesAndTimes() const {
93+
void AssetModelBuilderBase::setupDatesAndTimes() const {
9494
Date referenceDate = curves_.front()->referenceDate();
9595
effectiveSimulationDates_.clear();
9696
effectiveSimulationDates_.insert(referenceDate);
@@ -108,7 +108,7 @@ void BlackScholesModelBuilderBase::setupDatesAndTimes() const {
108108
discretisationTimeGrid_ = TimeGrid(times.begin(), times.end(), steps);
109109
}
110110

111-
void BlackScholesModelBuilderBase::performCalculations() const {
111+
void AssetModelBuilderBase::performCalculations() const {
112112
if (requiresRecalibration()) {
113113

114114
// update vol and curves cache
@@ -121,15 +121,15 @@ void BlackScholesModelBuilderBase::performCalculations() const {
121121

122122
// setup model
123123

124-
model_.linkTo(QuantLib::ext::make_shared<BlackScholesModelWrapper>(getCalibratedProcesses(), effectiveSimulationDates_,
125-
discretisationTimeGrid_));
124+
model_.linkTo(QuantLib::ext::make_shared<AssetModelWrapper>(
125+
processType(), getCalibratedProcesses(), effectiveSimulationDates_, discretisationTimeGrid_));
126126

127127
// notify model observers
128128
model_->notifyObservers();
129129
}
130130
}
131131

132-
bool BlackScholesModelBuilderBase::calibrationPointsChanged(const bool updateCache) const {
132+
bool AssetModelBuilderBase::calibrationPointsChanged(const bool updateCache) const {
133133

134134
// get times for curves and times / strikes for vols
135135

OREData/ored/model/blackscholesmodelbuilderbase.hpp renamed to OREData/ored/model/assetmodelbuilderbase.hpp

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
FITNESS FOR A PARTICULAR PURPOSE. See the license for more details.
1717
*/
1818

19-
/*! \file ored/model/blackscholesmodelbuilderbase.hpp
20-
\brief builder for an array of black scholes processes
19+
/*! \file ored/model/assetmodelbuilderbase.hpp
20+
\brief builder for an array of processes
2121
\ingroup utilities
2222
*/
2323

@@ -28,7 +28,7 @@
2828
#include <qle/models/marketobserver.hpp>
2929
#include <qle/models/modelbuilder.hpp>
3030

31-
#include <qle/models/blackscholesmodelwrapper.hpp>
31+
#include <qle/models/assetmodelwrapper.hpp>
3232

3333
#include <ql/processes/blackscholesprocess.hpp>
3434

@@ -38,19 +38,18 @@ namespace data {
3838
using namespace QuantExt;
3939
using namespace QuantLib;
4040

41-
class BlackScholesModelBuilderBase : public ModelBuilder {
41+
class AssetModelBuilderBase : public ModelBuilder {
4242
public:
43-
BlackScholesModelBuilderBase(
44-
const std::vector<Handle<YieldTermStructure>>& curves,
45-
const std::vector<QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>>& processes,
46-
const std::set<Date>& simulationDates, const std::set<Date>& addDates, const Size timeStepsPerYear,
47-
const Handle<YieldTermStructure>& baseCurve = {});
48-
BlackScholesModelBuilderBase(const Handle<YieldTermStructure>& curve,
49-
const QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>& process,
50-
const std::set<Date>& simulationDates, const std::set<Date>& addDates,
51-
const Size timeStepsPerYear, const Handle<YieldTermStructure>& baseCurve = {});
52-
53-
Handle<BlackScholesModelWrapper> model() const;
43+
AssetModelBuilderBase(const std::vector<Handle<YieldTermStructure>>& curves,
44+
const std::vector<QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>>& processes,
45+
const std::set<Date>& simulationDates, const std::set<Date>& addDates,
46+
const Size timeStepsPerYear, const Handle<YieldTermStructure>& baseCurve = {});
47+
AssetModelBuilderBase(const Handle<YieldTermStructure>& curve,
48+
const QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>& process,
49+
const std::set<Date>& simulationDates, const std::set<Date>& addDates,
50+
const Size timeStepsPerYear, const Handle<YieldTermStructure>& baseCurve = {});
51+
52+
Handle<AssetModelWrapper> model() const;
5453

5554
//! \name ModelBuilder interface
5655
//@{
@@ -61,16 +60,16 @@ class BlackScholesModelBuilderBase : public ModelBuilder {
6160

6261
protected:
6362
// generic ctor, you should override setupDateAndTimes() if using this one
64-
BlackScholesModelBuilderBase(const Handle<YieldTermStructure>& curve,
65-
const QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>& process);
63+
AssetModelBuilderBase(const Handle<YieldTermStructure>& curve,
64+
const QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>& process);
6665

6766
virtual void setupDatesAndTimes() const;
6867

69-
virtual std::vector<QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>> getCalibratedProcesses() const = 0;
68+
virtual AssetModelWrapper::ProcessType processType() const = 0;
69+
virtual std::vector<QuantLib::ext::shared_ptr<StochasticProcess>> getCalibratedProcesses() const = 0;
7070
virtual std::vector<std::vector<Real>> getCurveTimes() const = 0;
7171
virtual std::vector<std::vector<std::pair<Real, Real>>> getVolTimesStrikes() const = 0;
7272

73-
7473
void performCalculations() const override;
7574
bool calibrationPointsChanged(const bool updateCache) const;
7675

@@ -83,7 +82,7 @@ class BlackScholesModelBuilderBase : public ModelBuilder {
8382
mutable std::set<Date> effectiveSimulationDates_; // the dates effectively simulated (including today)
8483
mutable TimeGrid discretisationTimeGrid_; // the (possibly refined) time grid for the simulation
8584

86-
mutable RelinkableHandle<BlackScholesModelWrapper> model_;
85+
mutable RelinkableHandle<AssetModelWrapper> model_;
8786

8887
bool forceCalibration_ = false;
8988
QuantLib::ext::shared_ptr<MarketObserver> marketObserver_;

OREData/ored/model/blackscholesmodelbuilder.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ BlackScholesModelBuilder::BlackScholesModelBuilder(
2828
const std::set<Date>& simulationDates, const std::set<Date>& addDates, const Size timeStepsPerYear,
2929
const std::string& calibration, const std::vector<std::vector<Real>>& calibrationStrikes,
3030
const Handle<YieldTermStructure>& baseCurve)
31-
: BlackScholesModelBuilderBase(curves, processes, simulationDates, addDates, timeStepsPerYear, baseCurve),
31+
: AssetModelBuilderBase(curves, processes, simulationDates, addDates, timeStepsPerYear, baseCurve),
3232
calibration_(calibration),
3333
calibrationStrikes_(calibrationStrikes.empty() ? std::vector<std::vector<Real>>(processes.size())
3434
: calibrationStrikes) {
@@ -42,13 +42,15 @@ BlackScholesModelBuilder::BlackScholesModelBuilder(
4242
const std::set<Date>& simulationDates, const std::set<Date>& addDates, const Size timeStepsPerYear,
4343
const std::string& calibration, const std::vector<Real>& calibrationStrikes,
4444
const Handle<YieldTermStructure>& baseCurve)
45-
: BlackScholesModelBuilderBase(curve, process, simulationDates, addDates, timeStepsPerYear, baseCurve),
45+
: AssetModelBuilderBase(curve, process, simulationDates, addDates, timeStepsPerYear, baseCurve),
4646
calibration_(calibration), calibrationStrikes_(1, calibrationStrikes) {}
4747

48-
std::vector<QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>>
49-
BlackScholesModelBuilder::getCalibratedProcesses() const {
48+
std::vector<QuantLib::ext::shared_ptr<StochasticProcess>> BlackScholesModelBuilder::getCalibratedProcesses() const {
5049
// nothing to do, return original processes
51-
return processes_;
50+
std::vector<QuantLib::ext::shared_ptr<StochasticProcess>> result(processes_.size());
51+
std::transform(processes_.begin(), processes_.end(), result.begin(),
52+
[](const QuantLib::ext::shared_ptr<StochasticProcess>& p) { return p; });
53+
return result;
5254
}
5355

5456
std::vector<std::vector<Real>> BlackScholesModelBuilder::getCurveTimes() const {
@@ -84,5 +86,9 @@ std::vector<std::vector<std::pair<Real, Real>>> BlackScholesModelBuilder::getVol
8486
return volTimesStrikes;
8587
}
8688

89+
AssetModelWrapper::ProcessType BlackScholesModelBuilder::processType() const {
90+
return AssetModelWrapper::ProcessType::BlackScholes;
91+
}
92+
8793
} // namespace data
8894
} // namespace ore

OREData/ored/model/blackscholesmodelbuilder.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@
2323

2424
#pragma once
2525

26-
#include <ored/model/blackscholesmodelbuilderbase.hpp>
26+
#include <ored/model/assetmodelbuilderbase.hpp>
2727

2828
namespace ore {
2929
namespace data {
3030

3131
using namespace ore::data;
3232
using namespace QuantLib;
3333

34-
class BlackScholesModelBuilder : public BlackScholesModelBuilderBase {
34+
class BlackScholesModelBuilder final : public AssetModelBuilderBase {
3535
public:
3636
BlackScholesModelBuilder(const std::vector<Handle<YieldTermStructure>>& curves,
3737
const std::vector<QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>>& processes,
@@ -46,7 +46,9 @@ class BlackScholesModelBuilder : public BlackScholesModelBuilderBase {
4646
const std::vector<Real>& calibrationStrikes = {},
4747
const Handle<YieldTermStructure>& baseCurve = {});
4848

49-
std::vector<QuantLib::ext::shared_ptr<GeneralizedBlackScholesProcess>> getCalibratedProcesses() const override;
49+
std::vector<QuantLib::ext::shared_ptr<StochasticProcess>> getCalibratedProcesses() const override;
50+
51+
AssetModelWrapper::ProcessType processType() const override;
5052

5153
protected:
5254
std::vector<std::vector<Real>> getCurveTimes() const override;

0 commit comments

Comments
 (0)