Skip to content

Commit 1cc3eb1

Browse files
author
jenkins
committed
git subrepo pull (merge) ore
subrepo: subdir: "ore" merged: "4022e8eed1" upstream: origin: "git@gitlab.acadiasoft.net:qs/ore.git" branch: "master" commit: "6ae4287126" git-subrepo: version: "0.4.6" origin: "https://github.com/ingydotnet/git-subrepo" commit: "110b9eb"
2 parents 6033d55 + 6ae4287 commit 1cc3eb1

24 files changed

Lines changed: 4766 additions & 6424 deletions

Examples/Example_15/ExpectedOutput/scenario.csv

Lines changed: 4423 additions & 4423 deletions
Large diffs are not rendered by default.

Examples/Input/currencies.xml

Lines changed: 189 additions & 0 deletions
Large diffs are not rendered by default.

OREAnalytics/orea/app/reportwriter.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,8 +1075,8 @@ void ReportWriter::writeScenarioReport(ore::data::Report& report,
10751075
report.addColumn("Factor", string());
10761076
report.addColumn("Up/Down", string());
10771077
report.addColumn("Base NPV", double(), 2);
1078-
// report.addColumn("ShiftSize_1", double(), 6);
1079-
// report.addColumn("ShiftSize_2", double(), 6);
1078+
report.addColumn("ShiftSize_1", double(), 6);
1079+
report.addColumn("ShiftSize_2", double(), 6);
10801080
report.addColumn("Scenario NPV", double(), 2);
10811081
report.addColumn("Difference", double(), 2);
10821082

@@ -1092,20 +1092,20 @@ void ReportWriter::writeScenarioReport(ore::data::Report& report,
10921092
for (const auto& [j, scenarioNpv] : npvCube->getTradeNPVs(i)) {
10931093
auto scenarioDescription = scenarioDescriptions[j];
10941094
Real difference = scenarioNpv - baseNpv;
1095-
// Real shift1 = scenarioDescription.key1().keytype == RiskFactorKey::KeyType::None
1096-
// ? Null<Real>()
1097-
// : sensitivityCube->actualShiftSize(scenarioDescription.key1());
1098-
// Real shift2 = scenarioDescription.key2().keytype == RiskFactorKey::KeyType::None
1099-
// ? Null<Real>()
1100-
// : sensitivityCube->actualShiftSize(scenarioDescription.key2());
1095+
Real shift1 = scenarioDescription.key1().keytype == RiskFactorKey::KeyType::None
1096+
? Null<Real>()
1097+
: sensitivityCube->actualShiftSize(scenarioDescription.key1());
1098+
Real shift2 = scenarioDescription.key2().keytype == RiskFactorKey::KeyType::None
1099+
? Null<Real>()
1100+
: sensitivityCube->actualShiftSize(scenarioDescription.key2());
11011101
if (fabs(difference) > outputThreshold) {
11021102
report.next();
11031103
report.add(tradeId);
11041104
report.add(prettyPrintInternalCurveName(scenarioDescription.factors()));
11051105
report.add(scenarioDescription.typeString());
11061106
report.add(baseNpv);
1107-
// report.add(shift1);
1108-
// report.add(shift2);
1107+
report.add(shift1);
1108+
report.add(shift2);
11091109
report.add(scenarioNpv);
11101110
report.add(difference);
11111111
} else if (!std::isfinite(difference)) {

OREAnalytics/test/decomposedsensitivitystream.cpp

Lines changed: 0 additions & 1944 deletions
This file was deleted.

OREAnalytics/test/sensitivityanalysis.cpp

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ using testsuite::buildZeroBond;
8787
using testsuite::TestConfigurationObjects;
8888
using testsuite::TestMarket;
8989

90+
namespace {
9091
void testPortfolioSensitivity(ObservationMode::Mode om) {
9192
SavedSettings backup;
9293

@@ -118,7 +119,7 @@ void testPortfolioSensitivity(ObservationMode::Mode om) {
118119

119120
// build scenario generator
120121
boost::shared_ptr<SensitivityScenarioGenerator> scenarioGenerator =
121-
boost::make_shared<SensitivityScenarioGenerator>(sensiData, baseScenario, simMarketData, simMarket,
122+
boost::make_shared<SensitivityScenarioGenerator>(sensiData, baseScenario, simMarketData, simMarket,
122123
scenarioFactory, false);
123124
simMarket->scenarioGenerator() = scenarioGenerator;
124125

@@ -730,8 +731,8 @@ void testPortfolioSensitivity(ObservationMode::Mode om) {
730731
string label = to_string(desc[j]);
731732
if (fabs(sensi) > tiny) {
732733
count++;
733-
BOOST_TEST_MESSAGE("{ \"" << tradeId << "\", \"" << label << "\", " <<
734-
std::fixed << std::setprecision(12) << npv0 << ", " << sensi << " },");
734+
BOOST_TEST_MESSAGE("{ \"" << tradeId << "\", \"" << label << "\", " << std::fixed
735+
<< std::setprecision(12) << npv0 << ", " << sensi << " },");
735736
pair<string, string> p(tradeId, label);
736737
QL_REQUIRE(npvMap.find(p) != npvMap.end(),
737738
"pair (" << p.first << ", " << p.second << ") not found in npv map");
@@ -744,9 +745,8 @@ void testPortfolioSensitivity(ObservationMode::Mode om) {
744745
fabs((sensi - sensiMap[p]) / sensi) < tolerance,
745746
"sensitivity regression failed for pair ("
746747
<< p.first << ", " << p.second << "): " << sensi << " vs " << sensiMap[p]);
747-
coveredSensis.insert(p);
748+
coveredSensis.insert(p);
748749
}
749-
750750
}
751751
currentTradeIdx++;
752752
}
@@ -768,7 +768,7 @@ void testPortfolioSensitivity(ObservationMode::Mode om) {
768768
map<pair<string, string>, Real> deltaMap;
769769
map<pair<string, string>, Real> gammaMap;
770770
std::set<string> sensiTrades;
771-
for (const auto& [pid,p] : portfolio->trades()) {
771+
for (const auto& [pid, p] : portfolio->trades()) {
772772
sensiTrades.insert(pid);
773773
for (const auto& f : sa->sensiCube()->factors()) {
774774
auto des = sa->sensiCube()->factorDescription(f);
@@ -815,6 +815,7 @@ void testPortfolioSensitivity(ObservationMode::Mode om) {
815815
ObservationMode::instance().setMode(backupMode);
816816
IndexManager::instance().clearHistories();
817817
}
818+
} // namespace
818819

819820
BOOST_FIXTURE_TEST_SUITE(OREAnalyticsTestSuite, ore::test::OreaTopLevelFixture)
820821

@@ -882,7 +883,7 @@ void test1dShifts(bool granular) {
882883

883884
// build scenario generator
884885
boost::shared_ptr<SensitivityScenarioGenerator> scenarioGenerator =
885-
boost::make_shared<SensitivityScenarioGenerator>(sensiData, baseScenario, simMarketData, simMarket,
886+
boost::make_shared<SensitivityScenarioGenerator>(sensiData, baseScenario, simMarketData, simMarket,
886887
scenarioFactory, false);
887888

888889
// cache initial zero rates
@@ -978,9 +979,8 @@ BOOST_AUTO_TEST_CASE(test2dShifts) {
978979

979980
// build scenario generator
980981
boost::shared_ptr<SensitivityScenarioGenerator> scenarioGenerator =
981-
boost::make_shared<SensitivityScenarioGenerator>(sensiData, baseScenario, simMarketData, simMarket,
982-
scenarioFactory,
983-
false);
982+
boost::make_shared<SensitivityScenarioGenerator>(sensiData, baseScenario, simMarketData, simMarket,
983+
scenarioFactory, false);
984984

985985
// cache initial zero rates
986986
vector<Period> expiries = simMarketData->swapVolExpiries("");
@@ -1162,15 +1162,14 @@ BOOST_AUTO_TEST_CASE(testEquityOptionDeltaGamma) {
11621162
}
11631163

11641164
bool recalibrateModels = true; // nothing to calibrate here
1165-
boost::shared_ptr<SensitivityAnalysis> sa =
1166-
boost::make_shared<SensitivityAnalysis>(portfolio, initMarket, Market::defaultConfiguration, data,
1167-
simMarketData, sensiData, recalibrateModels);
1165+
boost::shared_ptr<SensitivityAnalysis> sa = boost::make_shared<SensitivityAnalysis>(
1166+
portfolio, initMarket, Market::defaultConfiguration, data, simMarketData, sensiData, recalibrateModels);
11681167
sa->generateSensitivities();
11691168

11701169
map<pair<string, string>, Real> deltaMap;
11711170
map<pair<string, string>, Real> gammaMap;
11721171
std::set<string> sensiTrades;
1173-
for (auto [pid,p] : portfolio->trades()) {
1172+
for (auto [pid, p] : portfolio->trades()) {
11741173
sensiTrades.insert(pid);
11751174
for (const auto& f : sa->sensiCube()->factors()) {
11761175
auto des = sa->sensiCube()->factorDescription(f);
@@ -1385,7 +1384,7 @@ BOOST_AUTO_TEST_CASE(testFxOptionDeltaGamma) {
13851384
map<pair<string, string>, Real> deltaMap;
13861385
map<pair<string, string>, Real> gammaMap;
13871386
std::set<string> sensiTrades;
1388-
for (const auto& [pid ,_] : portfolio->trades()) {
1387+
for (const auto& [pid, _] : portfolio->trades()) {
13891388
sensiTrades.insert(pid);
13901389
for (const auto& f : sa->sensiCube()->factors()) {
13911390
auto des = sa->sensiCube()->factorDescription(f);

OREData/ored/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,8 +731,8 @@ utilities/currencyhedgedequityindexdecomposition.hpp
731731
utilities/currencyparser.hpp
732732
utilities/dategrid.hpp
733733
utilities/fileio.hpp
734-
utilities/formulaparser.hpp
735734
utilities/flowanalysis.hpp
735+
utilities/formulaparser.hpp
736736
utilities/indexnametranslator.hpp
737737
utilities/indexparser.hpp
738738
utilities/inflationstartdate.hpp

OREData/ored/model/utilities.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ map<Date, HelperValues> jyHelperValues(const vector<boost::shared_ptr<Calibratio
114114
if (ctr < times.size())
115115
kv.second.maturity = times[ctr++];
116116
else
117-
kv.second.maturity = times.back();
117+
kv.second.maturity = times.empty() ? 0.0 : times.back();
118118
}
119119

120120
return result;

OREData/ored/portfolio/schedule.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,9 @@ Schedule makeSchedule(const ScheduleRules& data, const Date& openEndDateReplacem
337337

338338
Date firstDate = parseDate(data.firstDate());
339339
Date lastDate = parseDate(data.lastDate());
340+
if (firstDate != Date() && lastDate != Date())
341+
QL_REQUIRE(firstDate <= lastDate, "Schedule::makeSchedule firstDate must be before lastDate");
342+
340343
Period tenor = parsePeriod(data.tenor());
341344

342345
// defaults

OREData/ored/utilities/currencyconfig.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,24 @@ void CurrencyConfig::fromXML(XMLNode* baseNode) {
4949
// the digit where we switch form roundng down to rounding up, typically 5 and used across all
5050
// Integer digit = parseInteger(XMLUtils::getChildValue(node, "Digit", false));
5151
string format = XMLUtils::getChildValue(node, "Format", false);
52+
QuantExt::ConfigurableCurrency::Type currencyType = parseCurrencyType(XMLUtils::getChildValue(node, "CurrencyType", false, "Major"));
5253
Rounding rounding(precision, roundingType);
53-
5454
QuantExt::ConfigurableCurrency c(name, isoCode, numericCode, symbol, fractionSymbol, fractionsPerUnit,
55-
rounding, format, minorUnitCodes);
56-
currencies_.push_back(c);
57-
55+
rounding, format, minorUnitCodes, currencyType);
5856
DLOG("loading configuration for currency code " << isoCode);
5957

60-
CurrencyParser::instance().addCurrency(c.code(), c);
58+
switch (currencyType) {
59+
case QuantExt::ConfigurableCurrency::Type::Crypto:
60+
CurrencyParser::instance().addCrypto(c.code(), c);
61+
break;
62+
case QuantExt::ConfigurableCurrency::Type::Metal:
63+
CurrencyParser::instance().addMetal(c.code(), c);
64+
break;
65+
default:
66+
CurrencyParser::instance().addCurrency(c.code(), c);
67+
break;
68+
}
69+
currencies_.push_back(c);
6170

6271
} catch (std::exception&) {
6372
ALOG("error loading currency config for name " << name << " iso code " << isoCode);
@@ -81,6 +90,7 @@ XMLNode* CurrencyConfig::toXML(XMLDocument& doc) {
8190
XMLUtils::addChild(doc, ccyNode, "RoundingPrecision", to_string(ccy.rounding().precision()));
8291
// XMLUtils::addChild(doc, ccyNode, "Digit", to_string(ccy.rounding().roundingDigit()));
8392
XMLUtils::addChild(doc, ccyNode, "Format", ccy.format());
93+
XMLUtils::addChild(doc, ccyNode, "CurrencyType", to_string(ccy.currencyType()));
8494
}
8595
return node;
8696
}

OREData/ored/utilities/currencyconfig.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
#include <map>
2727
#include <ored/utilities/xmlutils.hpp>
28+
#include <qle/currencies/configurablecurrency.hpp>
2829
#include <ql/patterns/singleton.hpp>
2930
#include <ql/currency.hpp>
3031
#include <ql/utilities/dataparsers.hpp>
@@ -34,6 +35,7 @@
3435

3536
namespace ore {
3637
namespace data {
38+
using QuantExt::ConfigurableCurrency;
3739
using QuantLib::Currency;
3840
using std::map;
3941
using std::set;
@@ -50,13 +52,13 @@ class CurrencyConfig : public XMLSerializable {
5052
CurrencyConfig();
5153

5254
//! check out any configured currencies
53-
const vector<Currency>& getCurrencies() const { return currencies_; }
55+
const vector<ConfigurableCurrency>& getCurrencies() const { return currencies_; }
5456

5557
void fromXML(XMLNode* node) override;
5658
XMLNode* toXML(XMLDocument& doc) override;
5759

5860
private:
59-
vector<Currency> currencies_;
61+
vector<ConfigurableCurrency> currencies_;
6062
};
6163

6264
} // namespace data

0 commit comments

Comments
 (0)