Skip to content

Commit 415f3f0

Browse files
pcaspersjenkins
authored andcommitted
QPR-11960 populate credit state data in asd in amc valuation engine
1 parent 31ce0d4 commit 415f3f0

4 files changed

Lines changed: 35 additions & 22 deletions

File tree

OREAnalytics/orea/app/analytics/xvaanalytic.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,8 @@ void XvaAnalyticImpl::amcRun(bool doClassicRun) {
452452
initCube(amcCube_, amcPortfolio_->ids(), cubeDepth_);
453453
AMCValuationEngine amcEngine(model_, inputs_->scenarioGeneratorData(), analytic()->market(),
454454
inputs_->exposureSimMarketParams()->additionalScenarioDataIndices(),
455-
inputs_->exposureSimMarketParams()->additionalScenarioDataCcys());
455+
inputs_->exposureSimMarketParams()->additionalScenarioDataCcys(),
456+
inputs_->exposureSimMarketParams()->additionalScenarioDataNumberOfCreditStates());
456457
amcEngine.registerProgressIndicator(progressBar);
457458
amcEngine.registerProgressIndicator(progressLog);
458459
// We only need to generate asd, if this does not happen in the classic run
@@ -469,15 +470,17 @@ void XvaAnalyticImpl::amcRun(bool doClassicRun) {
469470
return boost::make_shared<SinglePrecisionInMemoryCubeN>(asof, ids, dates, samples,
470471
cubeDepth_, 0.0f);
471472
};
472-
AMCValuationEngine amcEngine(
473-
inputs_->nThreads(), inputs_->asof(), samples_, analytic()->loader(), inputs_->scenarioGeneratorData(),
474-
inputs_->exposureSimMarketParams()->additionalScenarioDataIndices(),
475-
inputs_->exposureSimMarketParams()->additionalScenarioDataCcys(), inputs_->crossAssetModelData(),
476-
inputs_->amcPricingEngine(), inputs_->curveConfigs().get(), analytic()->configurations().todaysMarketParams,
477-
inputs_->marketConfig("lgmcalibration"), inputs_->marketConfig("fxcalibration"),
478-
inputs_->marketConfig("eqcalibration"), inputs_->marketConfig("infcalibration"),
479-
inputs_->marketConfig("crcalibration"), inputs_->marketConfig("simulation"), inputs_->refDataManager(),
480-
*inputs_->iborFallbackConfig(), true, cubeFactory);
473+
AMCValuationEngine amcEngine(inputs_->nThreads(), inputs_->asof(), samples_, analytic()->loader(),
474+
inputs_->scenarioGeneratorData(),
475+
inputs_->exposureSimMarketParams()->additionalScenarioDataIndices(),
476+
inputs_->exposureSimMarketParams()->additionalScenarioDataCcys(),
477+
inputs_->exposureSimMarketParams()->additionalScenarioDataNumberOfCreditStates(),
478+
inputs_->crossAssetModelData(), inputs_->amcPricingEngine(),
479+
inputs_->curveConfigs().get(), analytic()->configurations().todaysMarketParams,
480+
inputs_->marketConfig("lgmcalibration"), inputs_->marketConfig("fxcalibration"),
481+
inputs_->marketConfig("eqcalibration"), inputs_->marketConfig("infcalibration"),
482+
inputs_->marketConfig("crcalibration"), inputs_->marketConfig("simulation"),
483+
inputs_->refDataManager(), *inputs_->iborFallbackConfig(), true, cubeFactory);
481484

482485
amcEngine.registerProgressIndicator(progressBar);
483486
amcEngine.registerProgressIndicator(progressLog);

OREAnalytics/orea/engine/amcvaluationengine.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ void runCoreEngine(const boost::shared_ptr<ore::data::Portfolio>& portfolio,
141141
const boost::shared_ptr<ore::data::Market>& market,
142142
const boost::shared_ptr<ore::analytics::ScenarioGeneratorData>& sgd,
143143
const std::vector<string>& aggDataIndices, const std::vector<string>& aggDataCurrencies,
144-
boost::shared_ptr<ore::analytics::AggregationScenarioData> asd,
144+
const Size aggDataNumberCreditStates, boost::shared_ptr<ore::analytics::AggregationScenarioData> asd,
145145
boost::shared_ptr<NPVCube> outputCube, boost::shared_ptr<ProgressIndicator> progressIndicator) {
146146

147147
progressIndicator->updateProgress(0, portfolio->size() + 1);
@@ -358,6 +358,11 @@ void runCoreEngine(const boost::shared_ptr<ore::data::Portfolio>& portfolio,
358358
asd->set(dateIndex, i, index->fixing(index->fixingCalendar().adjust(d)),
359359
AggregationScenarioDataType::IndexFixing, asdIndexName[j]);
360360
}
361+
// set credit states
362+
for (Size j = 0; j < aggDataNumberCreditStates; ++j) {
363+
asd->set(dateIndex, i, path[model->pIdx(CrossAssetModel::AssetType::CrState, j)][k],
364+
AggregationScenarioDataType::CreditState, std::to_string(j));
365+
}
361366
++dateIndex;
362367
}
363368
timer.stop();
@@ -508,7 +513,8 @@ AMCValuationEngine::AMCValuationEngine(
508513
const QuantLib::Size nThreads, const QuantLib::Date& today, const QuantLib::Size nSamples,
509514
const boost::shared_ptr<ore::data::Loader>& loader,
510515
const boost::shared_ptr<ScenarioGeneratorData>& scenarioGeneratorData, const std::vector<string>& aggDataIndices,
511-
const std::vector<string>& aggDataCurrencies, const boost::shared_ptr<CrossAssetModelData>& crossAssetModelData,
516+
const std::vector<string>& aggDataCurrencies, const Size aggDataNumberCreditStates,
517+
const boost::shared_ptr<CrossAssetModelData>& crossAssetModelData,
512518
const boost::shared_ptr<ore::data::EngineData>& engineData,
513519
const boost::shared_ptr<ore::data::CurveConfigurations>& curveConfigs,
514520
const boost::shared_ptr<ore::data::TodaysMarketParameters>& todaysMarketParams,
@@ -521,8 +527,9 @@ AMCValuationEngine::AMCValuationEngine(
521527
const std::vector<QuantLib::Date>&,
522528
const QuantLib::Size)>& cubeFactory)
523529
: useMultithreading_(true), aggDataIndices_(aggDataIndices), aggDataCurrencies_(aggDataCurrencies),
524-
scenarioGeneratorData_(scenarioGeneratorData), nThreads_(nThreads), today_(today), nSamples_(nSamples),
525-
loader_(loader), crossAssetModelData_(crossAssetModelData), engineData_(engineData), curveConfigs_(curveConfigs),
530+
aggDataNumberCreditStates_(aggDataNumberCreditStates), scenarioGeneratorData_(scenarioGeneratorData),
531+
nThreads_(nThreads), today_(today), nSamples_(nSamples), loader_(loader),
532+
crossAssetModelData_(crossAssetModelData), engineData_(engineData), curveConfigs_(curveConfigs),
526533
todaysMarketParams_(todaysMarketParams), configurationLgmCalibration_(configurationLgmCalibration),
527534
configurationFxCalibration_(configurationFxCalibration), configurationEqCalibration_(configurationEqCalibration),
528535
configurationInfCalibration_(configurationInfCalibration),
@@ -547,9 +554,11 @@ AMCValuationEngine::AMCValuationEngine(const boost::shared_ptr<QuantExt::CrossAs
547554
const boost::shared_ptr<ScenarioGeneratorData>& scenarioGeneratorData,
548555
const boost::shared_ptr<Market>& market,
549556
const std::vector<string>& aggDataIndices,
550-
const std::vector<string>& aggDataCurrencies)
557+
const std::vector<string>& aggDataCurrencies,
558+
const Size aggDataNumberCreditStates)
551559
: useMultithreading_(false), aggDataIndices_(aggDataIndices), aggDataCurrencies_(aggDataCurrencies),
552-
scenarioGeneratorData_(scenarioGeneratorData), model_(model), market_(market) {
560+
aggDataNumberCreditStates_(aggDataNumberCreditStates), scenarioGeneratorData_(scenarioGeneratorData),
561+
model_(model), market_(market) {
553562

554563
QL_REQUIRE((aggDataIndices.empty() && aggDataCurrencies.empty()) || market != nullptr,
555564
"AMCValuationEngine: market is required for asd generation");
@@ -587,8 +596,8 @@ void AMCValuationEngine::buildCube(const boost::shared_ptr<Portfolio>& portfolio
587596

588597
try {
589598
// we can use the mt progress indicator here although we are running on a single thread
590-
runCoreEngine(portfolio, model_, market_, scenarioGeneratorData_, aggDataIndices_, aggDataCurrencies_, asd_,
591-
outputCube,
599+
runCoreEngine(portfolio, model_, market_, scenarioGeneratorData_, aggDataIndices_, aggDataCurrencies_,
600+
aggDataNumberCreditStates_, asd_, outputCube,
592601
boost::make_shared<ore::analytics::MultiThreadedProgressIndicator>(this->progressIndicators()));
593602
} catch (const std::exception& e) {
594603
QL_FAIL("Error during amc val engine run: " << e.what());
@@ -737,7 +746,7 @@ void AMCValuationEngine::buildCube(const boost::shared_ptr<ore::data::Portfolio>
737746
// run core engine code (asd is written for thread id 0 only)
738747

739748
runCoreEngine(portfolio, cam, initMarket, scenarioGeneratorData_, aggDataIndices_, aggDataCurrencies_,
740-
id == 0 ? asd_ : nullptr, miniCubes_[id], progressIndicator);
749+
aggDataNumberCreditStates_, id == 0 ? asd_ : nullptr, miniCubes_[id], progressIndicator);
741750

742751
// return code 0 = ok
743752

OREAnalytics/orea/engine/amcvaluationengine.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ class AMCValuationEngine : public ore::data::ProgressReporter {
4545
AMCValuationEngine(const boost::shared_ptr<QuantExt::CrossAssetModel>& model,
4646
const boost::shared_ptr<ore::analytics::ScenarioGeneratorData>& scenarioGeneratorData,
4747
const boost::shared_ptr<ore::data::Market>& market, const std::vector<string>& aggDataIndices,
48-
const std::vector<string>& aggDataCurrencies);
48+
const std::vector<string>& aggDataCurrencies, const Size aggDataNumberCreditStates);
4949

5050
//! Constructor for multi threaded runs
5151
AMCValuationEngine(
5252
const QuantLib::Size nThreads, const QuantLib::Date& today, const QuantLib::Size nSamples,
5353
const boost::shared_ptr<ore::data::Loader>& loader,
5454
const boost::shared_ptr<ScenarioGeneratorData>& scenarioGeneratorData,
5555
const std::vector<string>& aggDataIndices, const std::vector<string>& aggDataCurrencies,
56-
const boost::shared_ptr<CrossAssetModelData>& crossAssetModelData,
56+
const Size aggDataNumberCreditStates, const boost::shared_ptr<CrossAssetModelData>& crossAssetModelData,
5757
const boost::shared_ptr<ore::data::EngineData>& engineData,
5858
const boost::shared_ptr<ore::data::CurveConfigurations>& curveConfigs,
5959
const boost::shared_ptr<ore::data::TodaysMarketParameters>& todaysMarketParams,
@@ -92,6 +92,7 @@ class AMCValuationEngine : public ore::data::ProgressReporter {
9292

9393
// shared inputs
9494
const std::vector<string> aggDataIndices_, aggDataCurrencies_;
95+
const Size aggDataNumberCreditStates_;
9596
boost::shared_ptr<ScenarioGeneratorData> scenarioGeneratorData_;
9697

9798
// inputs for single-threaded run

OREAnalytics/test/amcbermudanswaption.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,7 @@ BOOST_DATA_TEST_CASE(testBermudanSwaptionExposure, boost::unit_test::data::make(
658658
void build(const boost::shared_ptr<EngineFactory>&) override {}
659659
};
660660
AMCValuationEngine amcValEngine(model, sgd, boost::shared_ptr<Market>(), std::vector<string>(),
661-
std::vector<string>());
661+
std::vector<string>(), 0);
662662
auto trade = boost::make_shared<TestTrade>("BermudanSwaption", testCase.inBaseCcy ? "EUR" : "USD",
663663
boost::make_shared<VanillaInstrument>(swaption));
664664
trade->id() = "DummyTradeId";

0 commit comments

Comments
 (0)