Skip to content

Commit 4e508a3

Browse files
author
sebastien.bouvard
committed
QPR-13799 Correlation: Allow portfolio to be different from scenario
1 parent 87a2c36 commit 4e508a3

4 files changed

Lines changed: 30 additions & 3 deletions

File tree

OREAnalytics/orea/app/analytics/correlationanalytic.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ void CorrelationAnalyticImpl::setCorrelationReport(const QuantLib::ext::shared_p
114114
analytic()->configurations().simMarketParams);
115115

116116
correlationReport_ = ext::make_shared<CorrelationReport>(inputs_->scenarioReader(),
117-
inputs_->correlationMethod(), benchmarkVarPeriod, scenarios, shiftCalculator);
117+
inputs_->correlationMethod(), benchmarkVarPeriod, scenarios, shiftCalculator,
118+
analytic()->configurations().sensiScenarioData);
118119
}
119120

120121
} //namespace analytics

OREAnalytics/orea/engine/correlationreport.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
FITNESS FOR A PARTICULAR PURPOSE. See the license for more details.
1717
*/
1818
#include <orea/engine/correlationreport.hpp>
19+
#include <orea/scenario/sensitivityscenariodata.hpp>
1920
#include <ored/utilities/to_string.hpp>
2021
#include <qle/math/deltagammavar.hpp>
2122
#include <ored/utilities/correlationmatrix.hpp>
@@ -35,6 +36,26 @@ void CorrelationReport::calculate(const ext::shared_ptr<Report>& report) {
3536
ext::shared_ptr<Scenario> sc = hisScenGen_->next(hisScenGen_->baseScenario()->asof());
3637
std::vector<RiskFactorKey> deltaKeys = sc->keys();
3738

39+
// Filter deltaKeys to the union with risk factors generated from the portfolio based on (KeyType, Name)
40+
// i.e., keep only those deltaKeys present in ptfRiskFactors ignoring index
41+
// populateSensiShifts iterate over the scenario and deltaKeys, if mismatch with the sensiScenarioData shift
42+
// it throws an error.
43+
auto ptfRiskFactors = sensiScenarioData_->getPortfolioRiskFactors();
44+
if(ptfRiskFactors.size()>0){
45+
std::set<std::pair<RiskFactorKey::KeyType, std::string>> ptfKeyNameSet;
46+
for (auto& k : ptfRiskFactors) {
47+
ptfKeyNameSet.emplace(k.keytype, k.name);
48+
}
49+
std::vector<RiskFactorKey> filteredKeys;
50+
filteredKeys.reserve(deltaKeys.size());
51+
for (auto& k : deltaKeys) {
52+
if (ptfKeyNameSet.count(std::make_pair(k.keytype, k.name)) > 0) {
53+
filteredKeys.push_back(k);
54+
}
55+
}
56+
deltaKeys.swap(filteredKeys);
57+
}
58+
3859
ext::shared_ptr<NPVCube>cube;
3960
ext::shared_ptr<CovarianceCalculator> covCalculator;
4061
covCalculator = ext::make_shared<CovarianceCalculator>(covariancePeriod());

OREAnalytics/orea/engine/correlationreport.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@ class CorrelationReport{
3939
const std::string& correlationMethod,
4040
QuantLib::ext::optional<ore::data::TimePeriod> period,
4141
const QuantLib::ext::shared_ptr<HistoricalScenarioGenerator>& hisScenGen = nullptr,
42-
const QuantLib::ext::shared_ptr<ScenarioShiftCalculator>& shiftCalc = nullptr)
42+
const QuantLib::ext::shared_ptr<ScenarioShiftCalculator>& shiftCalc = nullptr,
43+
QuantLib::ext::shared_ptr<ore::analytics::SensitivityScenarioData> sensiScenarioData = nullptr)
4344
: scenario_(scenario), correlationMethod_(correlationMethod), period_(period), hisScenGen_(hisScenGen),
44-
shiftCalc_(shiftCalc) {
45+
shiftCalc_(shiftCalc), sensiScenarioData_(sensiScenarioData) {
4546
}
4647

4748
void writeReports(const QuantLib::ext::shared_ptr<Report>& report);
@@ -59,6 +60,7 @@ class CorrelationReport{
5960
QuantLib::Matrix correlationMatrix_;
6061
std::map<std::pair<RiskFactorKey, RiskFactorKey>, Real> correlationPairs_;
6162
std::vector<QuantLib::ext::shared_ptr<PNLCalculator>> pnlCalculators_;
63+
QuantLib::ext::shared_ptr<ore::analytics::SensitivityScenarioData> sensiScenarioData_;
6264

6365
ore::data::TimePeriod covariancePeriod() const { return period_.value(); }
6466
std::vector<ore::data::TimePeriod> timePeriods() { return {period_.value()}; }

OREAnalytics/orea/scenario/sensitivityscenariodata.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ class SensitivityScenarioData : public XMLSerializable {
304304
void setComputeGamma(const bool b) { computeGamma_ = b; }
305305
void setUseSpreadedTermStructures(const bool b) { useSpreadedTermStructures_ = b; }
306306
void setParConversionExcludeFixings(const std::string b) { parConversionExcludeFixings_ = b; }
307+
void setPortfolioRiskFactors(const std::vector<RiskFactorKey> b) { portfolioRiskFactors_ = b;}
307308

308309
//@}
309310

@@ -322,6 +323,7 @@ class SensitivityScenarioData : public XMLSerializable {
322323
//! Utilities
323324
//@{
324325
string getIndexCurrency(string indexName);
326+
std::vector<RiskFactorKey> getPortfolioRiskFactors(){return portfolioRiskFactors_;}
325327
//@}
326328

327329
protected:
@@ -369,6 +371,7 @@ class SensitivityScenarioData : public XMLSerializable {
369371
set<ore::analytics::RiskFactorKey::KeyType> parConversionExcludes_;
370372
std::string parConversionExcludeFixings_;
371373
ore::data::ParConversionMatrixRegularisation parConversionMatrixRegularisation_;
374+
std::vector<RiskFactorKey> portfolioRiskFactors_;
372375

373376
private:
374377
void parDataFromXML(XMLNode* child, CurveShiftParData& data);

0 commit comments

Comments
 (0)