Skip to content

Commit 352cd1b

Browse files
committed
Merge branch 'feature/QPR-13700' into 'master'
Resolve QPR-13700 expose useAtParCoupons setting (SwapAgent) Closes QPR-13700 See merge request qs/oreplus!3070
2 parents 422c299 + 8d85add commit 352cd1b

38 files changed

Lines changed: 357 additions & 213 deletions

Docs/UserGuide/parameterisation/ore.tex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ \subsubsection*{Setup}
2727
<Parameter name="fixingDataFile">../../Input/fixings_20160205.txt</Parameter>
2828
<Parameter name="dividendDataFile">../../Input/dividends_20160205.txt</Parameter> <!-- Optional -->
2929
<Parameter name="implyTodaysFixings">Y</Parameter>
30+
<Parameter name="useAtParCouponsCurves">Y</Parameter>
31+
<Parameter name="useAtParCouponsTrades">Y</Parameter>
3032
<Parameter name="curveConfigFile">../../Input/curveconfig.xml</Parameter>
3133
<Parameter name="conventionsFile">../../Input/conventions.xml</Parameter>
3234
<Parameter name="marketConfigFile">../../Input/todaysmarket.xml</Parameter>
@@ -73,6 +75,11 @@ \subsubsection*{Setup}
7375
conventions.xml}, the referenceDataFile {\tt referencedata.xml}, the iborFallbackConfig, the marketDataFile and the
7476
fixingDataFile are explained in the sections below.
7577

78+
\medskip The parameters {\tt useAtParCouponsCurves} and {\tt useAtParCouponsTrades} control whether to use par
79+
approximation or indexed ibor coupons when building curves or building ore trades, respectively. This goes back to the
80+
QuantLib flag \verb+QL_USE_INDEXED_COUPON+ and the associated runtime setting. The default is \verb+true+ for both flags
81+
which is also the default setting when building QuantLib.
82+
7683
\medskip Parameter {\tt calendarAdjustment} includes the {\tt calendarAdjustment.xml} which lists out additional holidays and
7784
business days to be added to specified calendars.
7885

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 setUseAtParCouponsCurves(bool b);
131+
void setUseAtParCouponsTrades(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: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,18 @@ computeSensitivities(QuantLib::ext::shared_ptr<ore::analytics::SensitivityAnalys
5555
sensiAnalysis = QuantLib::ext::make_shared<SensitivityAnalysis>(
5656
portfolio, analytic->market(), Market::defaultConfiguration, inputs->pricingEngine(),
5757
analytic->configurations().simMarketParams, analytic->configurations().sensiScenarioData,
58-
inputs->sensiRecalibrateModels(), inputs->sensiLaxFxConversion(),
59-
analytic->configurations().curveConfig, analytic->configurations().todaysMarketParams, false,
60-
inputs->refDataManager(), inputs->iborFallbackConfig(), true, inputs->dryRun());
58+
inputs->sensiRecalibrateModels(), inputs->sensiLaxFxConversion(), analytic->configurations().curveConfig,
59+
analytic->configurations().todaysMarketParams, false, inputs->refDataManager(),
60+
inputs->iborFallbackConfig(), true, inputs->dryRun(), inputs->useAtParCouponsTrades());
6161
} else {
6262
sensiAnalysis = QuantLib::ext::make_shared<SensitivityAnalysis>(
6363
inputs->nThreads(), inputs->asof(), analytic->loader(), portfolio, Market::defaultConfiguration,
6464
inputs->pricingEngine(), analytic->configurations().simMarketParams,
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: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ void PricingAnalyticImpl::runAnalytic(
148148
analytic()->configurations().simMarketParams, analytic()->configurations().sensiScenarioData,
149149
inputs_->sensiRecalibrateModels(), inputs_->sensiLaxFxConversion(),
150150
analytic()->configurations().curveConfig, analytic()->configurations().todaysMarketParams, ccyConv,
151-
inputs_->refDataManager(), inputs_->iborFallbackConfig(), true, inputs_->dryRun());
151+
inputs_->refDataManager(), inputs_->iborFallbackConfig(), true, inputs_->dryRun(),
152+
inputs_->useAtParCouponsTrades());
152153
LOG("Single-threaded sensi analysis created");
153154
}
154155
else {
@@ -159,7 +160,8 @@ void PricingAnalyticImpl::runAnalytic(
159160
analytic()->configurations().sensiScenarioData, inputs_->sensiRecalibrateModels(),
160161
inputs_->sensiLaxFxConversion(), analytic()->configurations().curveConfig,
161162
analytic()->configurations().todaysMarketParams, ccyConv, inputs_->refDataManager(),
162-
inputs_->iborFallbackConfig(), true, inputs_->dryRun());
163+
inputs_->iborFallbackConfig(), true, inputs_->dryRun(), "sensi analysis",
164+
inputs_->useAtParCouponsCurves(), inputs_->useAtParCouponsTrades());
163165
LOG("Multi-threaded sensi analysis created");
164166
}
165167

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;

0 commit comments

Comments
 (0)