Skip to content

Commit c9374a4

Browse files
pcaspersjenkins
authored andcommitted
Merge branch 'master' of gitlab.acadiasoft.net:qs/oreplus
2 parents 7682a8f + 7b6bb4f commit c9374a4

20 files changed

Lines changed: 389 additions & 190 deletions

OREAnalytics/orea/aggregation/dimregressioncalculator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ void RegressionDynamicInitialMarginCalculator::build() {
194194
Size mporCalendarDays = cubeInterpretation_->getMporCalendarDays(cube_, j);
195195
Real horizonScaling = sqrt(1.0 * horizonCalendarDays_ / mporCalendarDays);
196196

197-
Real stdevDiff = sqrt(variance(accDiff));
197+
Real stdevDiff = sqrt(boost::accumulators::variance(accDiff));
198198
Real E_OneOverNumeraire =
199199
mean(accOneOverNumeraire); // "re-discount" (the stdev is calculated on non-discounted deltaNPVs)
200200

@@ -388,7 +388,7 @@ map<string, Real> RegressionDynamicInitialMarginCalculator::unscaledCurrentDIM()
388388
acc_OneOverNum(1.0 / numeraire);
389389
}
390390
Real E_OneOverNumeraire = mean(acc_OneOverNum);
391-
Real variance_t0 = variance(acc_delMtm);
391+
Real variance_t0 = boost::accumulators::variance(acc_delMtm);
392392
Real sqrt_t0 = sqrt(variance_t0);
393393
t0dimReg[key] = (sqrt_t0 * confidenceLevel * E_OneOverNumeraire);
394394
std::sort(t0_delMtM_dist.begin(), t0_delMtM_dist.end());

OREData/ored/portfolio/builders/currencyswap.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ boost::shared_ptr<PricingEngine> CamAmcCurrencySwapEngineBuilder::engineImpl(con
106106
parsePolynomType(engineParameter("Training.BasisFunction")),
107107
parseSobolBrownianGeneratorOrdering(engineParameter("BrownianBridgeOrdering")),
108108
parseSobolRsgDirectionIntegers(engineParameter("SobolDirectionIntegers")), discountCurves, simulationDates_,
109-
externalModelIndices, parseBool(engineParameter("MinObsDate")));
109+
externalModelIndices, parseBool(engineParameter("MinObsDate")),
110+
parseRegressorModel(engineParameter("RegressorModel", {}, false, "Simple")));
110111

111112
return engine;
112113
}

OREData/ored/portfolio/builders/fxforward.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ boost::shared_ptr<PricingEngine> CamAmcFxForwardEngineBuilder::engineImpl(const
7979
parsePolynomType(engineParameter("Training.BasisFunction")),
8080
parseSobolBrownianGeneratorOrdering(engineParameter("BrownianBridgeOrdering")),
8181
parseSobolRsgDirectionIntegers(engineParameter("SobolDirectionIntegers")), discountCurves, simulationDates_,
82-
externalModelIndices, parseBool(engineParameter("MinObsDate")));
82+
externalModelIndices, parseBool(engineParameter("MinObsDate")),
83+
parseRegressorModel(engineParameter("RegressorModel", {}, false, "Simple")));
8384

8485
return engine;
8586
}

OREData/ored/portfolio/builders/fxoption.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ boost::shared_ptr<PricingEngine> CamAmcFxOptionEngineBuilder::engineImpl(const s
9494
parsePolynomType(engineParameter("Training.BasisFunction")),
9595
parseSobolBrownianGeneratorOrdering(engineParameter("BrownianBridgeOrdering")),
9696
parseSobolRsgDirectionIntegers(engineParameter("SobolDirectionIntegers")), discountCurves, simulationDates_,
97-
externalModelIndices, parseBool(engineParameter("MinObsDate")));
97+
externalModelIndices, parseBool(engineParameter("MinObsDate")),
98+
parseRegressorModel(engineParameter("RegressorModel", {}, false, "Simple")));
9899

99100
return engine;
100101
}

OREData/ored/portfolio/builders/multilegoption.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,8 @@ boost::shared_ptr<PricingEngine> CamAmcMultiLegOptionEngineBuilder::engineImpl(
332332
parsePolynomType(engineParameter("Training.BasisFunction")),
333333
parseSobolBrownianGeneratorOrdering(engineParameter("BrownianBridgeOrdering")),
334334
parseSobolRsgDirectionIntegers(engineParameter("SobolDirectionIntegers")), discountCurves, simulationDates_,
335-
externalModelIndices, parseBool(engineParameter("MinObsDate")));
335+
externalModelIndices, parseBool(engineParameter("MinObsDate")),
336+
parseRegressorModel(engineParameter("RegressorModel", {}, false, "Simple")));
336337

337338
return engine;
338339
}

OREData/ored/portfolio/builders/swap.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ boost::shared_ptr<PricingEngine> CamAmcSwapEngineBuilder::buildMcEngine(const bo
4444
parsePolynomType(engineParameter("Training.BasisFunction")),
4545
parseSobolBrownianGeneratorOrdering(engineParameter("BrownianBridgeOrdering")),
4646
parseSobolRsgDirectionIntegers(engineParameter("SobolDirectionIntegers")), discountCurve, simulationDates,
47-
externalModelIndices, parseBool(engineParameter("MinObsDate")));
47+
externalModelIndices, parseBool(engineParameter("MinObsDate")),
48+
parseRegressorModel(engineParameter("RegressorModel", {}, false, "Simple")));
4849
}
4950

5051
boost::shared_ptr<PricingEngine> CamAmcSwapEngineBuilder::engineImpl(const Currency& ccy) {

OREData/ored/utilities/parsers.cpp

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,7 @@ bool parseBool(const string& s) {
149149
}
150150
}
151151

152-
Calendar parseCalendar(const string& s) {
153-
return CalendarParser::instance().parseCalendar(s);
154-
}
152+
Calendar parseCalendar(const string& s) { return CalendarParser::instance().parseCalendar(s); }
155153

156154
bool isOnePeriod(const string& s) {
157155
if (s.empty())
@@ -278,7 +276,7 @@ DayCounter parseDayCounter(const string& s) {
278276
auto it = m.find(s);
279277
if (it != m.end()) {
280278
return it->second;
281-
279+
282280
} else {
283281
QL_FAIL("DayCounter \"" << s << "\" not recognized");
284282
}
@@ -371,10 +369,8 @@ Compounding parseCompounding(const string& s) {
371369
}
372370

373371
QuantLib::Bond::Price::Type parseBondPriceType(const string& s) {
374-
static map<string, QuantLib::Bond::Price::Type> m = {
375-
{"Clean", QuantLib::Bond::Price::Type::Clean},
376-
{"Dirty", QuantLib::Bond::Price::Type::Dirty}
377-
};
372+
static map<string, QuantLib::Bond::Price::Type> m = {{"Clean", QuantLib::Bond::Price::Type::Clean},
373+
{"Dirty", QuantLib::Bond::Price::Type::Dirty}};
378374

379375
auto it = m.find(s);
380376
if (it != m.end()) {
@@ -608,7 +604,7 @@ Month parseMonth(const string& s) {
608604
}
609605
}
610606

611-
PaymentLag parsePaymentLag(const string& s) {
607+
PaymentLag parsePaymentLag(const string& s) {
612608
Period p;
613609
Natural n;
614610
if (tryParse<Period>(s, p, parsePeriod))
@@ -685,9 +681,10 @@ FdmSchemeDesc parseFdmSchemeDesc(const std::string& s) {
685681
}
686682

687683
AssetClass parseAssetClass(const std::string& s) {
688-
static map<string, AssetClass> assetClasses = {
689-
{"EQ", AssetClass::EQ}, {"FX", AssetClass::FX}, {"COM", AssetClass::COM}, {"IR", AssetClass::IR},
690-
{"INF", AssetClass::INF}, {"CR", AssetClass::CR}, {"BOND", AssetClass::BOND}, {"BOND_INDEX", AssetClass::BOND_INDEX}};
684+
static map<string, AssetClass> assetClasses = {{"EQ", AssetClass::EQ}, {"FX", AssetClass::FX},
685+
{"COM", AssetClass::COM}, {"IR", AssetClass::IR},
686+
{"INF", AssetClass::INF}, {"CR", AssetClass::CR},
687+
{"BOND", AssetClass::BOND}, {"BOND_INDEX", AssetClass::BOND_INDEX}};
691688
auto it = assetClasses.find(s);
692689
if (it != assetClasses.end()) {
693690
return it->second;
@@ -847,7 +844,7 @@ pair<string, string> parseBoostAny(const boost::any& anyType, Size precision) {
847844
} else if (anyType.type() == typeid(double)) {
848845
resultType = "double";
849846
double r = boost::any_cast<double>(anyType);
850-
if(r != Null<Real>())
847+
if (r != Null<Real>())
851848
oss << std::fixed << std::setprecision(precision) << r;
852849
} else if (anyType.type() == typeid(std::string)) {
853850
resultType = "string";
@@ -1045,7 +1042,7 @@ DoubleBarrier::Type parseDoubleBarrierType(const std::string& s) {
10451042
QL_FAIL("DoubleBarrier type \"" << s << "\" not recognized");
10461043
}
10471044
}
1048-
1045+
10491046
ostream& operator<<(ostream& os, InflationSwapConvention::PublicationRoll pr) {
10501047
using IPR = InflationSwapConvention::PublicationRoll;
10511048
if (pr == IPR::None) {
@@ -1289,7 +1286,7 @@ string fxDominance(const string& s1, const string& s2) {
12891286
// JPY at the end (of majors)
12901287
"JPY",
12911288
// JPYIDR and JPYKRW - who knew!
1292-
"IDR", "KRW" };
1289+
"IDR", "KRW"};
12931290

12941291
auto p1 = std::find(dominance.begin(), dominance.end(), s1);
12951292
auto p2 = std::find(dominance.begin(), dominance.end(), s2);
@@ -1387,5 +1384,15 @@ QuantLib::Pillar::Choice parsePillarChoice(const std::string& s) {
13871384
}
13881385
}
13891386

1387+
QuantExt::McMultiLegBaseEngine::RegressorModel parseRegressorModel(const std::string& s) {
1388+
if (s == "Simple")
1389+
return McMultiLegBaseEngine::RegressorModel::Simple;
1390+
else if (s == "LaggedFX")
1391+
return McMultiLegBaseEngine::RegressorModel::LaggedFX;
1392+
else {
1393+
QL_FAIL("RegressorModel '" << s << "' not recognized, expected Simple, LaggedFX");
1394+
}
1395+
}
1396+
13901397
} // namespace data
13911398
} // namespace ore

OREData/ored/utilities/parsers.hpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@
2828
#include <ored/configuration/conventions.hpp>
2929
#include <ored/portfolio/types.hpp>
3030
#include <ored/utilities/log.hpp>
31+
32+
#include <qle/cashflows/commoditycashflow.hpp>
33+
#include <qle/currencies/configurablecurrency.hpp>
34+
#include <qle/indexes/bondindex.hpp>
35+
#include <qle/instruments/cdsoption.hpp>
36+
#include <qle/methods/multipathgeneratorbase.hpp>
37+
#include <qle/models/crossassetmodel.hpp>
38+
#include <qle/pricingengines/mcmultilegbaseengine.hpp>
39+
3140
#include <ql/cashflows/cpicoupon.hpp>
3241
#include <ql/compounding.hpp>
3342
#include <ql/currency.hpp>
@@ -53,13 +62,6 @@
5362
#include <ql/time/period.hpp>
5463
#include <ql/types.hpp>
5564

56-
#include <qle/cashflows/commoditycashflow.hpp>
57-
#include <qle/currencies/configurablecurrency.hpp>
58-
#include <qle/indexes/bondindex.hpp>
59-
#include <qle/instruments/cdsoption.hpp>
60-
#include <qle/methods/multipathgeneratorbase.hpp>
61-
#include <qle/models/crossassetmodel.hpp>
62-
6365
#include <boost/algorithm/string/trim.hpp>
6466
#include <boost/tokenizer.hpp>
6567
#include <boost/variant.hpp>
@@ -564,5 +566,11 @@ std::ostream& operator<<(std::ostream& os, const CreditPortfolioSensitivityDecom
564566
*/
565567
QuantLib::Pillar::Choice parsePillarChoice(const std::string& s);
566568

569+
//! Convert text to QuantExt::McMultiLegBaseEngine::RegressorModel
570+
/*!
571+
\ingroup utilities
572+
*/
573+
QuantExt::McMultiLegBaseEngine::RegressorModel parseRegressorModel(const std::string& s);
574+
567575
} // namespace data
568576
} // namespace ore

QuantExt/qle/pricingengines/mccamcurrencyswapengine.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ McCamCurrencySwapEngine::McCamCurrencySwapEngine(
2828
const Size pricingSamples, const Size calibrationSeed, const Size pricingSeed, const Size polynomOrder,
2929
const LsmBasisSystem::PolynomialType polynomType, const SobolBrownianGenerator::Ordering ordering,
3030
const SobolRsg::DirectionIntegers directionIntegers, const std::vector<Handle<YieldTermStructure>>& discountCurves,
31-
const std::vector<Date>& simulationDates, const std::vector<Size>& externalModelIndices, const bool minimalObsDate)
31+
const std::vector<Date>& simulationDates, const std::vector<Size>& externalModelIndices, const bool minimalObsDate,
32+
const RegressorModel regressorModel)
3233
: McMultiLegBaseEngine(model, calibrationPathGenerator, pricingPathGenerator, calibrationSamples, pricingSamples,
3334
calibrationSeed, pricingSeed, polynomOrder, polynomType, ordering, directionIntegers,
34-
discountCurves, simulationDates, externalModelIndices, minimalObsDate),
35+
discountCurves, simulationDates, externalModelIndices, minimalObsDate, regressorModel),
3536
currencies_(currencies), npvCcy_(npvCcy) {
3637
registerWith(model_);
3738
for (auto const& h : discountCurves)

QuantExt/qle/pricingengines/mccamcurrencyswapengine.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ class McCamCurrencySwapEngine : public McMultiLegBaseEngine, public CurrencySwap
4141
const SobolRsg::DirectionIntegers directionIntegers = SobolRsg::JoeKuoD7,
4242
const std::vector<Handle<YieldTermStructure>>& discountCurves = std::vector<Handle<YieldTermStructure>>(),
4343
const std::vector<Date>& simulationDates = std::vector<Date>(),
44-
const std::vector<Size>& externalModelIndices = std::vector<Size>(), const bool minimalObsDate = true);
44+
const std::vector<Size>& externalModelIndices = std::vector<Size>(), const bool minimalObsDate = true,
45+
const RegressorModel regressorModel = RegressorModel::Simple);
4546

4647
void calculate() const override;
4748
const Handle<CrossAssetModel>& model() const { return model_; }

0 commit comments

Comments
 (0)