Skip to content

Commit 8d509e1

Browse files
damienbarkerfarahkhashman
authored andcommitted
Merge branch 'feature/QPR-12983' into 'master'
QPR-12983 Fix failing ORED unit tests Closes QPR-12983 See merge request qs/oreplus!2996
1 parent fad1770 commit 8d509e1

28 files changed

Lines changed: 818 additions & 361 deletions

OREAnalytics/orea/engine/sensitivityanalysis.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,15 @@ void SensitivityAnalysis::generateSensitivities() {
119119

120120
// collect the sensi template ids that are relevant for the portfolio
121121

122+
// we need the portfolio to be built to access the trade sensi template ids
123+
map<MarketContext, string> configurations;
124+
configurations[MarketContext::pricing] = marketConfiguration_;
125+
if (!portfolio_->isBuilt() && market_) {
126+
auto factory = QuantLib::ext::make_shared<EngineFactory>(engineData_, market_, configurations, referenceData_,
127+
iborFallbackConfig_);
128+
portfolio_->build(factory, "sensi analysis");
129+
}
130+
122131
std::set<std::string> sensiTemplateIdsFromPortfolio;
123132
for (auto const& [_, t] : portfolio_->trades())
124133
sensiTemplateIdsFromPortfolio.insert(t->sensitivityTemplate());
@@ -167,8 +176,6 @@ void SensitivityAnalysis::generateSensitivities() {
167176
}
168177
scenarioGenerator_ = scenarioGenerators.front();
169178

170-
map<MarketContext, string> configurations;
171-
configurations[MarketContext::pricing] = marketConfiguration_;
172179
auto ed = QuantLib::ext::make_shared<EngineData>(*engineData_);
173180
ed->globalParameters()["RunType"] =
174181
std::string("Sensitivity") + (sensitivityData_->computeGamma() ? "DeltaGamma" : "Delta");

OREAnalytics/orea/scenario/scenariosimmarket.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ ScenarioSimMarket::ScenarioSimMarket(
491491
ich->enableExtrapolation();
492492

493493
QuantLib::ext::shared_ptr<IborIndex> i = index->clone(ich);
494-
if (iborFallbackConfig_->isIndexReplaced(name, asof_)) {
494+
if (iborFallbackConfig_ && iborFallbackConfig_->isIndexReplaced(name, asof_)) {
495495
// handle ibor fallback indices
496496
auto fallbackData = iborFallbackConfig_->fallbackData(name);
497497
auto f = iborIndices_.find(make_pair(Market::defaultConfiguration, fallbackData.rfrIndex));

OREAnalytics/test/sensitivityanalysisanalytic.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,13 @@ BOOST_AUTO_TEST_CASE(testSensitivities) {
295295
QuantLib::ext::shared_ptr<EngineData> data = QuantLib::ext::make_shared<EngineData>();
296296
data->model("Swap") = "DiscountedCashflows";
297297
data->engine("Swap") = "DiscountingSwapEngine";
298+
data->engineParameters("Swap")["SensitivityTemplate"] = "IR_Analytical";
298299
data->model("CrossCurrencySwap") = "DiscountedCashflows";
299300
data->engine("CrossCurrencySwap") = "DiscountingCrossCurrencySwapEngine";
301+
data->engineParameters("CrossCurrencySwap")["SensitivityTemplate"] = "FX_Analytical";
300302
data->model("FxOption") = "GarmanKohlhagen";
301303
data->engine("FxOption") = "AnalyticEuropeanEngine";
304+
data->engineParameters("FxOption")["SensitivityTemplate"] = "FX_Analytical";
302305

303306
// QuantLib::ext::shared_ptr<Portfolio> portfolio = buildSwapPortfolio(portfolioSize, factory);
304307
QuantLib::ext::shared_ptr<Portfolio> portfolio(new Portfolio());

OREAnalytics/test/sensitivityperformance.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,10 +593,13 @@ void test_performance(bool bigPortfolio, bool bigScenario, bool lotsOfSensis, bo
593593
QuantLib::ext::shared_ptr<EngineData> data = QuantLib::ext::make_shared<EngineData>();
594594
data->model("Swap") = "DiscountedCashflows";
595595
data->engine("Swap") = "DiscountingSwapEngine";
596+
data->engineParameters("Swap")["SensitivityTemplate"] = "IR_Analytical";
596597
data->model("EuropeanSwaption") = "BlackBachelier";
597598
data->engine("EuropeanSwaption") = "BlackBachelierSwaptionEngine";
599+
data->engineParameters("EuropeanSwaption")["SensitivityTemplate"] = "IR_Analytical";
598600

599-
QuantLib::ext::shared_ptr<Portfolio> portfolio = buildPortfolio(portfolioSize);
601+
QuantLib::ext::shared_ptr<EngineFactory> factory = QuantLib::ext::make_shared<EngineFactory>(data, initMarket);
602+
QuantLib::ext::shared_ptr<Portfolio> portfolio = buildPortfolio(portfolioSize, factory);
600603

601604
cpu_timer t2;
602605
t2.start();

OREAnalytics/test/testsuite.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class OreaGlobalFixture {
8282
seconds -= hours * 3600;
8383
int minutes = int(seconds / 60);
8484
seconds -= minutes * 60;
85-
std::cout << std::endl << "OREData tests completed in ";
85+
std::cout << std::endl << "OREAnalytics tests completed in ";
8686
if (hours > 0)
8787
std::cout << hours << " h ";
8888
if (hours > 0 || minutes > 0)

OREData/test/cds.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818

1919
#include <boost/make_shared.hpp>
20+
#include <boost/log/attributes/scoped_attribute.hpp>
2021
// clang-format off
2122
#include <boost/test/unit_test.hpp>
2223
#include <boost/test/data/test_case.hpp>
@@ -318,6 +319,7 @@ BOOST_AUTO_TEST_CASE(testUpfrontCurveBuildFailsIfNoRunningSpread) {
318319

319320
Date asof(6, Nov, 2020);
320321
Settings::instance().evaluationDate() = Date(6, Nov, 2020);
322+
BOOST_LOG_SCOPED_THREAD_ATTR("NoConsole", boost::log::attributes::constant<bool>(true));
321323
BOOST_CHECK_THROW(createTodaysMarket(asof, "upfront", tmf), QuantLib::Error);
322324
}
323325

OREData/test/commodityoption.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,9 +296,6 @@ BOOST_AUTO_TEST_CASE(testCommodityOptionBuildExceptions) {
296296
// Negative strike throws
297297
OptionData optionData("Long", "Call", "European", td.payOffAtExpiry, td.expiry);
298298
TradeStrike ts(TradeStrike::Type::Price, -td.strike.value());
299-
option = QuantLib::ext::make_shared<CommodityOption>(td.envelope, optionData, td.commodityName, td.currency, td.quantity, ts);
300-
BOOST_CHECK_THROW(option->build(td.engineFactory), Error);
301-
302299

303300
// Name of commodity with no market data throws
304301
option = QuantLib::ext::make_shared<CommodityOption>(td.envelope, optionData, "GOLD_USD_MISSING", td.currency,

OREData/test/equitymarketdata.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818

1919
#include <boost/test/unit_test.hpp>
20+
#include <boost/log/attributes/scoped_attribute.hpp>
2021
#include <ored/configuration/curveconfigurations.hpp>
2122
#include <ored/marketdata/marketdatumparser.hpp>
2223
#include <ored/utilities/parsers.hpp>
@@ -208,6 +209,8 @@ BOOST_AUTO_TEST_CASE(testEqCurveConfigBadLoad) {
208209
BOOST_CHECK_NO_THROW(ore::data::XMLUtils::checkNode(badNode, "CurveConfiguration"));
209210
ore::data::CurveConfigurations cc;
210211
BOOST_CHECK_NO_THROW(cc.fromXML(badNode)); // the spot price is missing, but the correct behaviour is to log error and move on
212+
// Disable console logging for this test as we expect errors
213+
BOOST_LOG_SCOPED_THREAD_ATTR("NoConsole", boost::log::attributes::constant<bool>(true));
211214
BOOST_CHECK_THROW(cc.equityCurveConfig("SP5Mini"), QuantLib::Error); // this checks that the XML throws when we try to load
212215
}
213216

OREData/test/fixings.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -331,14 +331,13 @@ BOOST_AUTO_TEST_CASE(testAddMarketFixings) {
331331
Date(1, Oct, 2018), Date(1, Sep, 2018), Date(1, Aug, 2018), Date(1, Jul, 2018),
332332
Date(1, Jun, 2018), Date(1, May, 2018), Date(1, Apr, 2018), Date(1, Mar, 2018),
333333
Date(1, Feb, 2018)};
334-
set<Date> iborDates = {Date(21, Feb, 2019), Date(20, Feb, 2019), Date(19, Feb, 2019),
335-
Date(18, Feb, 2019), Date(15, Feb, 2019), Date(14, Feb, 2019)};
334+
set<Date> iborDates = {Date(21, Feb, 2019), Date(20, Feb, 2019), Date(19, Feb, 2019), Date(18, Feb, 2019),
335+
Date(17, Feb, 2019), Date(16, Feb, 2019), Date(15, Feb, 2019), Date(14, Feb, 2019)};
336336

337337
// Default for OIS dates is a lookback of 4 months on weekend only calendar => 21 Feb 2019 -> 21 Oct 2018.
338-
// 21 Oct 2018 is a Sunday => 22 Oct 2018 is the start of the lookback.
339338
set<Date> oisDates;
340-
Date oisDate(22, Oct, 2018);
341-
WeekendsOnly cal;
339+
Date oisDate(21, Oct, 2018);
340+
NullCalendar cal;
342341
while (oisDate <= asof) {
343342
oisDates.insert(oisDate);
344343
oisDate = cal.advance(oisDate, 1 * Days);

OREData/test/input/cds/trades/cds_minimal_with_dates.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
<LegType>Fixed</LegType>
1414
<Payer>true</Payer>
1515
<Currency>EUR</Currency>
16+
<PaymentConvention>Following</PaymentConvention>
17+
<DayCounter>ACT/360</DayCounter>
1618
<Notionals>
1719
<Notional>2000000.00</Notional>
1820
</Notionals>
@@ -36,4 +38,4 @@
3638
</LegData>
3739
</CreditDefaultSwapData>
3840
</Trade>
39-
</Portfolio>
41+
</Portfolio>

0 commit comments

Comments
 (0)