Skip to content

Commit 41002a2

Browse files
committed
Merge branch 'feature/QPR-13138' into 'master'
QPR-13138 Add column to backtest_pl_contribution to specify the discountCurve Closes QPR-13138 See merge request qs/oreplus!3151
2 parents 324d5bb + 37ad9d5 commit 41002a2

2 files changed

Lines changed: 25 additions & 4 deletions

File tree

OREAnalytics/orea/engine/marketriskbacktest.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6566
void 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

458475
void BacktestPNLCalculator::writePNL(Size scenarioIdx, bool isCall, const RiskFactorKey& key_1, Real shift_1,

OREAnalytics/orea/engine/marketriskbacktest.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#pragma once
2525

2626
#include <qle/math/covariancesalvage.hpp>
27+
#include <ored/marketdata/todaysmarketparameters.hpp>
2728
#include <ored/portfolio/portfolio.hpp>
2829
#include <ored/utilities/progressbar.hpp>
2930
#include <orea/engine/historicalpnlgenerator.hpp>
@@ -137,7 +138,8 @@ class MarketRiskBacktest : public ore::analytics::MarketRiskReport {
137138
std::unique_ptr<MultiThreadArgs> mtArgs = nullptr,
138139
const QuantLib::ext::shared_ptr<ore::analytics::HistoricalScenarioGenerator>& hisScenGen = nullptr,
139140
const bool breakdown = false,
140-
const bool requireTradePnl = false);
141+
const bool requireTradePnl = false,
142+
const QuantLib::ext::shared_ptr<TodaysMarketParameters>& marketConfig = nullptr);
141143

142144
virtual ~MarketRiskBacktest() {}
143145

@@ -156,6 +158,8 @@ class MarketRiskBacktest : public ore::analytics::MarketRiskReport {
156158

157159
protected:
158160
std::unique_ptr<BacktestArgs> btArgs_;
161+
// Todays market parameters used to map DiscountCurve nodes
162+
QuantLib::ext::shared_ptr<ore::data::TodaysMarketParameters> todaysmarket_;
159163

160164
void initialise() override;
161165

0 commit comments

Comments
 (0)