Investigation: Verify the value sets against the ORE code
Table of Contents
- 1. Context
- 2. Methodology
- 3. Findings
- 3.1. A catalogue set can refuse a valid document when its registry holds a word
- 3.2. F-01 CalibrationStrategy refuses two values ORE accepts, too narrow
- 3.3. F-02 Scheme refuses GaussLobatto and accepts a value one engine refuses
- 3.4. F-03 Calibration set is text but ORE parses fixed values, wrong kind
- 3.5. F-04 Model set is text but the builder holds a fixed list, wrong kind
- 3.6. F-05 Engine set is text but the builder holds a fixed list, wrong kind
- 3.7. F-06 Bounds set is text but the variance swap engine holds two values, wrong kind
- 3.8. F-07 TimingAdjustment set is text but the cap floor builder holds two values, wrong kind
- 3.9. F-08 Heston.ProcessDiscretization set is text but ORE holds nine values, wrong kind
- 3.10. F-09 Heston.CalibrationMethod set is text but ORE holds four values, wrong kind
- 3.11. F-10 Bootstrap.Mode set is text but ORE holds two values, wrong kind
- 3.12. F-11 YieldCurveModel set is text but the CMS builder holds four values, wrong kind
- 3.13. F-12 InfModelType set is text but the builder compares two values, wrong kind
- 3.14. F-13 FloatSpreadMapping set is text but ORE holds three values, wrong kind
- 3.15. F-14 IrVolatilityType set is text but ORE holds two values, wrong kind
- 3.16. F-15 Regression.VarGroupMode set is text but ORE holds two values, wrong kind
- 3.17. F-16 GlobalModel set is text but ORE reads a bool, wrong kind
- 3.18. F-17 UseAD set is text but ORE reads a bool, wrong kind
- 3.19. F-18 UseIndexCurveForIndexCDS set is text but ORE reads a bool, wrong kind
- 3.20. F-19 Beta has no lower bound but ORE requires a non-negative value, wrong bounds
- 3.21. F-20 Integer sets that ORE stores in a Size have no minimum, wrong bounds
- 3.22. F-21 TrainingSamples set is text but ORE reads a whole number, wrong kind
- 3.23. F-22 RegressionVarianceCutoff set is text but ORE reads a real, wrong kind
- 3.24. F-23 IndicatorSmoothingForValues set is text but ORE reads a real, wrong kind
- 3.25. F-24 IndicatorSmoothingForDerivatives set is text but ORE reads a real, wrong kind
- 3.26. F-25 SqrtSmoothingForDerivatives set is text but ORE reads a real, wrong kind
- 3.27. F-26 Displacement set is text but ORE reads a real, wrong kind
- 3.28. F-27 IrReversion set is text but ORE reads a real, wrong kind
- 3.29. F-28 InfJyRealRateReversion set is text but ORE reads a real, wrong kind
- 3.30. F-29 Bootstrap.MesherConcentration set is text but ORE reads a real, wrong kind
- 3.31. F-30 Period pattern refuses a signed period ORE accepts, too narrow
- 3.32. F-31 InterpolationMethod refuses one deprecated alias ORE accepts, too narrow
- 4. Corrections to this audit, made when the findings were applied
- 5. Sets not decided
- 6. Limits of this audit
A point-in-time record, written while the story that commissioned it was open, of an investigation into An audit of every seeded value set against the ORE 1.8.17 C++ source: what each set states, what the code accepts, and the disagreements that make a set refuse a value ORE takes..
It is a snapshot, not a description of the system. Whatever it concludes that the code must keep doing belongs on the page that owns the subject; cite that page from code, recipes and models, not this one.
1. Context
The value sets state every parameter's allowed values. This audit asks a different question from the branch that introduced them: does a set state what ORE actually accepts? It compares every seeded set with the C++ that reads the parameter, and it records the disagreements.
2. Methodology
Every set whose kind can hold a rule was compared with the code. The merged model was built from the curation, every parameter's readers were found in the source, and each set was compared with what those readers accept: a list, a bound, a switch, a pattern or free text. The code is the authority, not the ORE user guide.
3. Findings
3.1. A catalogue set can refuse a valid document when its registry holds a word
The curve leaves BusinessDayConvention and DayCounter are declared as
catalogue sets over ores_refdata_business_day_convention_catalogue_v and
ores_refdata_day_counter_catalogue_v. Those views expose the registries'
code, and the registries hold words: Following, 1/1. An ORE document
states its own spelling, F and ACT/365, so the guard refuses a document that
ORE accepts. The two sets are text until the registries carry the spelling the
document writes; the finding is the reason, and it is not one of the thirty-one
below, which compare sets with the code that reads a parameter and not with the
rows a catalogue holds.
3.2. F-01 CalibrationStrategy refuses two values ORE accepts, too narrow
- Set code:
calibrationstrategy - Parameter:
ModelParameters/CalibrationStrategy - Set as it stands: enumerated,
CoterminalDealStrike,CoterminalATM,DeltaGammaAdjusted,None. - What ORE accepts: six values. The parser accepts
CoterminalATM,CoterminalDealStrike,DeltaGammaAdjusted,UnderlyingATM,UnderlyingDealStrikeandNone. The enum holds the same six values. Evidence:
// OREData/ored/model/irmodeldata.cpp:76 CalibrationStrategy parseCalibrationStrategy(const string& s) { if (boost::algorithm::to_upper_copy(s) == "COTERMINALATM") return CalibrationStrategy::CoterminalATM; ... else if (boost::algorithm::to_upper_copy(s) == "UNDERLYINGATM") return CalibrationStrategy::UnderlyingATM; else if (boost::algorithm::to_upper_copy(s) == "UNDERLYINGDEALSTRIKE") return CalibrationStrategy::UnderlyingDealStrike;
// OREData/ored/model/irmodeldata.hpp:79 enum class CalibrationStrategy { CoterminalATM, CoterminalDealStrike, UnderlyingATM, UnderlyingDealStrike, DeltaGammaAdjusted, None };
- Case handling: the parser uses
boost::algorithm::to_upper_copy. The exact spelling of a set value does not matter to ORE. - Direction: too narrow. The screen refuses
UnderlyingATMandUnderlyingDealStrike, and ORE accepts both. - Correction: in
projects/ores.seeder/datasets/ore_pricing_engines/curation/value-sets-guide-enums.json, undersets, entrycalibrationstrategy, addUnderlyingATMandUnderlyingDealStriketovalues, withorder4 andorder5.
3.3. F-02 Scheme refuses GaussLobatto and accepts a value one engine refuses
- Set code:
scheme - Parameter:
EngineParameters/Scheme - Set as it stands: enumerated, the nine FDM schemes plus
Segment:CrankNicolson,Hundsdorfer,Douglas,CraigSneyd,ModifiedCraigSneyd,ImplicitEuler,ExplicitEuler,MethodOfLines,TrBDF2,Segment. What ORE accepts: ORE reads
Schemein two engine families, and the accepted lists differ.The finite difference engines parse nine schemes:
// OREData/ored/utilities/parsers.cpp:754 FdmSchemeDesc parseFdmSchemeDesc(const std::string& s) { static std::map<std::string, FdmSchemeDesc> m = { {"CrankNicolson", ...}, {"Hundsdorfer", ...}, {"Douglas", ...}, {"CraigSneyd", ...}, {"ModifiedCraigSneyd", ...}, {"ImplicitEuler", ...}, {"ExplicitEuler", ...}, {"MethodOfLines", ...}, {"TrBDF2", ...}};
The variance swap engine accepts
GaussLobattoandSegmentonly:// OREData/ored/portfolio/builders/varianceswap.hpp:107 std::string schemeStr = engineParameter("Scheme", {}, false, "GaussLobatto"); if (schemeStr == "GaussLobatto") settings.scheme = ...::Scheme::GaussLobatto; else if (schemeStr == "Segment") settings.scheme = ...::Scheme::Segment; else QL_FAIL("invalid var swap pricing engine parameter Scheme (...)");
- Case handling: both comparison functions are case-sensitive.
- Direction: too narrow and too wide. The set refuses
GaussLobatto, which the variance swap engine accepts and uses as its default. The set acceptsSegment, which every finite difference engine refuses. - Correction: in
projects/ores.seeder/datasets/ore_pricing_engines/curation/value-sets-code.json, undersets, entryscheme, addGaussLobattotovalues. State in the description thatGaussLobattoandSegmentapply to the variance swap engine, and thatSegmentdoes not apply to a finite difference engine. A single set cannot be exact for a name that two engine families read. The union of the two lists is the closest exact set that the model can hold.
3.4. F-03 Calibration set is text but ORE parses fixed values, wrong kind
- Set code:
calibration - Parameter:
ModelParameters/Calibration - Set as it stands: text, no values.
What ORE accepts: five values, compared after upper casing.
// OREData/ored/model/irmodeldata.cpp:47 CalibrationType parseCalibrationType(const string& s) { if (boost::algorithm::to_upper_copy(s) == "BOOTSTRAP") else if (boost::algorithm::to_upper_copy(s) == "BESTFIT") else if (boost::algorithm::to_upper_copy(s) == "FIRSTBESTFITTHENBOOTSTRAP") else if (boost::algorithm::to_upper_copy(s) == "STATISTICALWITHRISKNEUTRALVOLATILITY") else if (boost::algorithm::to_upper_copy(s) == "NONE") else QL_FAIL("Calibration type " << s << " not recognized");
- Case handling: case-insensitive.
- Direction: wrong kind. The screen shows a text field, so a person can save
Dealor any other word. ORE refuses that word. - Correction: in
projects/ores.seeder/datasets/ore_pricing_engines/curation/value-sets-guide-enums.json, undersets, entrycalibration, setsource_kindtoenumeratedand add the five valuesBootstrap,BestFit,FirstBestFitThenBootstrap,StatisticalWithRiskNeutralVolatilityandNone.
3.5. F-04 Model set is text but the builder holds a fixed list, wrong kind
- Set code:
model - Parameter:
ModelParameters/Model - Set as it stands: text, no values.
What ORE accepts: five model names. Any other name reaches the final
QL_FAIL.// OREData/ored/portfolio/builders/scriptedtrade.cpp:276 if (modelParam_ == "BlackScholes" && engineParam_ == "MC") { } else if ((modelParam_ == "LocalVolDupire" || modelParam_ == "LocalVolAndreasenHuge") && ...) { } else if (modelParam_ == "Heston" && ...) { } else if (modelParam_ == "GaussianCam" && ...) { } else { QL_FAIL("model '" << modelParam_ << "' / engine '" << engineParam_ << "' not recognised, ..."); }
- Case handling: case-sensitive.
- Direction: wrong kind.
- Correction: in
projects/ores.seeder/datasets/ore_pricing_engines/curation/value-sets-code.json, undersets, entrymodel, setsource_kindtoenumeratedand addBlackScholes,LocalVolDupire,LocalVolAndreasenHuge,HestonandGaussianCam.
3.6. F-05 Engine set is text but the builder holds a fixed list, wrong kind
- Set code:
engine - Parameter:
EngineParameters/Engine - Set as it stands: text, no values.
What ORE accepts: the values
MC,FD,AMCandAMCCG. The builder reads the parameter atscriptedtrade.cpp:126and fails on any other pairing.// OREData/ored/portfolio/builders/scriptedtrade.cpp:305 } else { QL_FAIL("model '" << modelParam_ << "' / engine '" << engineParam_ << "' not recognised, expected BlackScholes/[MC|FD], ..."); }
AMCandAMCCGare the builder names that setbuildingAmc_andbuildingAmcCg_(same file, lines 129-133).- Case handling: case-sensitive.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryengine, setsource_kindtoenumeratedand addMC,FD,AMCandAMCCG.
3.7. F-06 Bounds set is text but the variance swap engine holds two values, wrong kind
- Set code:
bounds - Parameter:
EngineParameters/Bounds - Set as it stands: text, no values.
What ORE accepts:
FixedandPriceThreshold.// OREData/ored/portfolio/builders/varianceswap.hpp:108 std::string boundsStr = engineParameter("Bounds", {}, false, "PriceThreshold"); if (boundsStr == "Fixed") ... else if (boundsStr == "PriceThreshold") ... else QL_FAIL("invalid var swap pricing engine parameter Bounds (...)");
- Case handling: case-sensitive.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entrybounds, setsource_kindtoenumeratedand addFixedandPriceThreshold.
3.8. F-07 TimingAdjustment set is text but the cap floor builder holds two values, wrong kind
- Set code:
timingadjustment - Parameter:
EngineParameters/TimingAdjustment - Set as it stands: text, no values.
What ORE accepts:
Black76andBivariateLognormal.// OREData/ored/portfolio/builders/capfloorediborleg.cpp:47 typename T::TimingAdjustment timingAdjustment = T::Black76; if (timingAdjustmentStr == "Black76") timingAdjustment = T::Black76; else if (timingAdjustmentStr == "BivariateLognormal") timingAdjustment = T::BivariateLognormal; else QL_FAIL("timing adjustment parameter (...) not recognised.");
- Case handling: case-sensitive.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entrytimingadjustment, setsource_kindtoenumeratedand addBlack76andBivariateLognormal.
3.9. F-08 Heston.ProcessDiscretization set is text but ORE holds nine values, wrong kind
- Set code:
heston_processdiscretization - Parameter:
EngineParameters/Heston.ProcessDiscretization - Set as it stands: text, no values.
What ORE accepts: the nine values that
parseHestonProcessDiscretizationlists.// OREData/ored/utilities/parsers.cpp:1911 {"PartialTruncation", ...}, {"FullTruncation", ...}, {"Reflection", ...}, {"NonCentralChiSquareVariance", ...}, {"QuadraticExponential", ...}, {"QuadraticExponentialMartingale", ...}, {"BroadieKayaExactSchemeLobatto", ...}, {"BroadieKayaExactSchemeLaguerre", ...}, {"BroadieKayaExactSchemeTrapezoidal", ...}
The call site is
scriptedtrade.cpp:612.- Case handling: case-sensitive.
- Direction: wrong kind. The set
heston_quantoprocessdiscretizationalready holds these nine values as an enumerated set. - Correction: in
value-sets-code.json, undersets, entryheston_processdiscretization, setsource_kindtoenumeratedand add the nine values thatheston_quantoprocessdiscretizationholds.
3.10. F-09 Heston.CalibrationMethod set is text but ORE holds four values, wrong kind
- Set code:
heston_calibrationmethod - Parameter:
EngineParameters/Heston.CalibrationMethod - Set as it stands: text, no values.
What ORE accepts:
ConstantBestFit,None,PiecewiseBootstrapandPiecewiseBestFit.// OREData/ored/model/hestonmodelcalibration.cpp:588 if (calibrationMethod_ == "PiecewiseBootstrap") { ... // OREData/ored/model/hestonmodelcalibration.cpp:622 } else if (calibrationMethod_ == "PiecewiseBestFit") { ... // OREData/ored/model/hestonmodelcalibration.cpp:643 } else { QL_FAIL("unknown calibration method \"" << calibrationMethod_ << "\""); }
ConstantBestFitandNoneare the two further branches athestonmodelbuilder.cpp:74andhestonmodelcalibration.cpp:255.- Case handling: case-sensitive.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryheston_calibrationmethod, setsource_kindtoenumeratedand add the four values.
3.11. F-10 Bootstrap.Mode set is text but ORE holds two values, wrong kind
- Set code:
bootstrap_mode - Parameter:
EngineParameters/Bootstrap.Mode - Set as it stands: text, no values.
What ORE accepts:
AlternatingandSimultaneously.// OREData/ored/portfolio/builders/convertiblebond.cpp:75 auto bootstrapModeStr = engineParameter("Bootstrap.Mode", {}, true); if (bootstrapModeStr == "Alternating") ... else if (bootstrapModeStr == "Simultaneously") ... else QL_FAIL("invalid Bootstrap.Mode, expected Alternating or Simultaneously");
- Case handling: case-sensitive.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entrybootstrap_mode, setsource_kindtoenumeratedand addAlternatingandSimultaneously.
3.12. F-11 YieldCurveModel set is text but the CMS builder holds four values, wrong kind
- Set code:
yieldcurvemodel - Parameter:
EngineParameters/YieldCurveModel - Set as it stands: text, no values.
What ORE accepts:
Standard,ExactYield,ParallelShiftsandNonParallelShifts.// OREData/ored/portfolio/builders/cms.cpp:30 GFunctionFactory::YieldCurveModel ycmFromString(const string& s) { if (s == "Standard") ... else if (s == "ExactYield") ... else if (s == "ParallelShifts") ... else if (s == "NonParallelShifts") ... else QL_FAIL("unknown string for YieldCurveModel"); }
- Case handling: case-sensitive.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryyieldcurvemodel, setsource_kindtoenumeratedand add the four values.
3.13. F-12 InfModelType set is text but the builder compares two values, wrong kind
- Set code:
infmodeltype - Parameter:
ModelParameters/InfModelType - Set as it stands: text, no values.
What ORE accepts:
DKandJY.// OREData/ored/portfolio/builders/scriptedtrade.cpp:580 infModelType_ = modelParameter("InfModelType", getModelEngineQualifiers(), false, "DK"); // OREData/ored/portfolio/builders/scriptedtrade.cpp:873 if (infModelType_ == "DK") { ... } // OREData/ored/model/camcorrelationsfromindexcorrelations.cpp:69 if (infModelType == "JY") { ... }
- Case handling: case-sensitive.
- Direction: wrong kind. A third word passes the reader and then silently takes
the
JYbranch or builds no inflation model. - Correction: in
value-sets-code.json, undersets, entryinfmodeltype, setsource_kindtoenumeratedand addDKandJY.
3.14. F-13 FloatSpreadMapping set is text but ORE holds three values, wrong kind
- Set code:
floatspreadmapping - Parameters:
ModelParameters/FloatSpreadMappingandEngineParameters/FloatSpreadMapping - Set as it stands: text, no values.
What ORE accepts:
NextCoupon,proRataandSimple.// OREData/ored/model/lgmdata.cpp:100 QuantExt::AnalyticLgmSwaptionEngine::FloatSpreadMapping parseFloatSpreadMapping(const string& s) { if (boost::algorithm::to_upper_copy(s) == "NEXTCOUPON") else if (boost::algorithm::to_upper_copy(s) == "PRORATA") else if (boost::algorithm::to_upper_copy(s) == "SIMPLE") else QL_FAIL("FloatSpreadMapping '" << s << "' not recognized"); }
- Case handling: case-insensitive.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryfloatspreadmapping, setsource_kindtoenumeratedand addNextCoupon,proRataandSimple.
3.15. F-14 IrVolatilityType set is text but ORE holds two values, wrong kind
- Set code:
irvolatilitytype - Parameter:
ModelParameters/IrVolatilityType - Set as it stands: text, no values.
What ORE accepts:
HaganandHullWhite.// OREData/ored/model/lgmdata.cpp:81 LgmData::VolatilityType parseVolatilityType(const string& s) { if (boost::algorithm::to_upper_copy(s) == "HULLWHITE") else if (boost::algorithm::to_upper_copy(s) == "HAGAN") else QL_FAIL("Volatility type " << s << " not recognized"); }
The call site is
scriptedtrade.cpp:1637. The setvolatilitytypealready holds these two values.- Case handling: case-insensitive.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryirvolatilitytype, setsource_kindtoenumeratedand addHaganandHullWhite.
3.16. F-15 Regression.VarGroupMode set is text but ORE holds two values, wrong kind
- Set code:
regression_vargroupmode - Parameter:
EngineParameters/Regression.VarGroupMode - Set as it stands: text, no values.
What ORE accepts:
GlobalandTrivial.// OREData/ored/utilities/parsers.cpp:1657 QuantExt::McRegressionModel::VarGroupMode parseVarGroupMode(const std::string& s) { if (s == "Global") ... else if (s == "Trivial") ... else QL_FAIL("VarGroupMode '" << s << "' not recognized, expected Global, Trivial"); }
- Case handling: case-sensitive.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryregression_vargroupmode, setsource_kindtoenumeratedand addGlobalandTrivial.
3.17. F-16 GlobalModel set is text but ORE reads a bool, wrong kind
- Set code:
globalmodel - Parameter:
ModelParameters/GlobalModel - Set as it stands: text, no values.
What ORE accepts: a bool.
parseBoolacceptsY,YES,TRUE,True,true,1,N,NO,FALSE,False,falseand0.// OREData/ored/portfolio/flexiswap.cpp:205 bool useGlobalModel = parseBool(flexiSwapBuilder->modelParameter("GlobalModel", {}, true));
The bool parser is
parsers.cpp:153.- Case handling: the bool parser has a fixed spelling list.
- Direction: wrong kind. The screen shows a text field for a switch.
- Correction: in
value-sets-code.json, undersets, entryglobalmodel, setsource_kindtobooleanand removevalues.
3.18. F-17 UseAD set is text but ORE reads a bool, wrong kind
- Set code:
usead - Parameter:
EngineParameters/UseAD - Set as it stands: text, no values.
What ORE accepts: a bool.
// OREData/ored/portfolio/builders/swaption.cpp:125 bool useCachedSensis = parseBool(builder->engineParameter("UseAD", {}, true)) && ...; // OREData/ored/portfolio/builders/scriptedtrade.cpp:538 useAd_ = parseBool(engineParameter("UseAD", getModelEngineQualifiers(), false, "false"));
- Case handling: the bool parser has a fixed spelling list.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryusead, setsource_kindtobooleanand removevalues.
3.19. F-18 UseIndexCurveForIndexCDS set is text but ORE reads a bool, wrong kind
- Set code:
useindexcurveforindexcds - Parameter:
EngineParameters/useIndexCurveForIndexCDS - Set as it stands: text, no values.
What ORE accepts: a bool.
// OREData/ored/portfolio/cdo.cpp:597 bool useIndexCurve = parseBool(cdoEngineBuilder->engineParameter("useIndexCurveForIndexCDS", {}, false, "false"));
- Case handling: the bool parser has a fixed spelling list.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryuseindexcurveforindexcds, setsource_kindtobooleanand removevalues.
3.20. F-19 Beta has no lower bound but ORE requires a non-negative value, wrong bounds
- Set code:
beta - Parameter:
EngineParameters/beta - Set as it stands: number, no minimum and no maximum.
What ORE accepts: any value that is greater than or equal to zero.
// OREData/ored/portfolio/builders/commodityswaption.hpp:60 Real beta = parseReal(engineParameter("beta")); QL_REQUIRE(beta >= 0.0, "CommoditySwaptionAnalyticalEngineBuilder: beta must be non-negative");
The same check is at line 79.
- Direction: wrong bounds. The screen accepts
-0.5, and ORE refuses it. - Correction: in
value-sets-code.json, undersets, entrybeta, add"minimum": 0.
3.21. F-20 Integer sets that ORE stores in a Size have no minimum, wrong bounds
These sets are integer with no minimum and no maximum. ORE reads each value
with parseInteger and stores it in a QuantLib::Size. A Size is unsigned.
ORE silently converts a negative value to a very large positive value. The value
set must refuse a negative value.
// OREData/ored/utilities/parsers.cpp:145 Integer parseInteger(const string& s) { ... boost::lexical_cast<Integer>(s.c_str()) ... } // OREData/ored/portfolio/builders/cdo.hpp:281 Size nBuckets = parseInteger(engineParameter("buckets")); // OREData/ored/portfolio/builders/cdo.hpp:358 Size nSimulations = parseInteger(engineParameter("nSimulations")); // OREData/ored/portfolio/builders/callablebond.cpp:392 Size stateGridPoints = parseInteger(engineParameter("StateGridPoints")); // OREData/ored/portfolio/builders/callablebond.cpp:408 Size ny = parseInteger(engineParameter("ny")); // OREData/ored/portfolio/builders/riskparticipationagreement.cpp:140 Size maxGapDays = parseInteger(engineParameter("MaxGapDays"));
The sets and their parameters:
| Set code | Parameter (scope/name) | Evidence |
|---|---|---|
bins |
EngineParameters/Bins |
cdo.hpp:281 |
buckets |
EngineParameters/buckets |
cdo.hpp:281 model |
cashflowgeneration_oncpnmaxsimtimes |
EngineParameters/CashflowGeneration.OnCpnMaxSimTimes |
callablebond.cpp:480 |
exercisetimestepsperyear |
EngineParameters/ExerciseTimeStepsPerYear |
callablebond.cpp:380 |
bootstrap_stategridpoints |
EngineParameters/Bootstrap.StateGridPoints |
convertiblebond.cpp:68 |
bootstrap_timestepsperyear |
EngineParameters/Bootstrap.TimeStepsPerYear |
convertiblebond.cpp:67 |
heston_maxcalibrationattempts |
EngineParameters/Heston.MaxCalibrationAttempts |
scriptedtrade.cpp:600 |
maxdiscretisationpoints |
EngineParameters/MaxDiscretisationPoints |
riskparticipationagreement.cpp:108 |
maxgapdays |
EngineParameters/MaxGapDays |
riskparticipationagreement.cpp:140 |
nsimulations |
EngineParameters/nSimulations |
cdo.hpp:358 |
nx |
EngineParameters/nx |
callablebond.cpp:410 |
ny |
EngineParameters/ny |
callablebond.cpp:408 |
pricing_samples |
EngineParameters/Pricing.Samples |
callablebond.cpp:466 |
pricing_stategridpoints |
EngineParameters/Pricing.StateGridPoints |
convertiblebond.cpp:85 |
pricing_timestepsperyear |
EngineParameters/Pricing.TimeStepsPerYear |
convertiblebond.cpp:84 |
regressionorder |
EngineParameters/RegressionOrder |
cliquetoption.cpp:34 |
samples |
EngineParameters/Samples |
cliquetoption.cpp:33 |
stategridpoints |
EngineParameters/StateGridPoints |
callablebond.cpp:392 |
timestepsperyear |
EngineParameters/TimeStepsPerYear |
callablebond.cpp:393 |
training_samples |
EngineParameters/Training.Samples |
callablebond.cpp:465 |
variancestategridpoints |
EngineParameters/VarianceStateGridPoints |
scriptedtrade.cpp:648 |
- Direction: wrong bounds. The screen accepts a negative number, and ORE does
not reject it. ORE converts it to a huge
Sizeand the run behaves wrongly. - Correction: in
value-sets-code.json, undersets, add"minimum": 0to each entry above. Do not add 0 to theseed,pricing_seed,training_seedandtrainingseedentries. ORE reads a seed as a signedlong(cbo.cpp:45).
3.22. F-21 TrainingSamples set is text but ORE reads a whole number, wrong kind
- Set code:
trainingsamples - Parameter:
EngineParameters/TrainingSamples - Set as it stands: text, no values.
What ORE accepts: a whole number.
// OREData/ored/portfolio/builders/scriptedtrade.cpp:634 if (auto tmp = engineParameter("TrainingSamples", getModelEngineQualifiers(), false, ""); !tmp.empty()) { params_.trainingSamples = parseInteger(tmp);
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entrytrainingsamples, setsource_kindtointegerand add"minimum": 0.
3.23. F-22 RegressionVarianceCutoff set is text but ORE reads a real, wrong kind
- Set code:
regressionvariancecutoff - Parameter:
EngineParameters/RegressionVarianceCutoff - Set as it stands: text, no values.
What ORE accepts: a real number or an empty string.
// OREData/ored/portfolio/builders/callablebond.cpp:477 parseRealOrNull(engineParameter("RegressionVarianceCutoff", {}, false, std::string())),
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryregressionvariancecutoff, setsource_kindtonumber. Add the description note that an empty value is allowed.
3.24. F-23 IndicatorSmoothingForValues set is text but ORE reads a real, wrong kind
- Set code:
indicatorsmoothingforvalues - Parameter:
EngineParameters/IndicatorSmoothingForValues - Set as it stands: text, no values.
What ORE accepts: a real number.
// OREData/ored/portfolio/builders/scriptedtrade.cpp:552 parseReal(engineParameter("IndicatorSmoothingForValues", ..., false, "0.0")); // OREData/ored/portfolio/builders/swaption.cpp:128 parseReal(builder->engineParameter("IndicatorSmoothingForValues", {}, false, "0.0")),
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryindicatorsmoothingforvalues, setsource_kindtonumber.
3.25. F-24 IndicatorSmoothingForDerivatives set is text but ORE reads a real, wrong kind
- Set code:
indicatorsmoothingforderivatives - Parameter:
EngineParameters/IndicatorSmoothingForDerivatives - Set as it stands: text, no values.
What ORE accepts: a real number.
// OREData/ored/portfolio/builders/scriptedtrade.cpp:554 parseReal(engineParameter("IndicatorSmoothingForDerivatives", ..., false, "0.2")); // OREData/ored/portfolio/builders/swaption.cpp:129 parseReal(builder->engineParameter("IndicatorSmoothingForDerivatives", {}, false, "0.0")),
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryindicatorsmoothingforderivatives, setsource_kindtonumber.
3.26. F-25 SqrtSmoothingForDerivatives set is text but ORE reads a real, wrong kind
- Set code:
sqrtsmoothingforderivatives - Parameter:
EngineParameters/SqrtSmoothingForDerivatives - Set as it stands: text, no values.
What ORE accepts: a real number.
// OREData/ored/portfolio/builders/scriptedtrade.cpp:556 parseReal(engineParameter("SqrtSmoothingForDerivatives", ..., false, "1E-8")); // OREData/ored/portfolio/builders/swaption.cpp:130 parseReal(builder->engineParameter("SqrtSmoothingForDerivatives", {}, false, "0.0")),
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entrysqrtsmoothingforderivatives, setsource_kindtonumber.
3.27. F-26 Displacement set is text but ORE reads a real, wrong kind
- Set code:
displacement - Parameter:
ModelParameters/Displacement - Set as it stands: text, no values.
What ORE accepts: a real number.
// OREData/ored/portfolio/builders/vanillaoption.hpp:164 auto displacementStr = this->modelParameter("Displacement", {assetName}, false, "0.0");
The value is then parsed as a real in the same function.
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entrydisplacement, setsource_kindtonumber.
3.28. F-27 IrReversion set is text but ORE reads a real, wrong kind
- Set code:
irreversion - Parameters:
ModelParameters/IrReversionandModelParameters/IrReversion_ - Set as it stands: text, no values.
What ORE accepts: a real number.
// OREData/ored/portfolio/builders/scriptedtrade.cpp:1155 string revStr = modelParameter("IrReversion_" + ccy, ..., false, ""); if (revStr.empty()) revStr = modelParameter("IrReversion", ..., false, ""); ... irReversions_[ccy] = parseReal(revStr);
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryirreversion, setsource_kindtonumber.
3.29. F-28 InfJyRealRateReversion set is text but ORE reads a real, wrong kind
- Set code:
infjyrealratereversion - Parameter:
ModelParameters/InfJyRealRateReversion - Set as it stands: text, no values.
What ORE accepts: a real number. The sibling times and volumes are comma lists, but the reversion is one value.
// OREData/ored/portfolio/builders/scriptedtrade.cpp:1752 auto tmp4 = modelParameter("InfJyRealRateReversion", ..., true); ... ReversionParameter realRateRev(..., {parseReal(tmp4)});
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entryinfjyrealratereversion, setsource_kindtonumber.
3.30. F-29 Bootstrap.MesherConcentration set is text but ORE reads a real, wrong kind
- Set code:
bootstrap_mesherconcentration - Parameter:
EngineParameters/Bootstrap.MesherConcentration - Set as it stands: text, no values.
What ORE accepts: a real number or an empty string.
// OREData/ored/portfolio/builders/convertiblebond.cpp:71 auto modelMesherConcentrationStr = engineParameter("Bootstrap.MesherConcentration", {}, false, ""); if (!modelMesherConcentrationStr.empty()) modelMesherConcentration = parseReal(modelMesherConcentrationStr);
- Direction: wrong kind.
- Correction: in
value-sets-code.json, undersets, entrybootstrap_mesherconcentration, setsource_kindtonumber.
3.31. F-30 Period pattern refuses a signed period ORE accepts, too narrow
- Set codes:
convention.periodandcurve.period - Parameters:
convention.periodserves 17 terms, for exampleInflationSwap|ObservationLag,FXOption|SwitchTenorandCrossCurrencyBasis|SpreadTenor.curve.periodservesInflationCapFloorVolatilities|ObservationLag. - Set as it stands: regex, pattern
^([0-9]+[DdWwMmYy])+$. What ORE accepts: the
QuantLib::PeriodParsergrammar. The grammar takes one or more number-unit pairs and it allows a leading sign.// QuantLib/ql/utilities/dataparsers.cpp:40 Period PeriodParser::parse(const std::string& str) { QL_REQUIRE(str.length()>1, ...); ... find_first_of("DdWwMmYy") ... // QuantLib/ql/utilities/dataparsers.cpp:77 Size nPos = str.find_first_of("-+0123456789"); QL_REQUIRE(nPos<iPos, "no numbers of " << units << " provided"); nInteger n = std::stoi(str.substr(nPos,iPos));
- Case handling: the parser accepts an upper case unit and a lower case unit.
- Direction: too narrow. ORE parses
-3Mand+1Y. The pattern refuses both. A negative observation lag is meaningful for an inflation index. - Correction: this pattern is this repository's own choice. ORE enforces a
parser, not a pattern. In
projects/ores.sql/utility/convention_value_sets.py,OWN_SETS, entryconvention.period, and inprojects/ores.sql/utility/curve_value_sets.py,OWN_SETS, entrycurve.period, changepatternto^[+-]?([0-9]+[DdWwMmYy])+$. A simpler option is to statetextfor these two sets, because ORE holds no pattern.
3.32. F-31 InterpolationMethod refuses one deprecated alias ORE accepts, too narrow
- Set code:
curve.yield_curve_interpolation_method - Parameter:
YieldCurves|InterpolationMethod - Set as it stands: enumerated, 20 values. It holds
KrugerLogMixedLinearCubicandLogMixedLinearCubicNaturalSpline. What ORE accepts: 21 values. The parser also accepts
DefaultLogMixedLinearCubicas a deprecated alias ofKrugerLogMixedLinearCubic.// OREData/ored/marketdata/yieldcurve.cpp:336 else if (s == "DefaultLogMixedLinearCubic") // deprecated,for backwards compatibility return YieldCurve::InterpolationMethod::KrugerLogMixedLinearCubic;
- Case handling: case-sensitive.
- Direction: too narrow. The alias is deprecated, so a configuration should not use it. ORE still accepts it.
- Correction: the value list is generated from
projects/ores.sql/utility/curve_terms.json, keyparsers, entryparseYieldCurveInterpolationMethod, listvalues. Add{"means": "KrugerLogMixedLinearCubic", "value": "DefaultLogMixedLinearCubic"}and regenerate the terms file.
4. Corrections to this audit, made when the findings were applied
The findings were applied in Correct the value sets against the ORE code. Three do not hold as written.
4.1. F-04 and F-05 are not applied: Model and Engine name a builder, not a fixed list
The evidence is one builder's comparison for a scripted trade. The same element names a builder from ORE's registry for every other product type, and the registry holds far more names than the five a scripted trade accepts. The seeded population states LGM, BlackScholesMerton, DiscountedCashflows, CrossAssetModel, GarmanKohlhagen and eleven more, and the valid name depends on the product type. A set of five would refuse every valid interest rate configuration, so both sets stay text and their descriptions say what they name.
4.2. F-03 is applied in part: Calibration is text for a reason the audit missed
The IR and FX builders read it through parseCalibrationType, which accepts five
values. The scripted trade builder stores the same parameter as a plain string
with a default of Deal and never compares it, so no list bounds it there. The
union of a five-value list and an unvalidated string is text, and the set says so.
4.3. The business day convention catalogue now states ORE's spellings
The audit did not reach the catalogue contents. ORE's parser maps 26 spellings
onto seven conventions, and the registry holds the seven; the catalogue view
states the crosswalk, so a document that says F and one that says Following
are the same rule. The day counter registry already held ORE's spellings.
The table lists every set that this audit verified, with one verdict for each
set. The seven catalogue sets are not in the table. They hold a relation name
and no values, so this audit does not compare them.
| Set | Parameter | Kind | Verdict |
|---|---|---|---|
calibrationstrategy |
ModelParameters/CalibrationStrategy |
enumerated | too narrow |
convention.period |
AverageOIS/FixedTenor (+16) |
regex | too narrow |
curve.period |
InflationCapFloorVolatilities/ObservationLag |
regex | too narrow |
curve.yield_curve_interpolation_method |
YieldCurves/InterpolationMethod |
enumerated | too narrow |
scheme |
EngineParameters/Scheme |
enumerated | too narrow |
bootstrap_mesherconcentration |
EngineParameters/Bootstrap.MesherConcentration |
text | wrong kind |
bootstrap_mode |
EngineParameters/Bootstrap.Mode |
text | wrong kind |
bounds |
EngineParameters/Bounds |
text | wrong kind |
calibration |
ModelParameters/Calibration |
text | wrong kind |
displacement |
ModelParameters/Displacement |
text | wrong kind |
engine |
EngineParameters/Engine |
text | wrong kind |
floatspreadmapping |
EngineParameters/FloatSpreadMapping (+1) |
text | wrong kind |
globalmodel |
ModelParameters/GlobalModel |
text | wrong kind |
heston_calibrationmethod |
EngineParameters/Heston.CalibrationMethod |
text | wrong kind |
heston_processdiscretization |
EngineParameters/Heston.ProcessDiscretization |
text | wrong kind |
indicatorsmoothingforderivatives |
EngineParameters/IndicatorSmoothingForDerivatives |
text | wrong kind |
indicatorsmoothingforvalues |
EngineParameters/IndicatorSmoothingForValues |
text | wrong kind |
infjyrealratereversion |
ModelParameters/InfJyRealRateReversion |
text | wrong kind |
infmodeltype |
ModelParameters/InfModelType |
text | wrong kind |
irreversion |
ModelParameters/IrReversion (+1) |
text | wrong kind |
irvolatilitytype |
ModelParameters/IrVolatilityType |
text | wrong kind |
model |
ModelParameters/Model |
text | wrong kind |
regression_vargroupmode |
EngineParameters/Regression.VarGroupMode |
text | wrong kind |
regressionvariancecutoff |
EngineParameters/RegressionVarianceCutoff |
text | wrong kind |
sqrtsmoothingforderivatives |
EngineParameters/SqrtSmoothingForDerivatives |
text | wrong kind |
timingadjustment |
EngineParameters/TimingAdjustment |
text | wrong kind |
trainingsamples |
EngineParameters/TrainingSamples |
text | wrong kind |
usead |
EngineParameters/UseAD |
text | wrong kind |
useindexcurveforindexcds |
EngineParameters/useIndexCurveForIndexCDS |
text | wrong kind |
yieldcurvemodel |
EngineParameters/YieldCurveModel |
text | wrong kind |
beta |
EngineParameters/beta |
number | wrong bounds |
bins |
EngineParameters/Bins |
integer | wrong bounds |
bootstrap_stategridpoints |
EngineParameters/Bootstrap.StateGridPoints |
integer | wrong bounds |
bootstrap_timestepsperyear |
EngineParameters/Bootstrap.TimeStepsPerYear |
integer | wrong bounds |
buckets |
EngineParameters/buckets |
integer | wrong bounds |
cashflowgeneration_oncpnmaxsimtimes |
EngineParameters/CashflowGeneration.OnCpnMaxSimTimes |
integer | wrong bounds |
exercisetimestepsperyear |
EngineParameters/ExerciseTimeStepsPerYear (+1) |
integer | wrong bounds |
heston_maxcalibrationattempts |
EngineParameters/Heston.MaxCalibrationAttempts |
integer | wrong bounds |
maxdiscretisationpoints |
EngineParameters/MaxDiscretisationPoints |
integer | wrong bounds |
maxgapdays |
EngineParameters/MaxGapDays |
integer | wrong bounds |
nsimulations |
EngineParameters/nSimulations |
integer | wrong bounds |
nx |
EngineParameters/nx |
integer | wrong bounds |
ny |
EngineParameters/ny |
integer | wrong bounds |
pricing_samples |
EngineParameters/Pricing.Samples |
integer | wrong bounds |
pricing_stategridpoints |
EngineParameters/Pricing.StateGridPoints |
integer | wrong bounds |
pricing_timestepsperyear |
EngineParameters/Pricing.TimeStepsPerYear |
integer | wrong bounds |
regressionorder |
EngineParameters/RegressionOrder |
integer | wrong bounds |
samples |
EngineParameters/Samples (+1) |
integer | wrong bounds |
stategridpoints |
EngineParameters/StateGridPoints |
integer | wrong bounds |
timestepsperyear |
EngineParameters/TimeStepsPerYear |
integer | wrong bounds |
training_samples |
EngineParameters/Training.Samples |
integer | wrong bounds |
variancestategridpoints |
EngineParameters/VarianceStateGridPoints |
integer | wrong bounds |
calibrationindexterms |
EngineParameters/calibrationIndexTerms |
text | undecided |
conversion_ratio_discretization_grid |
EngineParameters/ConversionRatioDiscretizationGrid |
text | undecided |
mctype |
GlobalParameters/McType |
text | undecided |
runtype |
GlobalParameters/RunType |
text | undecided |
accuracy |
EngineParameters/Accuracy |
number | ok |
baseccy |
ModelParameters/BaseCcy |
text | ok |
bootstrap_calibrationgrid |
EngineParameters/Bootstrap.CalibrationGrid |
text | ok |
bootstrap_mesherepsilon |
EngineParameters/Bootstrap.MesherEpsilon |
number | ok |
bootstrap_mesherscaling |
EngineParameters/Bootstrap.MesherScaling |
number | ok |
bootstraptolerance |
EngineParameters/BootstrapTolerance |
number | ok |
brownianbridgeordering |
EngineParameters/BrownianBridgeOrdering |
enumerated | ok |
bsstddevs |
EngineParameters/BSStdDevs |
number | ok |
buckettimes |
EngineParameters/BucketTimes |
number | ok |
buckettimesdeltagamma |
EngineParameters/BucketTimesDeltaGamma |
number | ok |
buckettimesvega |
EngineParameters/BucketTimesVega |
number | ok |
buckettimesvegaopt |
EngineParameters/BucketTimesVegaOpt |
number | ok |
buckettimesvegaund |
EngineParameters/BucketTimesVegaUnd |
number | ok |
calibrationinstrumentspacing |
ModelParameters/CalibrationInstrumentSpacing |
text | ok |
calibrationmoneyness |
EngineParameters/CalibrationMoneyness |
number | ok |
callspreadeps |
EngineParameters/CallSpreadEps |
number | ok |
cashflowgeneration_oncpnaddsimtimescutoff |
EngineParameters/CashflowGeneration.OnCpnAddSimTimesCutoff |
text | ok |
convention.atm_type |
FxOption/AtmType |
enumerated | ok |
convention.averaging_data_period |
CommodityFuture/Period |
enumerated | ok |
convention.bond_price_type |
BondYield/PriceType |
enumerated | ok |
convention.compounding |
BondYield/Compounding (+1) |
enumerated | ok |
convention.date_generation_rule |
CDS/Rule (+1) |
enumerated | ok |
convention.delta_type |
FxOption/DeltaType |
enumerated | ok |
convention.frequency |
AverageOIS/FixedFrequency (+12) |
enumerated | ok |
convention.inflation_swap_publication_roll |
InflationSwap/PublicationRoll |
enumerated | ok |
convention.integer |
BMABasisSwap/IndexPaymentLag (+18) |
integer | ok |
convention.month |
CommodityFuture/OneContractMonth |
enumerated | ok |
convention.option_type |
FxOption/RiskReversalInFavorOf |
enumerated | ok |
convention.sub_periods_coupon_type |
Swap/SubPeriodsCouponType (+1) |
enumerated | ok |
correlation |
EngineParameters/Correlation |
number | ok |
credit_reversion |
ModelParameters/Credit_Reversion |
number | ok |
credit_volatility |
ModelParameters/Credit_Volatility |
number | ok |
credit_volatilitytimes |
ModelParameters/Credit_VolatilityTimes |
number | ok |
curve |
EngineParameters/Curve |
enumerated | ok |
curve.flag |
BaseCorrelations/CalibrateConstituentsToIndexSpread (+14) |
boolean | ok |
curve.frequency |
InflationCurves/Frequency |
enumerated | ok |
curve.fx_volatility_time_interpolation |
FXVolatilities/TimeInterpolation |
enumerated | ok |
curve.integer |
BaseCorrelations/SettlementDays (+2) |
integer | ok |
curve.number |
BaseCorrelations/IndexSpread (+6) |
number | ok |
curve.text |
BaseCorrelations/AdjustForLosses (+152) |
text | ok |
curve.yield_curve_extrapolation_method |
YieldCurves/ExtrapolationMethod |
enumerated | ok |
curve.yield_curve_interpolation_variable |
YieldCurves/InterpolationVariable |
enumerated | ok |
dampingsteps |
EngineParameters/DampingSteps |
integer | ok |
errortolerance |
EngineParameters/ErrorTolerance |
number | ok |
eta |
ModelParameters/eta |
number | ok |
externalcomputedevice |
EngineParameters/ExternalComputeDevice |
text | ok |
fepcurve |
EngineParameters/FepCurve |
enumerated | ok |
fixedmaxstddevs |
EngineParameters/FixedMaxStdDevs |
number | ok |
fixedminstddevs |
EngineParameters/FixedMinStdDevs |
number | ok |
flag |
CDS/PaysAtDefaultTime (+92) |
boolean | ok |
flatvol |
EngineParameters/FlatVol |
number | ok |
fxcalibration |
ModelParameters/FxCalibration |
enumerated | ok |
fxsource |
ModelParameters/FXSource |
text | ok |
fxvolatility |
ModelParameters/FxVolatility |
text | ok |
fxvolatilitytimes |
ModelParameters/FxVolatilityTimes |
text | ok |
gridcoarsening |
ModelParameters/GridCoarsening |
text | ok |
heston_calibrationexpiries |
EngineParameters/Heston.CalibrationExpiries |
text | ok |
heston_calibrationvarianceterms |
EngineParameters/Heston.CalibrationVarianceTerms |
text | ok |
heston_earlyexitthreshold |
EngineParameters/Heston.EarlyExitThreshold |
number | ok |
heston_initialvalues |
EngineParameters/Heston.InitialValues |
number | ok |
heston_maxacceptableerror |
EngineParameters/Heston.MaxAcceptableError |
number | ok |
heston_maximuminitialvalues |
EngineParameters/Heston.MaximumInitialValues |
number | ok |
heston_quantoprocessdiscretization |
EngineParameters/Heston.QuantoProcessDiscretization |
enumerated | ok |
heston_relaxedfellerconstraint |
EngineParameters/Heston.RelaxedFellerConstraint |
number | ok |
infdkvolatility |
ModelParameters/InfDkVolatility |
number | ok |
infjyindexvol |
ModelParameters/InfJyIndexVol |
text | ok |
infjyrealratevol |
ModelParameters/InfJyRealRateVol |
text | ok |
infjyrealtonominalvolratio |
ModelParameters/InfJyRealToNominalVolRatio |
number | ok |
infjytimes |
ModelParameters/InfJyTimes |
text | ok |
integrationpoints |
EngineParameters/IntegrationPoints |
integer | ok |
lossdistributionperiods |
EngineParameters/LossDistributionPeriods |
text | ok |
lower_rate_bound_log_normal |
EngineParameters/LowerRateBoundLogNormal |
number | ok |
lower_rate_bound_normal |
EngineParameters/LowerRateBoundNormal |
number | ok |
lowerlimit |
EngineParameters/LowerLimit |
number | ok |
max |
ModelParameters/max |
number | ok |
maxcprmultiplier |
ModelParameters/MaxCPRMultiplier |
number | ok |
maxiterations |
EngineParameters/MaxIterations |
integer | ok |
maxpricethresholdsteps |
EngineParameters/MaxPriceThresholdSteps |
integer | ok |
maxsamples |
EngineParameters/MaxSamples |
integer | ok |
meanreversion |
EngineParameters/MeanReversion |
number | ok |
mesherconcentration |
EngineParameters/MesherConcentration |
number | ok |
mesherepsilon |
EngineParameters/MesherEpsilon |
number | ok |
meshermaxconcentratingpoints |
EngineParameters/MesherMaxConcentratingPoints |
integer | ok |
mesherscaling |
EngineParameters/MesherScaling |
number | ok |
method |
EngineParameters/method |
enumerated | ok |
min |
ModelParameters/min |
number | ok |
mincprmultiplier |
ModelParameters/MinCPRMultiplier |
number | ok |
number |
CommodityForward/PointsFactor (+2) |
number | ok |
openenddatereplacement |
ModelParameters/OpenEndDateReplacement |
text | ok |
optionexpiryposition |
EngineParameters/OptionExpiryPosition |
enumerated | ok |
p |
ModelParameters/p |
number | ok |
policy |
EngineParameters/Policy |
enumerated | ok |
polynomtype |
EngineParameters/PolynomType |
enumerated | ok |
precision |
EngineParameters/Precision |
number | ok |
pricethreshold |
EngineParameters/PriceThreshold |
number | ok |
pricethresholdstep |
EngineParameters/PriceThresholdStep |
number | ok |
pricing_conversionratiodiscretisationgrid |
EngineParameters/Pricing.ConversionRatioDiscretisationGrid |
number | ok |
pricing_mesherepsilon |
EngineParameters/Pricing.MesherEpsilon |
number | ok |
pricing_mesherscaling |
EngineParameters/Pricing.MesherScaling |
number | ok |
pricing_seed |
EngineParameters/Pricing.Seed |
integer | ok |
pricing_sequence |
EngineParameters/Pricing.Sequence |
enumerated | ok |
pseudo_currency_base_currency |
GlobalParameters/PseudoCurrency.BaseCurrency |
text | ok |
pseudo_currency_curve_xag |
GlobalParameters/PseudoCurrency.Curve.XAG |
text | ok |
pseudo_currency_curve_xau |
GlobalParameters/PseudoCurrency.Curve.XAU |
text | ok |
pseudo_currency_curve_xpd |
GlobalParameters/PseudoCurrency.Curve.XPD |
text | ok |
pseudo_currency_curve_xpt |
GlobalParameters/PseudoCurrency.Curve.XPT |
text | ok |
pseudo_currency_default_correlation |
GlobalParameters/PseudoCurrency.DefaultCorrelation |
number | ok |
pseudo_currency_fx_index_tag |
GlobalParameters/PseudoCurrency.FXIndexTag |
text | ok |
pseudo_currency_treat_as_fx |
GlobalParameters/PseudoCurrency.TreatAsFX |
boolean | ok |
quantocurrencypairs |
EngineParameters/QuantoCurrencyPairs |
text | ok |
recoveryrategrid |
ModelParameters/recoveryRateGrid |
text | ok |
recoveryrateprobabilities |
ModelParameters/recoveryRateProbabilities |
text | ok |
referencecalibrationgrid |
ModelParameters/ReferenceCalibrationGrid |
text | ok |
regression_maxsimtimeseq |
EngineParameters/Regression.MaxSimTimesEQ |
integer | ok |
regression_maxsimtimesfx |
EngineParameters/Regression.MaxSimTimesFX |
integer | ok |
regression_maxsimtimesir |
EngineParameters/Regression.MaxSimTimesIR |
integer | ok |
regressormodel |
EngineParameters/RegressorModel |
enumerated | ok |
requiredsamples |
EngineParameters/RequiredSamples |
integer | ok |
requiredtolerance |
EngineParameters/RequiredTolerance |
number | ok |
reversion |
ModelParameters/Reversion |
number | ok |
reversiontype |
ModelParameters/ReversionType |
enumerated | ok |
salvagingalgorithm |
EngineParameters/SalvagingAlgorithm |
enumerated | ok |
seed |
EngineParameters/Seed (+1) |
integer | ok |
sensitivitydecomposition |
EngineParameters/SensitivityDecomposition |
enumerated | ok |
separatecallputvols |
EngineParameters/SeparateCallPutVols |
text | ok |
sequencetype |
EngineParameters/SequenceType |
enumerated | ok |
setup.fixing_lag_days |
Setup/ignoreFixingLag (+1) |
integer | ok |
setup.flag |
Setup/buildFailedTrades (+8) |
boolean | ok |
setup.gzip_compression_level |
Setup/gzipCompressionLevel |
integer | ok |
setup.log_mask |
Setup/logMask |
integer | ok |
setup.n_threads |
Setup/nThreads |
integer | ok |
setup.observation_model |
Setup/observationModel |
enumerated | ok |
shifthorizon |
ModelParameters/ShiftHorizon |
number | ok |
singleswaptionthreshold |
EngineParameters/singleSwaptionThreshold |
number | ok |
soboldirectionintegers |
EngineParameters/SobolDirectionIntegers |
enumerated | ok |
sobolordering |
EngineParameters/SobolOrdering |
enumerated | ok |
spreadonincomecurve |
EngineParameters/SpreadOnIncomeCurve |
boolean | ok |
steps |
EngineParameters/Steps (+1) |
integer | ok |
sx |
EngineParameters/sx |
number | ok |
sy |
EngineParameters/sy |
number | ok |
text |
AverageOIS/FixedCalendar (+110) |
text | ok |
timegridminimumsize |
EngineParameters/TimeGridMinimumSize |
integer | ok |
timegridperyear |
EngineParameters/TimeGridPerYear |
integer | ok |
timestepperiod |
EngineParameters/TimestepPeriod |
text | ok |
tolerance |
ModelParameters/Tolerance |
number | ok |
training_basisfunction |
EngineParameters/Training.BasisFunction |
enumerated | ok |
training_basisfunctionorder |
EngineParameters/Training.BasisFunctionOrder |
integer | ok |
training_seed |
EngineParameters/Training.Seed |
integer | ok |
training_sequence |
EngineParameters/Training.Sequence |
enumerated | ok |
trainingseed |
EngineParameters/TrainingSeed |
integer | ok |
trainingsequencetype |
EngineParameters/TrainingSequenceType |
enumerated | ok |
treatsecurityspreadascreditspread |
ModelParameters/TreatSecuritySpreadAsCreditSpread |
boolean | ok |
upper_rate_bound_log_normal |
EngineParameters/UpperRateBoundLogNormal |
number | ok |
upper_rate_bound_normal |
EngineParameters/UpperRateBoundNormal |
number | ok |
upperlimit |
EngineParameters/UpperLimit |
number | ok |
useindexcdspricer |
EngineParameters/useIndexCDSPricer |
boolean | ok |
vegaratio |
EngineParameters/VegaRatio |
number | ok |
volatility |
ModelParameters/Volatility |
number | ok |
volatilitytimes |
ModelParameters/VolatilityTimes |
number | ok |
volatilitytype |
ModelParameters/VolatilityType |
enumerated | ok |
xgrid |
EngineParameters/XGrid |
integer | ok |
Verdict counts for the 217 verified sets:
| Verdict | Count |
|---|---|
| ok | 161 |
| too narrow | 5 |
| wrong kind | 25 |
| wrong bounds | 22 |
| undecided | 4 |
5. Sets not decided
5.1. runtype, parameter GlobalParameters/RunType
ORE never reads this value from a configuration and never validates it. ORE
writes the value itself, for example at analytic.cpp:243 (NPV),
xvaanalytic.cpp:573 (Exposure), stresstest.cpp:149 (Stress) and
sensitivityanalysis.cpp:213 (SensitivityDelta or SensitivityDeltaGamma).
The builders compare the value with a few words, for example
cdo.hpp:89 and swaption.cpp:125. A user can write any word in the XML and
ORE does not refuse it. The parameter is therefore neither a fixed list nor
free text. Decide whether the setting belongs in the model at all before a
value set is authored.
5.2. mctype, parameter GlobalParameters/McType
ORE sets this value and never parses it. xvaanalytic.cpp:574 sets Classic,
xvaanalytic.cpp:986 sets American, and capfloor.cpp:141 compares it with
American. The audit found no reader that accepts or refuses a user value.
Decide whether the setting belongs in the model before a value set is authored.
5.3. calibrationindexterms, parameter EngineParameters/calibrationIndexTerms
The audit found no reader of this name in the ORE source. The link may come
from the ORE guide only. A search of OREData, OREAnalytics and QuantExt
found no string literal calibrationIndexTerms.
5.4. conversion_ratio_discretization_grid, parameter
EngineParameters/ConversionRatioDiscretizationGrid
The audit found no reader of this spelling. ORE reads
Pricing.ConversionRatioDiscretisationGrid with an s at
convertiblebond.cpp:89, and that name has its own set. The two names look
like a duplicate. Confirm which name ORE uses before a value set is authored.
6. Limits of this audit
- This audit reads the parser and the call site. It does not run ORE.
- A
numberset that ORE reads as a comma separated list keeps thenumberkind. Examples arebuckettimes,calibrationmoneyness,heston_initialvaluesandheston_maximuminitialvalues. The model has no list kind, so the audit does not report these sets. - The audit found no explicit
QL_REQUIREbound on a real valued engine parameter other thanbeta. - The audit compares the
integerkind against aSizestore for the sets in F-20. It did not trace every one of the 46 integer sets to its store type.