@@ -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+
177198void DecomposedSensitivityStream::reset () {
178199 ss_.reset ();
179200 decomposedRecords_.clear ();
0 commit comments