Skip to content

Commit c5501a6

Browse files
committed
Revert "Revert "QPR-13700 add option to use par coupons for curve and trade building""
This reverts commit 422c299.
1 parent 422c299 commit c5501a6

36 files changed

Lines changed: 296 additions & 206 deletions

ORE-SWIG/OREAnalytics-SWIG/SWIG/orea_app.i

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ public:
127127
void setBuildFailedTrades(bool b);
128128
void setObservationModel(const std::string& s);
129129
void setImplyTodaysFixings(bool b);
130+
void setUseAtParCouponCurves(bool b);
131+
void setUseAtParCouponTrades(bool b);
130132
void setMarketConfig(const std::string& config, const std::string& context);
131133
void setResultsPath(boost::filesystem::path resultsPath);
132134
void setRefDataManager(const ext::shared_ptr<ore::data::BasicReferenceDataManager>& refDataManager);

OREAnalytics/orea/app/analytic.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ void Analytic::buildMarket(const QuantLib::ext::shared_ptr<ore::data::InMemoryLo
261261
market_ = QuantLib::ext::make_shared<TodaysMarket>(
262262
configurations().asofDate, configurations().todaysMarketParams, loader_, configurations().curveConfig,
263263
inputs()->continueOnError(), false, inputs()->lazyMarketBuilding(), inputs()->refDataManager(), false,
264-
inputs()->iborFallbackConfig());
264+
inputs()->iborFallbackConfig(), true, true, inputs()->useAtParCouponsCurves());
265265
} catch (const std::exception& e) {
266266
if (marketRequired) {
267267
stopTimer("buildMarket()");
@@ -295,7 +295,7 @@ void Analytic::buildPortfolio(const bool emitStructuredError) {
295295

296296
LOG("Build the portfolio");
297297
QuantLib::ext::shared_ptr<EngineFactory> factory = impl()->engineFactory();
298-
portfolio()->build(factory, "analytic/" + label(), emitStructuredError);
298+
portfolio()->build(factory, "analytic/" + label(), emitStructuredError, inputs()->useAtParCouponsTrades());
299299

300300
// remove dates that will have matured
301301
Date maturityDate = inputs()->asof();
@@ -342,9 +342,9 @@ QuantLib::ext::shared_ptr<Loader> implyBondSpreads(const Date& asof,
342342

343343
if (!securities.empty()) {
344344
// always continue on error and always use lazy market building
345-
QuantLib::ext::shared_ptr<Market> market =
346-
QuantLib::ext::make_shared<TodaysMarket>(asof, todaysMarketParams, loader, curveConfigs, true, false, true,
347-
params->refDataManager(), false, params->iborFallbackConfig());
345+
QuantLib::ext::shared_ptr<Market> market = QuantLib::ext::make_shared<TodaysMarket>(
346+
asof, todaysMarketParams, loader, curveConfigs, true, false, true, params->refDataManager(), false,
347+
params->iborFallbackConfig(), false, true, params->useAtParCouponsCurves());
348348
return BondSpreadImply::implyBondSpreads(securities, params->refDataManager(), market, params->pricingEngine(),
349349
Market::defaultConfiguration, params->iborFallbackConfig());
350350
} else {

OREAnalytics/orea/app/analytics/crifanalytic.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ computeSensitivities(QuantLib::ext::shared_ptr<ore::analytics::SensitivityAnalys
6565
analytic->configurations().sensiScenarioData, inputs->sensiRecalibrateModels(),
6666
inputs->sensiLaxFxConversion(), analytic->configurations().curveConfig,
6767
analytic->configurations().todaysMarketParams, false, inputs->refDataManager(),
68-
inputs->iborFallbackConfig(), true, inputs->dryRun(), "analytic/" + analytic->label());
68+
inputs->iborFallbackConfig(), true, inputs->dryRun(), "analytic/" + analytic->label(),
69+
inputs->useAtParCouponsCurves(), inputs->useAtParCouponsTrades());
6970
}
7071

7172
LOG("Sensitivity analysis initialised");
@@ -210,7 +211,8 @@ void CrifAnalyticImpl::runAnalytic(const QuantLib::ext::shared_ptr<ore::data::In
210211
analytic()->startTimer("applySimmExemptions()");
211212
try {
212213
std::tie(removedTrades, modifiedTrades) =
213-
applySimmExemptions(*analytic()->portfolio(), engineFactory(), crifAnalytic->simmExemptionOverrides());
214+
applySimmExemptions(*analytic()->portfolio(), engineFactory(), crifAnalytic->simmExemptionOverrides(),
215+
inputs_->useAtParCouponsTrades());
214216
} catch (std::exception& e) {
215217
QL_FAIL(e.what());
216218
}

OREAnalytics/orea/app/analytics/pnlanalytic.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,8 @@ void PnlAnalyticImpl::runAnalytic(const QuantLib::ext::shared_ptr<ore::data::InM
334334
sensiAnalytic->setMarket(simMarket1);
335335
sensiAnalytic->configurations().simMarketParams = analytic()->configurations().simMarketParams;
336336
sensiAnalytic->configurations().sensiScenarioData = analytic()->configurations().sensiScenarioData;
337-
mporPortfolioNew->build(analytic()->impl()->engineFactory(), "portfolio_t1_m0_p1_new");
337+
mporPortfolioNew->build(analytic()->impl()->engineFactory(), "portfolio_t1_m0_p1_new", true,
338+
inputs_->useAtParCouponsTrades());
338339
sensiAnalytic->setPortfolio(mporPortfolioNew);
339340
sensiAnalytic->buildPortfolio();
340341

OREAnalytics/orea/app/analytics/pricinganalytic.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ void PricingAnalyticImpl::runAnalytic(
159159
analytic()->configurations().sensiScenarioData, inputs_->sensiRecalibrateModels(),
160160
inputs_->sensiLaxFxConversion(), analytic()->configurations().curveConfig,
161161
analytic()->configurations().todaysMarketParams, ccyConv, inputs_->refDataManager(),
162-
inputs_->iborFallbackConfig(), true, inputs_->dryRun());
162+
inputs_->iborFallbackConfig(), true, inputs_->dryRun(), "sensi analysis",
163+
inputs_->useAtParCouponsCurves(), inputs_->useAtParCouponsTrades());
163164
LOG("Multi-threaded sensi analysis created");
164165
}
165166

OREAnalytics/orea/app/analytics/stresstestanalytic.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,21 +99,21 @@ void StressTestAnalyticImpl::runAnalytic(const QuantLib::ext::shared_ptr<ore::da
9999
QuantLib::ext::make_shared<InMemoryReport>(inputs_->reportBufferSize());
100100
analytic()->addReport(label(), "stress_scenarios", scenarioReport);
101101

102-
if (inputs_->scenarioReader()) {
102+
if (inputs_->scenarioReader()) {
103103
runStressTest(analytic()->portfolio(), analytic()->market(), marketConfig, inputs_->pricingEngine(),
104104
analytic()->configurations().simMarketParams, inputs_->scenarioReader(), report, cfReport,
105105
inputs_->stressThreshold(), inputs_->stressPrecision(), inputs_->includePastCashflows(),
106106
*analytic()->configurations().curveConfig, *analytic()->configurations().todaysMarketParams,
107107
inputs_->refDataManager(), inputs_->iborFallbackConfig(), inputs_->continueOnError(),
108-
scenarioReport);
108+
scenarioReport, inputs_->useAtParCouponsTrades());
109109
} else {
110110
QL_REQUIRE(scenarioData, "StressTestAnalytic::runAnalytic: No stress scenario data provided.");
111111
runStressTest(analytic()->portfolio(), analytic()->market(), marketConfig, inputs_->pricingEngine(),
112112
analytic()->configurations().simMarketParams, scenarioData, report, cfReport,
113113
inputs_->stressThreshold(), inputs_->stressPrecision(), inputs_->includePastCashflows(),
114114
*analytic()->configurations().curveConfig, *analytic()->configurations().todaysMarketParams,
115115
nullptr, inputs_->refDataManager(), inputs_->iborFallbackConfig(), inputs_->continueOnError(),
116-
scenarioReport);
116+
scenarioReport, inputs_->useAtParCouponsTrades());
117117
}
118118

119119
analytic()->addReport(label(), "stress", report);

OREAnalytics/orea/app/analytics/varanalytic.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ void ParametricVarAnalyticImpl::setVarReport(const QuantLib::ext::shared_ptr<ore
100100

101101
varReport_ = ext::make_shared<ParametricVarReport>(
102102
inputs_->baseCurrency(), analytic()->portfolio(), inputs_->portfolioFilter(), inputs_->varQuantiles(),
103-
varParams, inputs_->getVarSalvagingAlgorithm(), QuantLib::ext::nullopt, std::move(sensiArgs), inputs_->varBreakDown());
103+
varParams, inputs_->getVarSalvagingAlgorithm(), QuantLib::ext::nullopt, std::move(sensiArgs),
104+
inputs_->varBreakDown(), inputs_->useAtParCouponsCurves(), inputs_->useAtParCouponsTrades());
104105
} else {
105106
TimePeriod benchmarkVarPeriod(parseListOfValues<Date>(inputs_->benchmarkVarPeriod(), &parseDate),
106107
inputs_->mporDays(), inputs_->mporCalendar());
@@ -181,10 +182,10 @@ void HistoricalSimulationVarAnalyticImpl::setVarReport(
181182
simMarket, inputs_->pricingEngine(), inputs_->refDataManager(), inputs_->iborFallbackConfig());
182183

183184
varReport_ = ext::make_shared<HistoricalSimulationVarReport>(
184-
inputs_->baseCurrency(), analytic()->portfolio(), inputs_->portfolioFilter(),
185-
inputs_->varQuantiles(), benchmarkVarPeriod, scenarios, std::move(fullRevalArgs), inputs_->varBreakDown(), inputs_->includeExpectedShortfall(),
186-
inputs_->tradePnl());
187-
185+
inputs_->baseCurrency(), analytic()->portfolio(), inputs_->portfolioFilter(), inputs_->varQuantiles(),
186+
benchmarkVarPeriod, scenarios, std::move(fullRevalArgs), inputs_->varBreakDown(),
187+
inputs_->includeExpectedShortfall(), inputs_->tradePnl(), inputs_->useAtParCouponsCurves(),
188+
inputs_->useAtParCouponsTrades());
188189
}
189190

190191
void HistoricalSimulationVarAnalyticImpl::addAdditionalReports(

OREAnalytics/orea/app/analytics/xvaanalytic.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ XvaAnalyticImpl::classicRun(const QuantLib::ext::shared_ptr<Portfolio>& portfoli
464464
classicPortfolio_->add(trade);
465465
QL_REQUIRE(analytic()->market(), "today's market not set");
466466
QuantLib::ext::shared_ptr<EngineFactory> factory = engineFactory();
467-
classicPortfolio_->build(factory, "analytic/" + label());
467+
classicPortfolio_->build(factory, "analytic/" + label(), true, inputs_->useAtParCouponsTrades());
468468
Date maturityDate = inputs_->asof();
469469
if (inputs_->portfolioFilterDate() != Null<Date>())
470470
maturityDate = inputs_->portfolioFilterDate();
@@ -592,7 +592,8 @@ void XvaAnalyticImpl::buildClassicCube(const QuantLib::ext::shared_ptr<Portfolio
592592
analytic()->configurations().todaysMarketParams, inputs_->marketConfig("simulation"),
593593
analytic()->configurations().simMarketParams, false, false, QuantLib::ext::make_shared<ScenarioFilter>(),
594594
inputs_->refDataManager(), inputs_->iborFallbackConfig(), true, false, false, cubeFactory, {},
595-
cptyCubeFactory, "xva-simulation", offsetScenario_);
595+
cptyCubeFactory, "xva-simulation", offsetScenario_, inputs_->useAtParCouponsCurves(),
596+
inputs_->useAtParCouponsTrades());
596597

597598
engine.setAggregationScenarioData(scenarioData_);
598599
engine.registerProgressIndicator(progressBar);
@@ -663,7 +664,8 @@ void XvaAnalyticImpl::buildAmcPortfolio() {
663664
if (inputs_->amcTradeTypes().find(trade->tradeType()) != inputs_->amcTradeTypes().end()) {
664665
if (inputs_->amcCg() != XvaEngineCG::Mode::CubeGeneration) {
665666
auto t = trade;
666-
auto [ft, success] = buildTrade(t, factory, "analytic/" + label(), false, true, true);
667+
auto [ft, success] =
668+
buildTrade(t, factory, "analytic/" + label(), false, true, true, inputs_->useAtParCouponsTrades());
667669
if (success)
668670
amcPortfolio_->add(trade);
669671
else
@@ -731,7 +733,8 @@ void XvaAnalyticImpl::amcRun(bool doClassicRun, bool continueOnCalibrationError,
731733
inputs_->xvaCgUseRedBlocks(), inputs_->xvaCgUseExternalComputeDevice(),
732734
inputs_->xvaCgExternalDeviceCompatibilityMode(), inputs_->xvaCgUseDoublePrecisionForExternalCalculation(),
733735
inputs_->xvaCgExternalComputeDevice(), inputs_->xvaCgUsePythonIntegration(),
734-
inputs_->xvaCgUsePythonIntegrationDynamicIm(), true, true, true, "xva analytic");
736+
inputs_->xvaCgUsePythonIntegrationDynamicIm(), true, true, true, inputs_->useAtParCouponsCurves(),
737+
inputs_->useAtParCouponsTrades(), "xva analytic");
735738

736739
engine.registerProgressIndicator(progressBar);
737740
engine.registerProgressIndicator(progressLog);
@@ -793,7 +796,8 @@ void XvaAnalyticImpl::amcRun(bool doClassicRun, bool continueOnCalibrationError,
793796
inputs_->marketConfig("simulation"), inputs_->amcPathDataInput(), inputs_->amcPathDataOutput(),
794797
inputs_->amcIndividualTrainingInput(), inputs_->amcIndividualTrainingOutput(),
795798
inputs_->refDataManager(), inputs_->iborFallbackConfig(), true, cubeFactory, offsetScenario_,
796-
simMarketParams, continueOnCalibrationError, allowModelFallbacks);
799+
simMarketParams, continueOnCalibrationError, allowModelFallbacks, inputs_->useAtParCouponsCurves(),
800+
inputs_->useAtParCouponsTrades());
797801

798802
amcEngine.registerProgressIndicator(progressBar);
799803
amcEngine.registerProgressIndicator(progressLog);
@@ -1016,7 +1020,8 @@ void XvaAnalyticImpl::runAnalytic(const QuantLib::ext::shared_ptr<ore::data::InM
10161020
inputs_->xvaCgUseRedBlocks(), inputs_->xvaCgUseExternalComputeDevice(),
10171021
inputs_->xvaCgExternalDeviceCompatibilityMode(), inputs_->xvaCgUseDoublePrecisionForExternalCalculation(),
10181022
inputs_->xvaCgExternalComputeDevice(), inputs_->xvaCgUsePythonIntegration(),
1019-
inputs_->xvaCgUsePythonIntegrationDynamicIm(), true, true, true, "xva analytic");
1023+
inputs_->xvaCgUsePythonIntegrationDynamicIm(), true, true, true, inputs_->useAtParCouponsCurves(),
1024+
inputs_->useAtParCouponsTrades(), "xva analytic");
10201025

10211026
engine.run();
10221027

OREAnalytics/orea/app/inputparameters.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ class InputParameters {
132132
void setBuildFailedTrades(bool b) { buildFailedTrades_ = b; }
133133
void setObservationModel(const std::string& s) { observationModel_ = s; }
134134
void setImplyTodaysFixings(bool b) { implyTodaysFixings_ = b; }
135+
void setUseAtParCouponsCurves(bool b) { useAtParCouponsCurves_ = b; }
136+
void setUseAtParCouponsTrades(bool b) { useAtParCouponsTrades_ = b; }
135137
void setEnrichIndexFixings(bool b) { enrichIndexFixings_ = b; }
136138
void setIgnoreFixingLead(Size i) { ignoreFixingLead_ = i; }
137139
void setIgnoreFixingLag(Size i) { ignoreFixingLag_ = i; }
@@ -609,6 +611,8 @@ class InputParameters {
609611
bool buildFailedTrades() const { return buildFailedTrades_; }
610612
const std::string& observationModel() const { return observationModel_; }
611613
bool implyTodaysFixings() const { return implyTodaysFixings_; }
614+
bool useAtParCouponsCurves() const { return useAtParCouponsCurves_; }
615+
bool useAtParCouponsTrades() const { return useAtParCouponsTrades_; }
612616
bool enrichIndexFixings() const { return enrichIndexFixings_; }
613617
Size ignoreFixingLead() const { return ignoreFixingLead_; }
614618
Size ignoreFixingLag() const { return ignoreFixingLag_; }
@@ -1100,6 +1104,8 @@ class InputParameters {
11001104
bool buildFailedTrades_ = true;
11011105
std::string observationModel_ = "None";
11021106
bool implyTodaysFixings_ = false;
1107+
bool useAtParCouponsCurves_ = true;
1108+
bool useAtParCouponsTrades_ = true;
11031109
bool enrichIndexFixings_ = false;
11041110
Size ignoreFixingLead_ = 0;
11051111
Size ignoreFixingLag_ = 0;

OREAnalytics/orea/app/oreapp.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,14 @@ void OREAppInputParameters::loadParameters() {
752752
if (tmp != "")
753753
setImplyTodaysFixings(ore::data::parseBool(tmp));
754754

755+
tmp = params_->get("setup", "useAtParCouponCurves", false);
756+
if (tmp != "")
757+
setUseAtParCouponsCurves(ore::data::parseBool(tmp));
758+
759+
tmp = params_->get("setup", "useAtParCouponTrades", false);
760+
if (tmp != "")
761+
setUseAtParCouponsTrades(ore::data::parseBool(tmp));
762+
755763
tmp = params_->get("setup", "enrichIndexFixings", false);
756764
if (tmp != "")
757765
setEnrichIndexFixings(ore::data::parseBool(tmp));

0 commit comments

Comments
 (0)