Skip to content

Commit 1aa0696

Browse files
mgronckijenkins
authored andcommitted
Merge remote-tracking branch 'origin/master' into QPR-12145
# Conflicts: # RegressionTests/Pricer/Inputs/ConvertibleBond_Leversys_20210129/ExpectedOutput/crif.csv
2 parents b2ff9a4 + 37357e9 commit 1aa0696

6 files changed

Lines changed: 30 additions & 26 deletions

File tree

Docker/Dockerfile-Test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ RUN apt-get update \
55
&& DEBIAN_FRONTEND=noninteractive apt-get install -y dos2unix python3 python3-pip libxml2-utils xsltproc \
66
&& apt-get clean \
77
&& rm -rf /var/lib/apt/lists/* \
8-
&& pip3 install matplotlib pandas nose nose_xunitmp datacompy jsondiff
8+
&& pip3 install matplotlib pandas nose nose_xunitmp datacompy jsondiff lxml
99

1010
CMD bash
1111

OREAnalytics/orea/engine/stresstest.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ StressTest::StressTest(const boost::shared_ptr<ore::data::Portfolio>& portfolio,
5656
Date asof = market->asofDate();
5757
boost::shared_ptr<Scenario> baseScenario = simMarket->baseScenario();
5858
scenarioFactory = scenarioFactory ? scenarioFactory : boost::make_shared<CloneScenarioFactory>(baseScenario);
59-
boost::shared_ptr<StressScenarioGenerator> scenarioGenerator =
60-
boost::make_shared<StressScenarioGenerator>(stressData, baseScenario, simMarketData, simMarket, scenarioFactory);
59+
boost::shared_ptr<StressScenarioGenerator> scenarioGenerator = boost::make_shared<StressScenarioGenerator>(
60+
stressData, baseScenario, simMarketData, simMarket, scenarioFactory, simMarket->baseScenarioAbsolute());
6161
simMarket->scenarioGenerator() = scenarioGenerator;
6262

6363
DLOG("Build Engine Factory");

OREAnalytics/orea/scenario/stressscenariogenerator.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ StressScenarioGenerator::StressScenarioGenerator(const boost::shared_ptr<StressT
3131
const boost::shared_ptr<Scenario>& baseScenario,
3232
const boost::shared_ptr<ScenarioSimMarketParameters>& simMarketData,
3333
const boost::shared_ptr<ScenarioSimMarket>& simMarket,
34-
const boost::shared_ptr<ScenarioFactory>& stressScenarioFactory)
34+
const boost::shared_ptr<ScenarioFactory>& stressScenarioFactory,
35+
const boost::shared_ptr<Scenario>& baseScenarioAbsolute)
3536
: ShiftScenarioGenerator(baseScenario, simMarketData, simMarket), stressData_(stressData),
36-
stressScenarioFactory_(stressScenarioFactory) {
37+
stressScenarioFactory_(stressScenarioFactory),
38+
baseScenarioAbsolute_(baseScenarioAbsolute == nullptr ? baseScenario : baseScenarioAbsolute) {
3739

3840
QL_REQUIRE(stressData_, "StressScenarioGenerator: stressData is null");
3941

@@ -123,7 +125,7 @@ void StressScenarioGenerator::addEquityShifts(StressTestScenarioData::StressTest
123125
Real size = data.shiftSize;
124126

125127
RiskFactorKey key(RiskFactorKey::KeyType::EquitySpot, equity);
126-
Real rate = baseScenario_->get(key);
128+
Real rate = baseScenarioAbsolute_->get(key);
127129

128130
Real newRate = relShift ? rate * (1.0 + size) : (rate + size);
129131
scenario->add(RiskFactorKey(RiskFactorKey::KeyType::EquitySpot, equity), newRate);
@@ -160,7 +162,7 @@ void StressScenarioGenerator::addDiscountCurveShifts(StressTestScenarioData::Str
160162
Date d = asof + simMarketData_->yieldCurveTenors(ccy)[j];
161163
times[j] = dc.yearFraction(asof, d);
162164
RiskFactorKey key(RiskFactorKey::KeyType::DiscountCurve, ccy, j);
163-
Real quote = baseScenario_->get(key);
165+
Real quote = baseScenarioAbsolute_->get(key);
164166
zeros[j] = -std::log(quote) / times[j];
165167
}
166168

@@ -220,7 +222,7 @@ void StressScenarioGenerator::addSurvivalProbabilityShifts(StressTestScenarioDat
220222
Date d = asof + simMarketData_->defaultTenors(name)[j];
221223
times[j] = dc.yearFraction(asof, d);
222224
RiskFactorKey key(RiskFactorKey::KeyType::SurvivalProbability, name, j);
223-
Real quote = baseScenario_->get(key);
225+
Real quote = baseScenarioAbsolute_->get(key);
224226
zeros[j] = -std::log(quote) / times[j];
225227
}
226228

@@ -282,7 +284,7 @@ void StressScenarioGenerator::addIndexCurveShifts(StressTestScenarioData::Stress
282284
Date d = asof + simMarketData_->yieldCurveTenors(indexName)[j];
283285
times[j] = dc.yearFraction(asof, d);
284286
RiskFactorKey key(RiskFactorKey::KeyType::IndexCurve, indexName, j);
285-
Real quote = baseScenario_->get(key);
287+
Real quote = baseScenarioAbsolute_->get(key);
286288
zeros[j] = -std::log(quote) / times[j];
287289
}
288290

@@ -343,7 +345,7 @@ void StressScenarioGenerator::addYieldCurveShifts(StressTestScenarioData::Stress
343345
Date d = asof + simMarketData_->yieldCurveTenors(name)[j];
344346
times[j] = dc.yearFraction(asof, d);
345347
RiskFactorKey key(RiskFactorKey::KeyType::YieldCurve, name, j);
346-
Real quote = baseScenario_->get(key);
348+
Real quote = baseScenarioAbsolute_->get(key);
347349
zeros[j] = -std::log(quote) / times[j];
348350
}
349351

@@ -406,7 +408,7 @@ void StressScenarioGenerator::addFxVolShifts(StressTestScenarioData::StressTestD
406408
Date d = asof + simMarketData_->fxVolExpiries(ccypair)[j];
407409

408410
RiskFactorKey key(RiskFactorKey::KeyType::FXVolatility, ccypair, j);
409-
values[j] = baseScenario_->get(key);
411+
values[j] = baseScenarioAbsolute_->get(key);
410412

411413
times[j] = dc.yearFraction(asof, d);
412414
}
@@ -467,7 +469,7 @@ void StressScenarioGenerator::addEquityVolShifts(StressTestScenarioData::StressT
467469
Date d = asof + simMarketData_->equityVolExpiries(equity)[j];
468470

469471
RiskFactorKey key(RiskFactorKey::KeyType::EquityVolatility, equity, j);
470-
values[j] = baseScenario_->get(key);
472+
values[j] = baseScenarioAbsolute_->get(key);
471473

472474
times[j] = dc.yearFraction(asof, d);
473475
}
@@ -544,7 +546,7 @@ void StressScenarioGenerator::addSwaptionVolShifts(StressTestScenarioData::Stres
544546
Size idx = j * n_swvol_term + k;
545547

546548
RiskFactorKey rf(RiskFactorKey::KeyType::SwaptionVolatility, key, idx);
547-
volData[j][k] = baseScenario_->get(rf);
549+
volData[j][k] = baseScenarioAbsolute_->get(rf);
548550
}
549551
}
550552

@@ -633,7 +635,7 @@ void StressScenarioGenerator::addCapFloorVolShifts(StressTestScenarioData::Stres
633635
for (Size k = 0; k < n_cfvol_strikes; ++k) {
634636
Size idx = j * n_cfvol_strikes + k;
635637
volData[j][k] =
636-
baseScenario_->get(RiskFactorKey(RiskFactorKey::KeyType::OptionletVolatility, key, idx));
638+
baseScenarioAbsolute_->get(RiskFactorKey(RiskFactorKey::KeyType::OptionletVolatility, key, idx));
637639
}
638640
}
639641

@@ -675,7 +677,7 @@ void StressScenarioGenerator::addSecuritySpreadShifts(StressTestScenarioData::St
675677
Real size = data.shiftSize;
676678

677679
RiskFactorKey key(RiskFactorKey::KeyType::SecuritySpread, bond);
678-
Real base_spread = baseScenario_->get(key);
680+
Real base_spread = baseScenarioAbsolute_->get(key);
679681

680682
Real newSpread = relShift ? base_spread * (1.0 + size) : (base_spread + size);
681683
scenario->add(RiskFactorKey(RiskFactorKey::KeyType::SecuritySpread, bond), newSpread);
@@ -694,7 +696,7 @@ void StressScenarioGenerator::addRecoveryRateShifts(StressTestScenarioData::Stre
694696
Real size = data.shiftSize;
695697

696698
RiskFactorKey key(RiskFactorKey::KeyType::RecoveryRate, isin);
697-
Real base_recoveryRate = baseScenario_->get(key);
699+
Real base_recoveryRate = baseScenarioAbsolute_->get(key);
698700
Real new_recoveryRate = relShift ? base_recoveryRate * (1.0 + size) : (base_recoveryRate + size);
699701
scenario->add(RiskFactorKey(RiskFactorKey::KeyType::RecoveryRate, isin), new_recoveryRate);
700702
}

OREAnalytics/orea/scenario/stressscenariogenerator.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,9 @@ class StressScenarioGenerator : public ShiftScenarioGenerator {
7272
StressScenarioGenerator(const boost::shared_ptr<StressTestScenarioData>& stressData,
7373
const boost::shared_ptr<Scenario>& baseScenario,
7474
const boost::shared_ptr<ScenarioSimMarketParameters>& simMarketData,
75-
const boost::shared_ptr<ScenarioSimMarket>& simMarket,
76-
const boost::shared_ptr<ScenarioFactory>& stressScenarioFactory);
75+
const boost::shared_ptr<ScenarioSimMarket>& simMarket,
76+
const boost::shared_ptr<ScenarioFactory>& stressScenarioFactory,
77+
const boost::shared_ptr<Scenario>& baseScenarioAbsolute = nullptr);
7778
//! Default destructor
7879
~StressScenarioGenerator() {}
7980

@@ -96,6 +97,7 @@ class StressScenarioGenerator : public ShiftScenarioGenerator {
9697

9798
boost::shared_ptr<StressTestScenarioData> stressData_;
9899
boost::shared_ptr<ScenarioFactory> stressScenarioFactory_;
100+
boost::shared_ptr<Scenario> baseScenarioAbsolute_;
99101
};
100102
} // namespace analytics
101103
} // namespace ore

QuantExt/test/crossassetmodel.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2299,7 +2299,7 @@ BOOST_DATA_TEST_CASE(testIrFxInfCrComMartingaleProperty,
22992299
BOOST_TEST_MESSAGE("get Euler state process");
23002300
boost::shared_ptr<StochasticProcess> process2 = d.modelEuler->stateProcess();
23012301

2302-
Size n = 50000; // number of paths
2302+
Size n = 5000; // number of paths
23032303
Size seed = 18; // rng seed
23042304
Time T = 2.0; // maturity of payoff
23052305
Time T2 = 20.0; // zerobond maturity
@@ -2456,7 +2456,7 @@ BOOST_DATA_TEST_CASE(testIrFxInfCrComMartingaleProperty,
24562456

24572457
// a bit higher than for plain zero bond , since we look at indexed zero
24582458
// bonds, too
2459-
Real tol1 = 3.0E-4; // EXACT
2459+
Real tol1 = 5.0E-4; // EXACT
24602460
Real tol2 = 14.0E-4; // EULER
24612461

24622462
Real ev = d.eurYts->discount(T2);
@@ -2565,7 +2565,7 @@ BOOST_DATA_TEST_CASE(testIrFxInfCrComMoments,
25652565

25662566
Real T = 2.0; // horizon at which we compare the moments
25672567
Size steps = static_cast<Size>(T * 10); // number of simulation steps (Euler and exact)
2568-
Size paths = 30000; // number of paths
2568+
Size paths = 10000; // number of paths
25692569

25702570
Array e_an = p_exact->expectation(0.0, p_exact->initialValues(), T);
25712571
Matrix v_an = p_exact->covariance(0.0, p_exact->initialValues(), T);
@@ -2646,7 +2646,7 @@ BOOST_DATA_TEST_CASE(testIrFxInfCrComMoments,
26462646
}
26472647
BOOST_TEST_MESSAGE("==================");
26482648

2649-
Real errTolLd[] = { 0.5E-4, 0.5E-4, 0.5E-4, 10.0E-4, 10.0E-4, 0.9E-4, 0.8E-4, 0.7E-4, 0.7E-4, 0.7E-4, 0.7E-4, 0.7E-4, 0.7E-4 };
2649+
Real errTolLd[] = { 0.5E-4, 0.5E-4, 0.5E-4, 10.0E-4, 10.0E-4, 1E-4, 1E-4, 1E-4, 1E-4, 1E-4, 1E-4, 1E-4, 1E-4 };
26502650

26512651
for (Size i = 0; i < n; ++i) {
26522652
// check expectation against analytical calculation (Euler)
@@ -2667,7 +2667,7 @@ BOOST_DATA_TEST_CASE(testIrFxInfCrComMoments,
26672667
<< e_an[i] - mean(e_eu2[i]) << " tolerance is "
26682668
<< errTolLd[i]);
26692669
}
2670-
}
2670+
}
26712671

26722672
// as above, this is a bit rough compared to the more differentiated
26732673
// test of the IR-FX model ...
@@ -3872,7 +3872,7 @@ BOOST_AUTO_TEST_CASE(testCorrelationRecovery) {
38723872

38733873
// for ir-fx this fully specifies the correlation matrix
38743874
// for new asset classes add other possible combinations as well
3875-
Size currencies[] = { 1, 2, 3, 4, 5, 10, 20, 50, 100 };
3875+
Size currencies[] = { 1, 2, 3, 4, 5, 10, 20 };
38763876

38773877
MersenneTwisterUniformRng mt(42);
38783878

@@ -4181,7 +4181,7 @@ BOOST_AUTO_TEST_CASE(testIrFxInfCrEqCorrelationRecovery) {
41814181

41824182
// for ir-fx this fully specifies the correlation matrix
41834183
// for new asset classes add other possible combinations as well
4184-
Size currencies[] = { 1, 2, 3, 4, 5, 10, 20 };
4184+
Size currencies[] = { 1, 2, 3, 4, 5 };
41854185
Size cpiindexes[] = { 0, 1, 10 };
41864186
Size creditnames[] = { 0, 1, 5 };
41874187
Size eqs[] = { 0, 1, 5 };

QuantExt/test/deltagammavar.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ BOOST_AUTO_TEST_CASE(testDeltaGammaVar) {
146146
// TODO test Daniel's approx. explicitly (khat < 1E-5)
147147
// TODO add more test cases (negative gammas, higher dimensions)
148148

149-
Size n = (Size)1E6;
149+
Size n = (Size)400000;
150150

151151
test(1, true, false, 42, 42, n);
152152
test(1, false, true, 42, 42, n);

0 commit comments

Comments
 (0)