@@ -56,10 +56,11 @@ MarketRiskBacktest::MarketRiskBacktest(
5656 std::unique_ptr<MultiThreadArgs> mtArgs,
5757 const ext::shared_ptr<HistoricalScenarioGenerator>& hisScenGen,
5858 const bool breakdown,
59- const bool requireTradePnl)
59+ const bool requireTradePnl,
60+ const QuantLib::ext::shared_ptr<TodaysMarketParameters>& marketConfig)
6061 : MarketRiskReport(calculationCurrency, portfolio, portfolioFilter, btArgs->backtestPeriod_, hisScenGen, std::move(sensiArgs), std::move(revalArgs),
6162 std::move (mtArgs), breakdown, requireTradePnl),
62- btArgs_(std::move(btArgs)) {
63+ btArgs_(std::move(btArgs)), todaysmarket_(marketConfig) {
6364}
6465
6566void MarketRiskBacktest::initialise () {
@@ -106,7 +107,7 @@ void MarketRiskBacktest::handleSensiResults(const ext::shared_ptr<MarketRiskRepo
106107 sensiPnls_ = pnlCalculators_[1 ]->pnls ();
107108 foSensiPnls_ = pnlCalculators_[1 ]->foPnls ();
108109
109- auto backtestPnlCalc = ext::dynamic_pointer_cast < BacktestPNLCalculator>(pnlCalculators_[1 ]);
110+ auto backtestPnlCalc = ext::dynamic_pointer_cast< BacktestPNLCalculator>(pnlCalculators_[1 ]);
110111 QL_REQUIRE (backtestPnlCalc, " We must have a BacktestPnLCalculator" );
111112 if (runTradeDetail (reports)) {
112113 foTradePnls_ = backtestPnlCalc->foTradePnls ();
@@ -372,6 +373,7 @@ void MarketRiskBacktest::createReports(const ext::shared_ptr<MarketRiskReport::R
372373 if (pnl) {
373374 for (const auto & t : pnlColumns ())
374375 pnl->addColumn (std::get<0 >(t), std::get<1 >(t), std::get<2 >(t));
376+ pnl->addColumn (" DiscountSpec" , string ());
375377 }
376378 }
377379
@@ -381,6 +383,7 @@ void MarketRiskBacktest::createReports(const ext::shared_ptr<MarketRiskReport::R
381383 pnlTrade->addColumn (" TradeId" , string ());
382384 for (const auto & t : pnlColumns ())
383385 pnlTrade->addColumn (std::get<0 >(t), std::get<1 >(t), std::get<2 >(t));
386+ pnlTrade->addColumn (" DiscountSpec" , string ());
384387 }
385388 }
386389}
@@ -453,6 +456,20 @@ void MarketRiskBacktest::addPnlRow(const QuantLib::ext::shared_ptr<BacktestRepor
453456 .add (currency.empty () || currency == calculationCurrency_ ? deltaPnl : deltaPnl / fxSpot)
454457 .add (currency.empty () || currency == calculationCurrency_ ? gammaPnl : gammaPnl / fxSpot)
455458 .add (currency.empty () ? calculationCurrency_ : currency);
459+
460+ // Append DiscountSpec column (from TodaysMarketParameters) if available and applicable
461+ std::string discountSpecStr;
462+ if (todaysmarket_ && key_1.keytype == QuantExt::RiskFactorKey::KeyType::DiscountCurve) {
463+ const auto & discMap = todaysmarket_->mapping (ore::data::MarketObject::DiscountCurve, ore::data::Market::defaultConfiguration);
464+ auto it = discMap.find (key_1.name );
465+ if (it != discMap.end ()){
466+ discountSpecStr = it->second ;
467+ }
468+ }
469+ if (!discountSpecStr.empty ())
470+ report.add (discountSpecStr);
471+ else
472+ report.add (string ());
456473}
457474
458475void BacktestPNLCalculator::writePNL (Size scenarioIdx, bool isCall, const RiskFactorKey& key_1, Real shift_1,
0 commit comments