Skip to content

Commit 2f3e170

Browse files
author
sebastien.bouvard
committed
QPR-13138 Add column to backtest_pl_contribution to specify what is the discountCurve
1 parent 4e16c08 commit 2f3e170

6 files changed

Lines changed: 30 additions & 6 deletions

File tree

OREAnalytics/orea/engine/marketriskbacktest.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,14 @@ bool MarketRiskBacktest::runTradeDetail(const ext::shared_ptr<MarketRiskReport::
8888
return requireTradePnl_ || trdDetail;
8989
}
9090

91-
void MarketRiskBacktest::addPnlCalculators(const ext::shared_ptr<MarketRiskReport::Reports>& reports) {
91+
void MarketRiskBacktest::addPnlCalculators(const ext::shared_ptr<MarketRiskReport::Reports>& reports,
92+
const QuantLib::ext::shared_ptr<TodaysMarketParameters>& marketConfig) {
9293
pnlCalculators_.push_back(
9394
QuantLib::ext::make_shared<PNLCalculator>(btArgs_->benchmarkPeriod_));
9495
auto btRpts = ext::dynamic_pointer_cast<BacktestReports>(reports);
9596
pnlCalculators_.push_back(
9697
QuantLib::ext::make_shared<BacktestPNLCalculator>(btArgs_->backtestPeriod_, writePnl_, this, btRpts));
98+
todaysmarket_ = marketConfig;
9799
}
98100

99101

@@ -372,6 +374,7 @@ void MarketRiskBacktest::createReports(const ext::shared_ptr<MarketRiskReport::R
372374
if (pnl) {
373375
for (const auto& t : pnlColumns())
374376
pnl->addColumn(std::get<0>(t), std::get<1>(t), std::get<2>(t));
377+
pnl->addColumn("DiscountSpec", string());
375378
}
376379
}
377380

@@ -381,6 +384,7 @@ void MarketRiskBacktest::createReports(const ext::shared_ptr<MarketRiskReport::R
381384
pnlTrade->addColumn("TradeId", string());
382385
for (const auto& t : pnlColumns())
383386
pnlTrade->addColumn(std::get<0>(t), std::get<1>(t), std::get<2>(t));
387+
pnlTrade->addColumn("DiscountSpec", string());
384388
}
385389
}
386390
}
@@ -453,6 +457,20 @@ void MarketRiskBacktest::addPnlRow(const QuantLib::ext::shared_ptr<BacktestRepor
453457
.add(currency.empty() || currency == calculationCurrency_ ? deltaPnl : deltaPnl / fxSpot)
454458
.add(currency.empty() || currency == calculationCurrency_ ? gammaPnl : gammaPnl / fxSpot)
455459
.add(currency.empty() ? calculationCurrency_ : currency);
460+
461+
// Append DiscountSpec column (from TodaysMarketParameters) if available and applicable
462+
std::string discountSpecStr;
463+
if (todaysmarket_ && key_1.keytype == QuantExt::RiskFactorKey::KeyType::DiscountCurve) {
464+
const auto& discMap = todaysmarket_->mapping(ore::data::MarketObject::DiscountCurve, ore::data::Market::defaultConfiguration);
465+
auto it = discMap.find(key_1.name);
466+
if (it != discMap.end()){
467+
discountSpecStr = it->second;
468+
}
469+
}
470+
if (!discountSpecStr.empty())
471+
report.add(discountSpecStr);
472+
else
473+
report.add(string());
456474
}
457475

458476
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>
@@ -156,6 +157,8 @@ class MarketRiskBacktest : public ore::analytics::MarketRiskReport {
156157

157158
protected:
158159
std::unique_ptr<BacktestArgs> btArgs_;
160+
// Todays market parameters used to map DiscountCurve nodes
161+
QuantLib::ext::shared_ptr<ore::data::TodaysMarketParameters> todaysmarket_;
159162

160163
void initialise() override;
161164

@@ -182,7 +185,8 @@ class MarketRiskBacktest : public ore::analytics::MarketRiskReport {
182185
void createReports(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports) override;
183186
virtual bool runTradeDetail(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports) override;
184187
ore::data::TimePeriod covariancePeriod() const override { return btArgs_->benchmarkPeriod_; }
185-
void addPnlCalculators(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports) override;
188+
void addPnlCalculators(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports,
189+
const QuantLib::ext::shared_ptr<TodaysMarketParameters>& marketConfig) override;
186190

187191
void handleSensiResults(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports,
188192
const QuantLib::ext::shared_ptr<ore::analytics::MarketRiskGroupBase>& riskGroup,

OREAnalytics/orea/engine/marketriskreport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ void MarketRiskReport::calculate(const ext::shared_ptr<MarketRiskReport::Reports
269269

270270
bool runDetailTrd = runTradeDetail(reports);
271271
bool runDetailRF = runRiskFactorDetail(reports);
272-
addPnlCalculators(reports);
272+
addPnlCalculators(reports, multiThreadArgs_->todaysMarketParams_);
273273

274274
// Loop over all the risk groups
275275
riskGroups_->reset();

OREAnalytics/orea/engine/marketriskreport.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,8 @@ class MarketRiskReport : public ore::data::ProgressReporter {
332332
virtual std::string portfolioId(const QuantLib::ext::shared_ptr<TradeGroupBase>& tradeGroup) const;
333333
virtual std::string tradeGroupKey(const QuantLib::ext::shared_ptr<TradeGroupBase>& tradeGroup) const;
334334
virtual ore::data::TimePeriod covariancePeriod() const { return period_.value(); }
335-
virtual void addPnlCalculators(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports) {}
335+
virtual void addPnlCalculators(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports,
336+
const QuantLib::ext::shared_ptr<TodaysMarketParameters>& marketConfig = nullptr) {}
336337

337338
// handle results specific to this report
338339
virtual void handleSensiResults(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& report,

OREAnalytics/orea/engine/pnlexplainreport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ void PnlExplainReport::handleSensiResults(const QuantLib::ext::shared_ptr<Market
135135
const QuantLib::ext::shared_ptr<TradeGroupBase>& tradeGroup) {
136136
}
137137

138-
void PnlExplainReport::addPnlCalculators(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports) {
138+
void PnlExplainReport::addPnlCalculators(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports, const QuantLib::ext::shared_ptr<TodaysMarketParameters>& marketConfig) {
139139
pnlCalculators_.push_back(QuantLib::ext::make_shared<PNLCalculator>(period_.value()));
140140
}
141141

OREAnalytics/orea/engine/pnlexplainreport.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ class PnlExplainReport : public MarketRiskReport {
6969
void handleSensiResults(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& report,
7070
const QuantLib::ext::shared_ptr<MarketRiskGroupBase>& riskGroup,
7171
const QuantLib::ext::shared_ptr<TradeGroupBase>& tradeGroup) override;
72-
void addPnlCalculators(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports) override;
72+
void addPnlCalculators(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports,
73+
const QuantLib::ext::shared_ptr<TodaysMarketParameters>& marketConfig = nullptr) override;
7374
void writeReports(const QuantLib::ext::shared_ptr<MarketRiskReport::Reports>& reports,
7475
const QuantLib::ext::shared_ptr<MarketRiskGroupBase>& riskGroup,
7576
const QuantLib::ext::shared_ptr<TradeGroupBase>& tradeGroup) override;

0 commit comments

Comments
 (0)