Skip to content

Commit 208869a

Browse files
pcaspersjenkins
authored andcommitted
QPR-11659 use transformed scenarios
1 parent 89db757 commit 208869a

2 files changed

Lines changed: 33 additions & 18 deletions

File tree

OREAnalytics/orea/scenario/historicalscenariogenerator.cpp

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ boost::shared_ptr<Scenario> HistoricalScenarioGenerator::next(const Date& d) {
242242
// loop over all keys
243243
calculationDetails_.resize(baseScenario_->keys().size());
244244
Size calcDetailsCounter = 0;
245-
for (auto key : baseScenario_->keys()) {
245+
for (auto const& key : baseScenario_->keys()) {
246246
Real base = baseScenario_->get(key);
247247
Real v1 = 1.0, v2 = 1.0;
248248
if (!s1->has(key) || !s2->has(key)) {
@@ -271,8 +271,10 @@ boost::shared_ptr<Scenario> HistoricalScenarioGenerator::next(const Date& d) {
271271
calculationDetails_[calcDetailsCounter].scenarioDate2 = s2->asof();
272272
calculationDetails_[calcDetailsCounter].key = key;
273273
calculationDetails_[calcDetailsCounter].baseValue = base;
274-
calculationDetails_[calcDetailsCounter].adjustmentFactor1 = adjFactors_->getFactor(key.name, s1->asof());
275-
calculationDetails_[calcDetailsCounter].adjustmentFactor2 = adjFactors_->getFactor(key.name, s2->asof());
274+
calculationDetails_[calcDetailsCounter].adjustmentFactor1 =
275+
adjFactors_ ? adjFactors_->getFactor(key.name, s1->asof()) : 1.0;
276+
calculationDetails_[calcDetailsCounter].adjustmentFactor2 =
277+
adjFactors_ ? adjFactors_->getFactor(key.name, s2->asof()) : 1.0;
276278
calculationDetails_[calcDetailsCounter].scenarioValue1 = v1;
277279
calculationDetails_[calcDetailsCounter].scenarioValue2 = v2;
278280
calculationDetails_[calcDetailsCounter].returnType = returnConfiguration_.returnTypes().at(key.keytype);
@@ -372,9 +374,9 @@ void HistoricalScenarioGeneratorRandom::reset() {
372374
}
373375

374376
boost::shared_ptr<Scenario> HistoricalScenarioGeneratorTransform::next(const Date& d) {
375-
boost::shared_ptr<Scenario> scenario = hsg_->next(d)->clone();
376-
const vector<RiskFactorKey>& keys = hsg_->baseScenario()->keys();
377-
Date asof = hsg_->baseScenario()->asof();
377+
boost::shared_ptr<Scenario> scenario = HistoricalScenarioGenerator::next(d)->clone();
378+
const vector<RiskFactorKey>& keys = baseScenario()->keys();
379+
Date asof = baseScenario()->asof();
378380
vector<Period> tenors;
379381
Date endDate;
380382
DayCounter dc;
@@ -383,8 +385,6 @@ boost::shared_ptr<Scenario> HistoricalScenarioGeneratorTransform::next(const Dat
383385
if ((keys[k].keytype == RiskFactorKey::KeyType::DiscountCurve) ||
384386
(keys[k].keytype == RiskFactorKey::KeyType::IndexCurve) ||
385387
(keys[k].keytype == RiskFactorKey::KeyType::SurvivalProbability)) {
386-
Real df = scenario->get(keys[k]);
387-
Real compound = 1 / df;
388388
if ((keys[k].keytype == RiskFactorKey::KeyType::DiscountCurve)) {
389389
dc = simMarket_->discountCurve(keys[k].name)->dayCounter();
390390
tenors = simMarketConfig_->yieldCurveTenors(keys[k].name);
@@ -395,18 +395,31 @@ boost::shared_ptr<Scenario> HistoricalScenarioGeneratorTransform::next(const Dat
395395
dc = simMarket_->defaultCurve(keys[k].name)->curve()->dayCounter();
396396
tenors = simMarketConfig_->defaultTenors(keys[k].name);
397397
}
398+
398399
endDate = asof + tenors[keys[k].index];
399-
Real zero = InterestRate::impliedRate(compound, dc, QuantLib::Compounding::Continuous,
400-
QuantLib::Frequency::Annual, asof, endDate)
401-
.rate();
400+
401+
auto toZero = [&dc, &asof, &endDate](double compound) {
402+
return InterestRate::impliedRate(compound, dc, QuantLib::Compounding::Continuous,
403+
QuantLib::Frequency::Annual, asof, endDate)
404+
.rate();
405+
};
406+
407+
Real zero = toZero(1.0 / scenario->get(keys[k]));
402408
scenario->add(keys[k], zero);
409+
// update calc details
410+
calculationDetails_[k].baseValue = toZero(1.0 / calculationDetails_[k].baseValue);
411+
calculationDetails_[k].scenarioValue1 = toZero(1.0 / calculationDetails_[k].scenarioValue1);
412+
calculationDetails_[k].scenarioValue2 = toZero(1.0 / calculationDetails_[k].scenarioValue2);
413+
calculationDetails_[k].returnType = ReturnConfiguration::ReturnType::Absolute;
414+
calculationDetails_[k].returnValue =
415+
calculationDetails_[k].scaling *
416+
(calculationDetails_[k].scenarioValue2 - calculationDetails_[k].scenarioValue1);
417+
calculationDetails_[k].scenarioValue = toZero(1.0 / calculationDetails_[k].scenarioValue);
403418
}
404419
}
405420
return scenario;
406421
}
407422

408-
void HistoricalScenarioGeneratorTransform::reset() { hsg_->reset(); }
409-
410423
HistoricalScenarioGeneratorWithFilteredDates::HistoricalScenarioGeneratorWithFilteredDates(
411424
const std::vector<TimePeriod>& filter, const boost::shared_ptr<HistoricalScenarioGenerator>& gen)
412425
: HistoricalScenarioGenerator(gen->scenarioLoader(), gen->scenarioFactory(), gen->cal(), gen->adjFactors(),

OREAnalytics/orea/scenario/historicalscenariogenerator.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -245,19 +245,21 @@ class HistoricalScenarioGeneratorRandom : public HistoricalScenarioGenerator {
245245
* WARNING: This transform function should only be used for backtesting statistics reports requiring the transforms
246246
* listed above.
247247
*/
248-
class HistoricalScenarioGeneratorTransform : public ScenarioGenerator {
248+
class HistoricalScenarioGeneratorTransform : public HistoricalScenarioGenerator {
249249
public:
250250
HistoricalScenarioGeneratorTransform(boost::shared_ptr<HistoricalScenarioGenerator>& hsg,
251251
const boost::shared_ptr<ScenarioSimMarket>& simMarket,
252252
const boost::shared_ptr<ScenarioSimMarketParameters>& simMarketConfig)
253-
: hsg_(hsg), simMarket_(simMarket), simMarketConfig_(simMarketConfig) {}
253+
: HistoricalScenarioGenerator(hsg->scenarioLoader(), hsg->scenarioFactory(), hsg->cal(), hsg->adjFactors(),
254+
hsg->mporDays(), hsg->overlapping(), hsg->returnConfiguration(),
255+
hsg->labelPrefix()),
256+
simMarket_(simMarket), simMarketConfig_(simMarketConfig) {
257+
baseScenario_ = hsg->baseScenario();
258+
}
254259

255260
boost::shared_ptr<Scenario> next(const QuantLib::Date& d) override;
256261

257-
void reset() override;
258-
259262
private:
260-
boost::shared_ptr<HistoricalScenarioGenerator> hsg_;
261263
boost::shared_ptr<ScenarioSimMarket> simMarket_;
262264
boost::shared_ptr<ScenarioSimMarketParameters> simMarketConfig_;
263265
};

0 commit comments

Comments
 (0)