Skip to content

Commit 9139a3b

Browse files
mgronckijenkins
authored andcommitted
QPR-12173 decomposed commodity risk factors in sensitivitystream
1 parent 796eef2 commit 9139a3b

1 file changed

Lines changed: 25 additions & 4 deletions

File tree

OREAnalytics/orea/engine/decomposedsensitivitystream.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,13 @@ std::vector<SensitivityRecord> DecomposedSensitivityStream::decompose(const Sens
8282
} else if ((isEquitySpotSensi || isCommoditySpotSensi) && tradeIdValid && hasCommodityRefData && isNotCrossGamma) {
8383
return decomposeCommodityRisk(record);
8484
} else if ((isEquitySpotSensi || isCommoditySpotSensi) && tradeIdValid && isNotCrossGamma) {
85-
// Error no ref data
85+
auto subFields = std::map<std::string, std::string>({{"tradeId", record.tradeId}});
86+
StructuredAnalyticsErrorMessage(
87+
"CRIF Generation", "Index decomposition failed",
88+
"Cannot decompose equity index delta (" + record.key_1.name +
89+
") for trade: no reference data found. Continuing without decomposition.",
90+
subFields)
91+
.log();
8692
}
8793
} catch (const std::exception& e) {
8894

@@ -171,9 +177,24 @@ DecomposedSensitivityStream::decomposeCurrencyHedgedIndexRisk(const SensitivityR
171177
}
172178
}
173179

174-
std::vector<SensitivityRecord>
175-
DecomposedSensitivityStream::decomposeCommodityRisk(const SensitivityRecord& record) const {}
176-
180+
std::vector<SensitivityRecord> DecomposedSensitivityStream::decomposeCommodityRisk(const SensitivityRecord& sr) const {
181+
if (refDataManager_->hasData("CommodityIndex", sr.key_1.name)) {
182+
auto refDatum = refDataManager_->getData("CommodityIndex", sr.key_1.name);
183+
auto indexRefDatum = boost::dynamic_pointer_cast<ore::data::IndexReferenceDatum>(refDatum);
184+
auto decompResults =
185+
decomposeEqComIndexRisk(sr.delta, indexRefDatum, ore::data::CurveSpec::CurveType::Commodity);
186+
return createDecompositionRecords(sr, decompResults);
187+
} else if (refDataManager_->hasData("EquityIndex", sr.key_1.name)) {
188+
auto refDatum = refDataManager_->getData("EquityIndex", sr.key_1.name);
189+
auto indexRefDatum = boost::dynamic_pointer_cast<ore::data::IndexReferenceDatum>(refDatum);
190+
auto decompResults =
191+
decomposeEqComIndexRisk(sr.delta, indexRefDatum, ore::data::CurveSpec::CurveType::Commodity);
192+
return createDecompositionRecords(sr, decompResults);
193+
} else {
194+
return {sr};
195+
}
196+
}
197+
177198
void DecomposedSensitivityStream::reset() {
178199
ss_.reset();
179200
decomposedRecords_.clear();

0 commit comments

Comments
 (0)