@@ -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
374376boost::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-
410423HistoricalScenarioGeneratorWithFilteredDates::HistoricalScenarioGeneratorWithFilteredDates (
411424 const std::vector<TimePeriod>& filter, const boost::shared_ptr<HistoricalScenarioGenerator>& gen)
412425 : HistoricalScenarioGenerator(gen->scenarioLoader (), gen->scenarioFactory(), gen->cal(), gen->adjFactors(),
0 commit comments