2020#include < orea/scenario/scenarioutilities.hpp>
2121#include < orea/scenario/simplescenario.hpp>
2222#include < orea/scenario/simplescenariofactory.hpp>
23+ #include < orea/engine/parsensitivityanalysis.hpp>
2324
2425using namespace QuantLib ;
2526
@@ -33,32 +34,50 @@ ZeroToParScenarioGenerator::ZeroToParScenarioGenerator(
3334 : HistoricalScenarioGenerator(hsg->scenarioLoader (), hsg->scenarioFactory(), hsg->returnConfiguration(),
3435 hsg->adjFactors(), hsg->labelPrefix(), hsg->generateDifferenceScenarios()) {
3536
36- baseScenario_ = hsg->baseScenario ();
37+ auto bs = hsg->baseScenario ();
3738 shiftConverter_ = QuantLib::ext::make_shared<ZeroToParShiftConverter>(parInstruments, simMarket);
3839 auto baseValues = shiftConverter_->baseValues ();
3940
40- // build a base par scenario off the zero base scenario, and update with the calculated par rates
41- baseParScenario_ = baseScenario_->clone ();
41+ // build a base and base par scenario off the zero base scenario, and update with the calculated par rates
42+ // base scenario must be the minimum of the simulation (hsg baseScenario) and sensitivity configuration
43+
44+ baseScenario_ = QuantLib::ext::make_shared<SimpleScenario>(bs->asof (), bs->label (), bs->getNumeraire ());
45+ baseParScenario_ = QuantLib::ext::make_shared<SimpleScenario>(bs->asof (), bs->label (), bs->getNumeraire ());
4246 baseParScenario_->setPar (true );
43- for (const auto & kv : baseValues)
44- baseParScenario_->add (kv.first , kv.second );
47+ for (auto & k : bs->keys ()) {
48+ auto bv = bs->get (k);
49+ if (ParSensitivityAnalysis::isParType (k.keytype )) {
50+ auto it = baseValues.find (k);
51+ if (it != baseValues.end ()) {
52+ // found in par rates
53+ baseScenario_->add (k, bv);
54+ baseParScenario_->add (k, it->second );
55+ }
56+ } else {
57+ baseScenario_->add (k, bv);
58+ baseParScenario_->add (k, bv);
59+ }
60+ }
4561}
4662
4763QuantLib::ext::shared_ptr<Scenario> ZeroToParScenarioGenerator::next (const Date& d) {
4864 auto zeroScenario = HistoricalScenarioGenerator::next (d);
4965
5066 // create a par scenario to hold the par shifts
5167 QuantLib::ext::shared_ptr<Scenario> parScenario =
52- addDifferenceToScenario (baseScenario_, zeroScenario, d, baseScenario_->getNumeraire ());
68+ addDifferenceToScenario (baseScenario_, zeroScenario, d, baseScenario_->getNumeraire (), true );
5369 parScenario->setPar (true );
70+ parScenario->label (to_string (d));
5471
5572 // get the par shifts and update the par scenario
5673 auto parShifts = shiftConverter_->parShifts (zeroScenario);
5774 auto baseRates = shiftConverter_->baseValues ();
5875
5976 for (const auto & kv : parShifts) {
60- auto base = baseRates[kv.first ];
61- parScenario->add (kv.first , base + kv.second );
77+ if (baseScenario_->has (kv.first )) {
78+ auto base = baseRates[kv.first ];
79+ parScenario->add (kv.first , base + kv.second );
80+ }
6281 }
6382
6483 return parScenario;
0 commit comments