Skip to content

Commit ecee397

Browse files
pcaspersjenkins
authored andcommitted
QPR-12014 use enums for shift type and shift scheme everywhere
1 parent cec00a1 commit ecee397

25 files changed

Lines changed: 339 additions & 316 deletions

OREAnalytics/orea/cube/sensitivitycube.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,15 @@ std::ostream& operator<<(std::ostream& out, const SensitivityCube::crossPair& cp
5757
SensitivityCube::SensitivityCube(const boost::shared_ptr<NPVSensiCube>& cube,
5858
const vector<ShiftScenarioDescription>& scenarioDescriptions,
5959
const map<RiskFactorKey, QuantLib::Real>& shiftsizes,
60-
const std::map<RiskFactorKey, std::string>& shiftSchemes)
60+
const std::map<RiskFactorKey, ShiftScheme>& shiftSchemes)
6161
: cube_(cube), scenarioDescriptions_(scenarioDescriptions), shiftSizes_(shiftsizes), shiftSchemes_(shiftSchemes) {
6262
initialise();
6363
}
6464

6565
SensitivityCube::SensitivityCube(const boost::shared_ptr<NPVSensiCube>& cube,
6666
const vector<string>& scenarioDescriptions,
6767
const map<RiskFactorKey, QuantLib::Real>& shiftsizes,
68-
const std::map<RiskFactorKey, std::string>& shiftSchemes)
68+
const std::map<RiskFactorKey, ShiftScheme>& shiftSchemes)
6969
: cube_(cube), shiftSizes_(shiftsizes), shiftSchemes_(shiftSchemes) {
7070

7171
// Populate scenarioDescriptions_ from string descriptions
@@ -192,7 +192,7 @@ Real SensitivityCube::shiftSize(const RiskFactorKey& riskFactorKey) const {
192192
return it->second;
193193
}
194194

195-
std::string SensitivityCube::shiftScheme(const RiskFactorKey& riskFactorKey) const {
195+
ShiftScheme SensitivityCube::shiftScheme(const RiskFactorKey& riskFactorKey) const {
196196
auto it = shiftSchemes_.find(riskFactorKey);
197197
QL_REQUIRE(it != shiftSchemes_.end(), "Risk factor, " << riskFactorKey << ", was not found in the shift schemes.");
198198
return it->second;
@@ -214,13 +214,13 @@ Real SensitivityCube::delta(const Size tradeIdx, const RiskFactorKey& riskFactor
214214
auto s = shiftSchemes_.find(riskFactorKey);
215215
QL_REQUIRE(s != shiftSchemes_.end(),
216216
"SensitivityCube::delta(" << tradeIdx << ", " << riskFactorKey << "): no shift scheme stored.");
217-
if (s->second == "Forward" || s->second.empty()) {
217+
if (s->second == ShiftScheme::Forward) {
218218
Size scenarioIdx = index(riskFactorKey, upFactors_).index;
219219
return cube_->get(tradeIdx, scenarioIdx) - cube_->getT0(tradeIdx, 0);
220-
} else if (s->second == "Backward") {
220+
} else if (s->second == ShiftScheme::Backward) {
221221
Size scenarioIdx = index(riskFactorKey, downFactors_).index;
222222
return cube_->getT0(tradeIdx, 0) - cube_->get(tradeIdx, scenarioIdx);
223-
} else if (s->second == "Central") {
223+
} else if (s->second == ShiftScheme::Central) {
224224
Size upIdx = index(riskFactorKey, upFactors_).index;
225225
Size downIdx = index(riskFactorKey, downFactors_).index;
226226
return (cube_->get(tradeIdx, upIdx) - cube_->get(tradeIdx, downIdx)) / 2.0;

OREAnalytics/orea/cube/sensitivitycube.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ class SensitivityCube {
5757
SensitivityCube(const boost::shared_ptr<NPVSensiCube>& cube,
5858
const std::vector<ShiftScenarioDescription>& scenarioDescriptions,
5959
const std::map<RiskFactorKey, QuantLib::Real>& shiftSizes,
60-
const std::map<RiskFactorKey, std::string>& shiftSchemes);
60+
const std::map<RiskFactorKey, ShiftScheme>& shiftSchemes);
6161

6262
//! Constructor using a vector of scenario description strings
6363
SensitivityCube(const boost::shared_ptr<NPVSensiCube>& cube, const std::vector<std::string>& scenarioDescriptions,
6464
const std::map<RiskFactorKey, QuantLib::Real>& shiftSizes,
65-
const std::map<RiskFactorKey, std::string>& shiftSchemes);
65+
const std::map<RiskFactorKey, ShiftScheme>& shiftSchemes);
6666

6767
//! \name Inspectors
6868
//@{
@@ -106,7 +106,7 @@ class SensitivityCube {
106106
QuantLib::Real shiftSize(const RiskFactorKey& riskFactorKey) const;
107107

108108
//! Returns the shift scheme for given risk factor \p key
109-
std::string shiftScheme(const RiskFactorKey& riskFactorKey) const;
109+
ShiftScheme shiftScheme(const RiskFactorKey& riskFactorKey) const;
110110

111111
//! Get the base NPV for trade with ID \p tradeId
112112
QuantLib::Real npv(const std::string& tradeId) const;
@@ -154,7 +154,7 @@ class SensitivityCube {
154154
boost::shared_ptr<NPVSensiCube> cube_;
155155
std::vector<ShiftScenarioDescription> scenarioDescriptions_;
156156
std::map<RiskFactorKey, QuantLib::Real> shiftSizes_;
157-
std::map<RiskFactorKey, std::string> shiftSchemes_;
157+
std::map<RiskFactorKey, ShiftScheme> shiftSchemes_;
158158

159159
// Duplication between map keys below and these sets but trade-off
160160
// Means that we can return by reference in public inspector methods

OREAnalytics/orea/engine/parsensitivityanalysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2154,7 +2154,7 @@ void ParSensitivityAnalysis::populateShiftSizes(const RiskFactorKey& key, Real p
21542154
Real zeroShiftSize = getShiftSize(key, sensitivityData_, simMarket);
21552155
auto shiftData = sensitivityData_.shiftData(key.keytype, key.name);
21562156
Real parShiftSize = shiftData.shiftSize;
2157-
if (shiftData.shiftType == "Relative")
2157+
if (shiftData.shiftType == ShiftType::Relative)
21582158
parShiftSize *= parRate;
21592159

21602160
// Update the map

OREAnalytics/orea/engine/sensitivityanalysis.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -218,15 +218,15 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
218218
auto itr = sensiParams.fxShiftData().find(keylabel);
219219
QL_REQUIRE(itr != sensiParams.fxShiftData().end(), "shiftData not found for " << keylabel);
220220
shiftSize = itr->second.shiftSize;
221-
if (parseShiftType(itr->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
221+
if (itr->second.shiftType == ShiftType::Relative) {
222222
shiftMult = simMarket->fxRate(keylabel, marketConfiguration)->value();
223223
}
224224
} break;
225225
case RiskFactorKey::KeyType::EquitySpot: {
226226
auto itr = sensiParams.equityShiftData().find(keylabel);
227227
QL_REQUIRE(itr != sensiParams.equityShiftData().end(), "shiftData not found for " << keylabel);
228228
shiftSize = itr->second.shiftSize;
229-
if (parseShiftType(itr->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
229+
if (itr->second.shiftType == ShiftType::Relative) {
230230
shiftMult = simMarket->equitySpot(keylabel, marketConfiguration)->value();
231231
}
232232
} break;
@@ -235,7 +235,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
235235
auto itr = sensiParams.discountCurveShiftData().find(ccy);
236236
QL_REQUIRE(itr != sensiParams.discountCurveShiftData().end(), "shiftData not found for " << ccy);
237237
shiftSize = itr->second->shiftSize;
238-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
238+
if (itr->second->shiftType == ShiftType::Relative) {
239239
Size keyIdx = key.index;
240240
Period p = itr->second->shiftTenors[keyIdx];
241241
Handle<YieldTermStructure> yts = simMarket->discountCurve(ccy, marketConfiguration);
@@ -249,7 +249,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
249249
auto itr = sensiParams.indexCurveShiftData().find(idx);
250250
QL_REQUIRE(itr != sensiParams.indexCurveShiftData().end(), "shiftData not found for " << idx);
251251
shiftSize = itr->second->shiftSize;
252-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
252+
if (itr->second->shiftType == ShiftType::Relative) {
253253
Size keyIdx = key.index;
254254
Period p = itr->second->shiftTenors[keyIdx];
255255
Handle<YieldTermStructure> yts = simMarket->iborIndex(idx, marketConfiguration)->forwardingTermStructure();
@@ -263,7 +263,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
263263
auto itr = sensiParams.yieldCurveShiftData().find(yc);
264264
QL_REQUIRE(itr != sensiParams.yieldCurveShiftData().end(), "shiftData not found for " << yc);
265265
shiftSize = itr->second->shiftSize;
266-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
266+
if (itr->second->shiftType == ShiftType::Relative) {
267267
Size keyIdx = key.index;
268268
Period p = itr->second->shiftTenors[keyIdx];
269269
Handle<YieldTermStructure> yts = simMarket->yieldCurve(yc, marketConfiguration);
@@ -278,7 +278,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
278278
QL_REQUIRE(itr != sensiParams.dividendYieldShiftData().end(), "shiftData not found for " << eq);
279279
shiftSize = itr->second->shiftSize;
280280

281-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
281+
if (itr->second->shiftType == ShiftType::Relative) {
282282
Size keyIdx = key.index;
283283
Period p = itr->second->shiftTenors[keyIdx];
284284
Handle<YieldTermStructure> ts = simMarket->equityDividendCurve(eq, marketConfiguration);
@@ -292,7 +292,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
292292
auto itr = sensiParams.fxVolShiftData().find(pair);
293293
QL_REQUIRE(itr != sensiParams.fxVolShiftData().end(), "shiftData not found for " << pair);
294294
shiftSize = itr->second.shiftSize;
295-
if (parseShiftType(itr->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
295+
if (itr->second.shiftType == ShiftType::Relative) {
296296
vector<Real> strikes = sensiParams.fxVolShiftData().at(pair).shiftStrikes;
297297
QL_REQUIRE(strikes.size() == 1 && close_enough(strikes[0], 0), "Only ATM FX vols supported");
298298
Real atmFwd = 0.0; // hardcoded, since only ATM supported
@@ -309,7 +309,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
309309
auto itr = sensiParams.equityVolShiftData().find(pair);
310310
QL_REQUIRE(itr != sensiParams.equityVolShiftData().end(), "shiftData not found for " << pair);
311311
shiftSize = itr->second.shiftSize;
312-
if (parseShiftType(itr->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
312+
if (itr->second.shiftType == ShiftType::Relative) {
313313
Size keyIdx = key.index;
314314
Period p = itr->second.shiftExpiries[keyIdx];
315315
Handle<BlackVolTermStructure> vts = simMarket->equityVol(pair, marketConfiguration);
@@ -322,7 +322,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
322322
auto itr = sensiParams.swaptionVolShiftData().find(keylabel);
323323
QL_REQUIRE(itr != sensiParams.swaptionVolShiftData().end(), "shiftData not found for " << keylabel);
324324
shiftSize = itr->second.shiftSize;
325-
if (parseShiftType(itr->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
325+
if (itr->second.shiftType == ShiftType::Relative) {
326326
vector<Real> strikes = itr->second.shiftStrikes;
327327
vector<Period> tenors = itr->second.shiftTerms;
328328
vector<Period> expiries = itr->second.shiftExpiries;
@@ -342,7 +342,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
342342
auto itr = sensiParams.yieldVolShiftData().find(securityId);
343343
QL_REQUIRE(itr != sensiParams.yieldVolShiftData().end(), "shiftData not found for " << securityId);
344344
shiftSize = itr->second.shiftSize;
345-
if (parseShiftType(itr->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
345+
if (itr->second.shiftType == ShiftType::Relative) {
346346
vector<Real> strikes = itr->second.shiftStrikes;
347347
QL_REQUIRE(strikes.size() == 1 && close_enough(strikes[0], 0.0),
348348
"shift strikes should be {0.0} for yield volatilities");
@@ -364,7 +364,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
364364
auto itr = sensiParams.capFloorVolShiftData().find(ccy);
365365
QL_REQUIRE(itr != sensiParams.capFloorVolShiftData().end(), "shiftData not found for " << ccy);
366366
shiftSize = itr->second->shiftSize;
367-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
367+
if (itr->second->shiftType == ShiftType::Relative) {
368368
vector<Real> strikes = itr->second->shiftStrikes;
369369
vector<Period> expiries = itr->second->shiftExpiries;
370370
QL_REQUIRE(strikes.size() > 0, "Only strike capfloor vols supported");
@@ -377,7 +377,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
377377
auto itr = sensiParams.cdsVolShiftData().find(name);
378378
QL_REQUIRE(itr != sensiParams.cdsVolShiftData().end(), "shiftData not found for " << name);
379379
shiftSize = itr->second.shiftSize;
380-
if (parseShiftType(itr->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
380+
if (itr->second.shiftType == ShiftType::Relative) {
381381
vector<Period> expiries = itr->second.shiftExpiries;
382382
Size keyIdx = key.index;
383383
Size expIdx = keyIdx;
@@ -393,7 +393,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
393393
auto itr = sensiParams.creditCurveShiftData().find(name);
394394
QL_REQUIRE(itr != sensiParams.creditCurveShiftData().end(), "shiftData not found for " << name);
395395
shiftSize = itr->second->shiftSize;
396-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
396+
if (itr->second->shiftType == ShiftType::Relative) {
397397
Size keyIdx = key.index;
398398
Period p = itr->second->shiftTenors[keyIdx];
399399
Handle<DefaultProbabilityTermStructure> ts = simMarket->defaultCurve(name, marketConfiguration)->curve();
@@ -407,7 +407,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
407407
auto itr = sensiParams.baseCorrelationShiftData().find(name);
408408
QL_REQUIRE(itr != sensiParams.baseCorrelationShiftData().end(), "shiftData not found for " << name);
409409
shiftSize = itr->second.shiftSize;
410-
if (parseShiftType(itr->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
410+
if (itr->second.shiftType == ShiftType::Relative) {
411411
vector<Real> lossLevels = itr->second.shiftLossLevels;
412412
vector<Period> terms = itr->second.shiftTerms;
413413
Size keyIdx = key.index;
@@ -425,7 +425,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
425425
auto itr = sensiParams.zeroInflationCurveShiftData().find(idx);
426426
QL_REQUIRE(itr != sensiParams.zeroInflationCurveShiftData().end(), "shiftData not found for " << idx);
427427
shiftSize = itr->second->shiftSize;
428-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
428+
if (itr->second->shiftType == ShiftType::Relative) {
429429
Size keyIdx = key.index;
430430
Period p = itr->second->shiftTenors[keyIdx];
431431
Handle<ZeroInflationTermStructure> yts =
@@ -440,7 +440,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
440440
auto itr = sensiParams.yoyInflationCurveShiftData().find(idx);
441441
QL_REQUIRE(itr != sensiParams.yoyInflationCurveShiftData().end(), "shiftData not found for " << idx);
442442
shiftSize = itr->second->shiftSize;
443-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
443+
if (itr->second->shiftType == ShiftType::Relative) {
444444
Size keyIdx = key.index;
445445
Period p = sensiParams.yoyInflationCurveShiftData().at(idx)->shiftTenors[keyIdx];
446446
Handle<YoYInflationTermStructure> yts =
@@ -455,7 +455,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
455455
auto itr = sensiParams.yoyInflationCapFloorVolShiftData().find(name);
456456
QL_REQUIRE(itr != sensiParams.yoyInflationCapFloorVolShiftData().end(), "shiftData not found for " << name);
457457
shiftSize = itr->second->shiftSize;
458-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
458+
if (itr->second->shiftType == ShiftType::Relative) {
459459
vector<Real> strikes = itr->second->shiftStrikes;
460460
vector<Period> expiries = itr->second->shiftExpiries;
461461
QL_REQUIRE(strikes.size() > 0, "Only strike yoy inflation capfloor vols supported");
@@ -474,7 +474,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
474474
auto itr = sensiParams.zeroInflationCapFloorVolShiftData().find(name);
475475
QL_REQUIRE(itr != sensiParams.zeroInflationCapFloorVolShiftData().end(), "shiftData not found for " << name);
476476
shiftSize = itr->second->shiftSize;
477-
if (parseShiftType(itr->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
477+
if (itr->second->shiftType == ShiftType::Relative) {
478478
vector<Real> strikes = itr->second->shiftStrikes;
479479
vector<Period> expiries = itr->second->shiftExpiries;
480480
QL_REQUIRE(strikes.size() > 0, "Only strike zc inflation capfloor vols supported");
@@ -493,7 +493,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
493493
auto it = sensiParams.commodityCurveShiftData().find(keylabel);
494494
QL_REQUIRE(it != sensiParams.commodityCurveShiftData().end(), "shiftData not found for " << keylabel);
495495
shiftSize = it->second->shiftSize;
496-
if (parseShiftType(it->second->shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
496+
if (it->second->shiftType == ShiftType::Relative) {
497497
Period p = it->second->shiftTenors[key.index];
498498
Handle<PriceTermStructure> priceCurve = simMarket->commodityPriceCurve(keylabel, marketConfiguration);
499499
Time t = priceCurve->dayCounter().yearFraction(asof, asof + p);
@@ -505,7 +505,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
505505
QL_REQUIRE(it != sensiParams.commodityVolShiftData().end(), "shiftData not found for " << keylabel);
506506

507507
shiftSize = it->second.shiftSize;
508-
if (parseShiftType(it->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
508+
if (it->second.shiftType == ShiftType::Relative) {
509509
Size moneynessIndex = key.index / it->second.shiftExpiries.size();
510510
Size expiryIndex = key.index % it->second.shiftExpiries.size();
511511
Real moneyness = it->second.shiftStrikes[moneynessIndex];
@@ -521,7 +521,7 @@ Real getShiftSize(const RiskFactorKey& key, const SensitivityScenarioData& sensi
521521
auto itr = sensiParams.securityShiftData().find(keylabel);
522522
QL_REQUIRE(itr != sensiParams.securityShiftData().end(), "shiftData not found for " << keylabel);
523523
shiftSize = itr->second.shiftSize;
524-
if (parseShiftType(itr->second.shiftType) == SensitivityScenarioGenerator::ShiftType::Relative) {
524+
if (itr->second.shiftType == ShiftType::Relative) {
525525
shiftMult = 1.0;
526526
try {
527527
shiftMult = simMarket->securitySpread(keylabel, marketConfiguration)->value();

0 commit comments

Comments
 (0)