Skip to content

Commit 7670735

Browse files
mgronckijenkins
authored andcommitted
QPR-12376 bugfix
1 parent 295b1ad commit 7670735

3 files changed

Lines changed: 43 additions & 3 deletions

File tree

Examples/Example_67/Input/simulation.xml

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,42 @@
200200
<!-- Alternative: LinearZero -->
201201
<Extrapolation>Y</Extrapolation>
202202
</Configuration>
203-
203+
<Configuration curve='EUR'>
204+
<Tenors>3D, 11D, 18D, 25D, 33D, 66D, 94D, 125D, 157D, 186D, 217D, 248D, 278D, 308D, 339D, 370D, 459D, 551D, 643D, 735D, 1102D, 1466D, 1831D, 2196D, 2561D, 2926D, 3293D, 3657D, 4022D, 4387D, 5484D, 7311D, 9138D, 10962D</Tenors>
205+
<Interpolation>LogLinear</Interpolation>
206+
<!-- Alternative: LinearZero -->
207+
<Extrapolation>Y</Extrapolation>
208+
</Configuration>
209+
<Configuration curve='EUR-EONIA'>
210+
<Tenors>3D, 11D, 18D, 25D, 33D, 66D, 94D, 125D, 157D, 186D, 217D, 248D, 278D, 308D, 339D, 370D, 459D, 551D, 643D, 735D, 1102D, 1466D, 1831D, 2196D, 2561D, 2926D, 3293D, 3657D, 4022D, 4387D, 5484D, 7311D, 9138D, 10962D</Tenors>
211+
<Interpolation>LogLinear</Interpolation>
212+
<!-- Alternative: LinearZero -->
213+
<Extrapolation>Y</Extrapolation>
214+
</Configuration>
215+
<Configuration curve='EUR-EURIBOR-6M'>
216+
<Tenors>186D, 735D, 1102D, 1466D, 1831D, 2196D, 2561D, 3657D, 4387D, 5484D, 7311D, 9138D, 25574D, 18267D</Tenors>
217+
<Interpolation>LogLinear</Interpolation>
218+
<!-- Alternative: LinearZero -->
219+
<Extrapolation>Y</Extrapolation>
220+
</Configuration>
221+
<Configuration curve='EUR-EURIBOR-3M'>
222+
<Tenors>5D, 33D, 66D, 94D, 125D, 157D, 186D, 217D, 249D, 278D, 370D, 459D, 735D, 1102D, 1466D, 1831D, 2196D, 2561D, 2926D, 3293D, 3657D, 4387D, 5484D, 7311D, 9138D, 14614D, 18267D</Tenors>
223+
<Interpolation>LogLinear</Interpolation>
224+
<!-- Alternative: LinearZero -->
225+
<Extrapolation>Y</Extrapolation>
226+
</Configuration>
227+
<Configuration curve='USD'>
228+
<Tenors>90D, 182D, 276D, 367D, 735D, 1102D, 1466D, 1831D, 2561D, 3657D, 7311D, 10962D, 14614D, 18267D</Tenors>
229+
<Interpolation>LogLinear</Interpolation>
230+
<!-- Alternative: LinearZero -->
231+
<Extrapolation>Y</Extrapolation>
232+
</Configuration>
233+
<Configuration curve='USD-FedFunds'>
234+
<Tenors>90D, 182D, 276D, 367D, 735D, 1102D, 1466D, 1831D, 2561D, 3657D, 7311D, 10962D, 14614D, 18267D</Tenors>
235+
<Interpolation>LogLinear</Interpolation>
236+
<!-- Alternative: LinearZero -->
237+
<Extrapolation>Y</Extrapolation>
238+
</Configuration>
204239
</YieldCurves>
205240
<Indices>
206241
<Index>EUR-EURIBOR-6M</Index>

OREAnalytics/orea/scenario/scenariosimmarket.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2849,6 +2849,7 @@ ScenarioSimMarket::ScenarioSimMarket(
28492849

28502850
if (offsetScenario_ != nullptr && offsetScenario_->isAbsolute() && !useSpreadedTermStructures_) {
28512851
auto recastedScenario = recastScenario(offsetScenario_, offsetScenario_->coordinates(), coordinatesData_);
2852+
QL_REQUIRE(recastedScenario != nullptr, "ScenarioSimMarke: Offset Scenario couldn't applied");
28522853
for (auto& [key, quote] : simData_) {
28532854
if (recastedScenario->has(key)) {
28542855
quote->setValue(recastedScenario->get(key));
@@ -2860,6 +2861,7 @@ ScenarioSimMarket::ScenarioSimMarket(
28602861
}
28612862
} else if (offsetScenario_ != nullptr && offsetScenario_->isAbsolute() && useSpreadedTermStructures_) {
28622863
auto recastedScenario = recastScenario(offsetScenario_, offsetScenario_->coordinates(), coordinatesData_);
2864+
QL_REQUIRE(recastedScenario != nullptr, "ScenarioSimMarke: Offset Scenario couldn't applied");
28632865
for (auto& [key, data] : simData_) {
28642866
if (recastedScenario->has(key)) {
28652867
auto shift = getDifferenceScenario(key.keytype, absoluteSimData_[key], recastedScenario->get(key));
@@ -2873,6 +2875,7 @@ ScenarioSimMarket::ScenarioSimMarket(
28732875
}
28742876
} else if (offsetScenario_ != nullptr && !offsetScenario_->isAbsolute() && !useSpreadedTermStructures_) {
28752877
auto recastedScenario = recastScenario(offsetScenario_, offsetScenario_->coordinates(), coordinatesData_);
2878+
QL_REQUIRE(recastedScenario != nullptr, "ScenarioSimMarke: Offset Scenario couldn't applied");
28762879
for (auto& [key, quote] : simData_) {
28772880
if (recastedScenario->has(key)) {
28782881
quote->setValue(addDifferenceToScenario(key.keytype, quote->value(), recastedScenario->get(key)));
@@ -2884,6 +2887,7 @@ ScenarioSimMarket::ScenarioSimMarket(
28842887
}
28852888
} else if (offsetScenario_ != nullptr && !offsetScenario_->isAbsolute() && useSpreadedTermStructures_) {
28862889
auto recastedScenario = recastScenario(offsetScenario_, offsetScenario_->coordinates(), coordinatesData_);
2890+
QL_REQUIRE(recastedScenario != nullptr, "ScenarioSimMarke: Offset Scenario couldn't applied");
28872891
for (auto& [key, quote] : simData_) {
28882892
if (recastedScenario->has(key)) {
28892893
quote->setValue(recastedScenario->get(key));

OREAnalytics/orea/scenario/scenarioutilities.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,8 @@ QuantLib::ext::shared_ptr<Scenario> recastScenario(
274274
int workingIndex;
275275
do {
276276
workingIndex = indices.size() - 1;
277-
while (workingIndex >= 0 && indices[workingIndex] == c1->second[workingIndex].size()) {
277+
indices[workingIndex]++;
278+
while (workingIndex >= 0 && indices[workingIndex] == c1->second[workingIndex].size()+1) {
278279
--workingIndex;
279280
if (workingIndex >= 0)
280281
indices[workingIndex] = 0;
@@ -283,7 +284,7 @@ QuantLib::ext::shared_ptr<Scenario> recastScenario(
283284
RiskFactorKey key(k.first, k.second, newKeyIndex++);
284285
result->add(key, interpolatedValue(c0->second, c1->second, indices, k, scenario));
285286
}
286-
indices[workingIndex]++;
287+
287288
} while (workingIndex >= 0);
288289
}
289290
}

0 commit comments

Comments
 (0)