@@ -137,6 +137,23 @@ Real ReturnConfiguration::applyReturn(const RiskFactorKey& key, const Real baseV
137137 return value;
138138}
139139
140+ const std::map<RiskFactorKey::KeyType, ReturnConfiguration::ReturnType> ReturnConfiguration::returnTypes () const {
141+ return returnType_;
142+ }
143+
144+ std::ostream& operator <<(std::ostream& out, const ReturnConfiguration::ReturnType t) {
145+ switch (t) {
146+ case ReturnConfiguration::ReturnType::Absolute:
147+ return out << " Absolute" ;
148+ case ReturnConfiguration::ReturnType::Relative:
149+ return out << " Relative" ;
150+ case ReturnConfiguration::ReturnType::Log:
151+ return out << " Log" ;
152+ default :
153+ return out << " Unknown ReturnType (" << static_cast <int >(t) << " )" ;
154+ }
155+ }
156+
140157void ReturnConfiguration::check (const RiskFactorKey& key) const {
141158
142159 auto keyType = key.keytype ;
@@ -223,6 +240,8 @@ boost::shared_ptr<Scenario> HistoricalScenarioGenerator::next(const Date& d) {
223240 boost::shared_ptr<Scenario> scen = scenarioFactory_->buildScenario (d, " " , 1.0 );
224241
225242 // loop over all keys
243+ calculationDetails_.resize (baseScenario_->keys ().size ());
244+ Size calcDetailsCounter = 0 ;
226245 for (auto key : baseScenario_->keys ()) {
227246 Real base = baseScenario_->get (key);
228247 Real v1 = 1.0 , v2 = 1.0 ;
@@ -238,14 +257,29 @@ boost::shared_ptr<Scenario> HistoricalScenarioGenerator::next(const Date& d) {
238257 // Calculate the returned value
239258 Real returnVal = returnConfiguration_.returnValue (key, v1, v2, s1->asof (), s2->asof ());
240259 // Adjust return for any scaling
241- returnVal = returnVal * scaling (key, returnVal);
260+ Real scaling = this ->scaling (key, returnVal);
261+ returnVal = returnVal * scaling;
242262 // Calculate the shifted value
243263 value = returnConfiguration_.applyReturn (key, base, returnVal);
244264 if (std::isinf (value)) {
245265 ALOG (" Value is inf for " << key << " from date " << s1->asof () << " to " << s2->asof ());
246266 }
247267 // Add it
248268 scen->add (key, value);
269+ // Populate calculation details
270+ calculationDetails_[calcDetailsCounter].scenarioDate1 = s1->asof ();
271+ calculationDetails_[calcDetailsCounter].scenarioDate2 = s2->asof ();
272+ calculationDetails_[calcDetailsCounter].key = key;
273+ calculationDetails_[calcDetailsCounter].baseValue = base;
274+ calculationDetails_[calcDetailsCounter].adjustmentFactor1 = adjFactors_->getFactor (key.name , s1->asof ());
275+ calculationDetails_[calcDetailsCounter].adjustmentFactor2 = adjFactors_->getFactor (key.name , s2->asof ());
276+ calculationDetails_[calcDetailsCounter].scenarioValue1 = v1;
277+ calculationDetails_[calcDetailsCounter].scenarioValue2 = v2;
278+ calculationDetails_[calcDetailsCounter].returnType = returnConfiguration_.returnTypes ().at (key.keytype );
279+ calculationDetails_[calcDetailsCounter].scaling = scaling;
280+ calculationDetails_[calcDetailsCounter].returnValue = returnVal;
281+ calculationDetails_[calcDetailsCounter].scenarioValue = value;
282+ ++calcDetailsCounter;
249283 }
250284
251285 // Label the scenario
@@ -258,6 +292,11 @@ boost::shared_ptr<Scenario> HistoricalScenarioGenerator::next(const Date& d) {
258292 return scen;
259293}
260294
295+ const std::vector<HistoricalScenarioGenerator::HistoricalScenarioCalculationDetails>&
296+ HistoricalScenarioGenerator::lastHistoricalScenarioCalculationDetails () const {
297+ return calculationDetails_;
298+ }
299+
261300Size HistoricalScenarioGenerator::numScenarios () const {
262301 // We have a start date for each valid scenario
263302 return startDates_.size ();
0 commit comments