Skip to content

Commit 93c4e07

Browse files
pcaspersjenkins
authored andcommitted
QPR-12329 fixes
1 parent 4297dba commit 93c4e07

8 files changed

Lines changed: 35 additions & 24 deletions

File tree

OREData/ored/model/crossassetmodelbuilder.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ CrossAssetModelBuilder::CrossAssetModelBuilder(
103103
marketObserver_->addObservable(c.second);
104104
// reset market observer's updated flag
105105
marketObserver_->hasUpdated(true);
106+
// register with market observer
107+
registerWith(marketObserver_);
106108
}
107109

108110
Handle<QuantExt::CrossAssetModel> CrossAssetModelBuilder::model() const {
@@ -244,9 +246,9 @@ void CrossAssetModelBuilder::buildModel() const {
244246
}
245247
auto builder = boost::dynamic_pointer_cast<LgmBuilder>(subBuilders_[CrossAssetModel::AssetType::IR][i]);
246248
lgmBuilder.push_back(builder);
249+
if (builder->requiresRecalibration())
250+
recalibratedCurrencies.insert(builder->parametrization()->currency().code());
247251
auto parametrization = builder->parametrization();
248-
if(builder->requiresRecalibration())
249-
recalibratedCurrencies.insert(parametrization->currency().code());
250252
if (dontCalibrate_)
251253
builder->freeze();
252254
swaptionBaskets_[i] = builder->swaptionBasket();
@@ -270,9 +272,9 @@ void CrossAssetModelBuilder::buildModel() const {
270272
}
271273
auto builder = boost::dynamic_pointer_cast<HwBuilder>(subBuilders_[CrossAssetModel::AssetType::IR][i]);
272274
hwBuilder.push_back(builder);
275+
if (builder->requiresRecalibration())
276+
recalibratedCurrencies.insert(builder->parametrization()->currency().code());
273277
auto parametrization = builder->parametrization();
274-
if(builder->requiresRecalibration())
275-
recalibratedCurrencies.insert(parametrization->currency().code());
276278
if (dontCalibrate_)
277279
builder->freeze();
278280
swaptionBaskets_[i] = builder->swaptionBasket();
@@ -543,8 +545,6 @@ void CrossAssetModelBuilder::buildModel() const {
543545
continue;
544546
}
545547

546-
std::cout << "calibrate fx " << fx->foreignCcy() << std::endl;
547-
548548
DLOG("FX Calibration " << i);
549549

550550
// attach pricing engines to helpers
@@ -591,6 +591,7 @@ void CrossAssetModelBuilder::buildModel() const {
591591
}
592592
}
593593
}
594+
fxBuilder[i]->setCalibrationDone();
594595
}
595596

596597
/*************************
@@ -616,8 +617,8 @@ void CrossAssetModelBuilder::buildModel() const {
616617

617618
if (!eqBuilder[i]->requiresRecalibration() &&
618619
recalibratedCurrencies.find(eq->currency()) == recalibratedCurrencies.end()) {
619-
DLOG("EQ Calibration "
620-
<< i << " skipped, since neither eq builder nor ir model in eq ccy were recalibrated.");
620+
DLOG("EQ Calibration " << i
621+
<< " skipped, since neither eq builder nor ir model in eq ccy were recalibrated.");
621622
continue;
622623
}
623624

@@ -664,6 +665,7 @@ void CrossAssetModelBuilder::buildModel() const {
664665
}
665666
}
666667
}
668+
eqBuilder[i]->setCalibrationDone();
667669
}
668670

669671
/*************************
@@ -729,10 +731,6 @@ void CrossAssetModelBuilder::buildModel() const {
729731
DLOG("Relinked discounting curve for " << p->currency().code() << " as final model curves");
730732
}
731733

732-
// play safe (although the cache of the model should be empty at
733-
// this point from all what we know...)
734-
model_->update();
735-
736734
DLOG("Building CrossAssetModel done");
737735
}
738736

OREData/ored/model/eqbsbuilder.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,18 @@ bool EqBsBuilder::requiresRecalibration() const {
126126

127127
void EqBsBuilder::performCalculations() const {
128128
if (requiresRecalibration()) {
129-
// reset market observer updated flag
130-
marketObserver_->hasUpdated(true);
131129
// build option basket
132130
buildOptionBasket();
133-
// update vol cache
134-
volSurfaceChanged(true);
135131
}
136132
}
137133

134+
void EqBsBuilder::setCalibrationDone() const {
135+
// reset market observer updated flag
136+
marketObserver_->hasUpdated(true);
137+
// update vol cache
138+
volSurfaceChanged(true);
139+
}
140+
138141
Real EqBsBuilder::optionStrike(const Size j) const {
139142
ore::data::Strike strike = ore::data::parseStrike(data_->optionStrikes()[j]);
140143
Real strikeValue;

OREData/ored/model/eqbsbuilder.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class EqBsBuilder : public QuantExt::ModelBuilder {
7575
bool requiresRecalibration() const override;
7676
//@}
7777

78+
void setCalibrationDone() const;
79+
7880
private:
7981
void performCalculations() const override;
8082
Real optionStrike(const Size j) const;

OREData/ored/model/fxbsbuilder.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,18 @@ bool FxBsBuilder::requiresRecalibration() const {
125125

126126
void FxBsBuilder::performCalculations() const {
127127
if (requiresRecalibration()) {
128-
// reset market observer updated flag
129-
marketObserver_->hasUpdated(true);
130128
// build option basket
131129
buildOptionBasket();
132-
// update vol cache
133-
volSurfaceChanged(true);
134130
}
135131
}
136132

133+
void FxBsBuilder::setCalibrationDone() const {
134+
// reset market observer updated flag
135+
marketObserver_->hasUpdated(true);
136+
// update vol cache
137+
volSurfaceChanged(true);
138+
}
139+
137140
Real FxBsBuilder::optionStrike(const Size j) const {
138141
Date expiryDate = optionExpiry(j);
139142
ore::data::Strike strike = ore::data::parseStrike(data_->optionStrikes()[j]);

OREData/ored/model/fxbsbuilder.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ class FxBsBuilder : public QuantExt::ModelBuilder {
7272
void forceRecalculate() override;
7373
bool requiresRecalibration() const override;
7474
//@}
75+
76+
void setCalibrationDone() const;
7577

7678
private:
7779
void performCalculations() const override;

OREData/ored/model/lgmbuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ LgmBuilder::LgmBuilder(const boost::shared_ptr<ore::data::Market>& market, const
213213
marketObserver_->addObservable(shortSwapIndex_->forwardingTermStructure());
214214
marketObserver_->addObservable(shortSwapIndex_->discountingTermStructure());
215215
}
216-
marketObserver_->addObservable(modelDiscountCurve_);
216+
// we do not register with modelDiscountCurve_, since this curve does not affect the calibration
217217
marketObserver_->addObservable(calibrationDiscountCurve_);
218218
registerWith(marketObserver_);
219219
// notify observers of all market data changes, not only when not calculated

QuantExt/qle/models/lgm.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ inline void LinearGaussMarkovModel::calibrateVolatilitiesIterative(
263263
std::vector<boost::shared_ptr<BlackCalibrationHelper>> h(1, helpers[i]);
264264
calibrate(h, method, endCriteria, constraint, weights, MoveVolatility(i));
265265
}
266+
update();
266267
}
267268

268269
inline void LinearGaussMarkovModel::calibrateReversionsIterative(
@@ -272,6 +273,7 @@ inline void LinearGaussMarkovModel::calibrateReversionsIterative(
272273
std::vector<boost::shared_ptr<BlackCalibrationHelper>> h(1, helpers[i]);
273274
calibrate(h, method, endCriteria, constraint, weights, MoveReversion(i));
274275
}
276+
update();
275277
}
276278

277279
inline void
@@ -282,6 +284,7 @@ LinearGaussMarkovModel::calibrateVolatilities(const std::vector<boost::shared_pt
282284
for (Size i = 0; i < parametrization_->parameter(0)->size(); ++i)
283285
moveVols[i] = false;
284286
calibrate(helpers, method, endCriteria, constraint, weights, moveVols);
287+
update();
285288
}
286289

287290
inline void
@@ -292,6 +295,7 @@ LinearGaussMarkovModel::calibrateReversions(const std::vector<boost::shared_ptr<
292295
for (Size i = 0; i < parametrization_->parameter(1)->size(); ++i)
293296
moveRevs[parametrization_->parameter(0)->size() + i] = false;
294297
calibrate(helpers, method, endCriteria, constraint, weights, moveRevs);
298+
update();
295299
}
296300

297301
} // namespace QuantExt

QuantExt/qle/models/linkablecalibratedmodel.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,11 @@ void LinkableCalibratedModel::setParams(const Array& params) {
149149
}
150150

151151
void LinkableCalibratedModel::setParam(Size idx, const Real value) {
152+
int tmp = static_cast<int>(idx);
152153
for (Size i = 0; i < arguments_.size(); ++i) {
153154
for (Size j = 0; j < arguments_[i]->size(); ++j) {
154-
if (idx == 0)
155+
if (tmp-- == 0)
155156
arguments_[i]->setParam(j, value);
156-
else
157-
--idx;
158157
}
159158
}
160159
generateArguments();

0 commit comments

Comments
 (0)