@@ -177,14 +177,39 @@ DecomposedSensitivityStream::fxRiskShiftSizes(const std::map<std::string, std::v
177177 return results;
178178}
179179
180- double DecomposedSensitivityStream::assetSpotShiftSize (const std::string name) const {
180+ double DecomposedSensitivityStream::equitySpotShiftSize (const std::string name) const {
181181 auto eqShiftSizeIt = ssd_->equityShiftData ().find (name);
182- QL_REQUIRE (eqShiftSizeIt != ssd_->equityShiftData ().end (), " Couldn't find a shift size for " << name);
182+ QL_REQUIRE (eqShiftSizeIt != ssd_->equityShiftData ().end (), " Couldn't find a equity shift size for " << name);
183183 QL_REQUIRE (eqShiftSizeIt->second .shiftType == ore::analytics::ShiftType::Relative,
184184 " Requires a relative eqSpot shift for index decomposition" );
185185 return eqShiftSizeIt->second .shiftSize ;
186186}
187187
188+ double DecomposedSensitivityStream::assetSpotShiftSize (const std::string indexName,
189+ const ore::data::CurveSpec::CurveType curveType) const {
190+ if (curveType == ore::data::CurveSpec::CurveType::Equity) {
191+ return equitySpotShiftSize (indexName);
192+ } else if (curveType == ore::data::CurveSpec::CurveType::Commodity) {
193+ return commoditySpotShiftSize (indexName);
194+ } else {
195+ QL_FAIL (" unsupported curveType, got "
196+ << curveType << " . Only Equity and Commodity curves are supported for decomposition." );
197+ }
198+ }
199+
200+ double DecomposedSensitivityStream::commoditySpotShiftSize (const std::string name) const {
201+ auto commShiftSizeIt = ssd_->commodityCurveShiftData ().find (name);
202+ if (commShiftSizeIt != ssd_->commodityCurveShiftData ().end ()) {
203+ QL_REQUIRE (commShiftSizeIt->second ->shiftType == ore::analytics::ShiftType::Relative,
204+ " Requires a relative eqSpot shift for index decomposition" );
205+ return commShiftSizeIt->second ->shiftSize ;
206+ } else {
207+ LOG (" Could not find a commodity shift size for commodity index "
208+ << name << " . Try to find a equity spot shift size as fallback" )
209+ return equitySpotShiftSize (name);
210+ }
211+ }
212+
188213std::map<std::string, std::vector<std::string>>
189214DecomposedSensitivityStream::getConstituentCurrencies (const std::map<std::string, double >& constituents,
190215 const std::string& indexCurrency,
@@ -225,7 +250,7 @@ DecomposedSensitivityStream::indexDecomposition(double delta, const std::string&
225250 auto spotRisk = constituentSpotRiskFromDecomposition (delta, indexWeights);
226251 auto currencies = getConstituentCurrencies (spotRisk, indexCurrency, curveType);
227252 auto fxShifts = fxRiskShiftSizes (currencies);
228- auto spotShift = assetSpotShiftSize (indexName);
253+ double spotShift = assetSpotShiftSize (indexName, curveType);
229254 auto fxRisk = fxRiskFromDecomposition (spotRisk, currencies, fxShifts, spotShift);
230255 result.spotRisk = spotRisk;
231256 result.fxRisk = fxRisk;
@@ -260,7 +285,7 @@ DecomposedSensitivityStream::decomposeCurrencyHedgedIndexRisk(const SensitivityR
260285 QL_REQUIRE (quantity != QuantLib::Null<double >(),
261286 " CurrencyHedgedIndexDecomposition failed, index quantity cannot be NULL." );
262287
263- double assetSensiShift = assetSpotShiftSize (indexName);
288+ double assetSensiShift = assetSpotShiftSize (indexName, ore::data::CurveSpec::CurveType::Equity );
264289
265290 double hedgedExposure = sr.delta / assetSensiShift;
266291
0 commit comments