Skip to content

Commit

Permalink
Merge pull request #984.
Browse files Browse the repository at this point in the history
Add errorCode_ member variable to FittingMethod.
  • Loading branch information
lballabio committed Jan 22, 2021
2 parents 97a3c7e + 238eb6c commit 3377d6d
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 5 deletions.
7 changes: 4 additions & 3 deletions ql/termstructures/yield/fittedbonddiscountcurve.cpp
Expand Up @@ -63,7 +63,6 @@ namespace QuantLib {
guessSolution_(guess),
bondHelpers_(bondHelpers),
fittingMethod_(fittingMethod) {

fittingMethod_->curve_ = this;
setup();
}
Expand Down Expand Up @@ -132,7 +131,8 @@ namespace QuantLib {
const Real minCutoffTime,
const Real maxCutoffTime)
: constrainAtZero_(constrainAtZero), weights_(weights), l2_(l2),
calculateWeights_(weights.empty()), optimizationMethod_(optimizationMethod),
calculateWeights_(weights.empty()), errorCode_(EndCriteria::None),
optimizationMethod_(optimizationMethod),
minCutoffTime_(minCutoffTime), maxCutoffTime_(maxCutoffTime) {}

void FittedBondDiscountCurve::FittingMethod::init() {
Expand Down Expand Up @@ -207,6 +207,7 @@ namespace QuantLib {

numberOfIterations_ = 0;
costValue_ = costFunction.value(solution_);
errorCode_ = EndCriteria::None;

return;
}
Expand All @@ -228,7 +229,7 @@ namespace QuantLib {
functionEpsilon,
gradientNormEpsilon);

optimization->minimize(problem,endCriteria);
errorCode_ = optimization->minimize(problem,endCriteria);
solution_ = problem.currentValue();

numberOfIterations_ = problem.functionEvaluation();
Expand Down
9 changes: 9 additions & 0 deletions ql/termstructures/yield/fittedbonddiscountcurve.hpp
Expand Up @@ -194,6 +194,8 @@ namespace QuantLib {
Integer numberOfIterations() const;
//! final value of cost function after optimization
Real minimumCostValue() const;
//! error code of the optimization
EndCriteria::Type errorCode() const;
//! clone of the current object
#if defined(QL_USE_STD_UNIQUE_PTR)
virtual std::unique_ptr<FittingMethod> clone() const = 0;
Expand Down Expand Up @@ -252,6 +254,8 @@ namespace QuantLib {
Integer numberOfIterations_;
// final value for the minimized cost function
Real costValue_;
// error code returned by OptimizationMethod::minimize()
EndCriteria::Type errorCode_;
// optimization method to be used, if none provided use Simplex
ext::shared_ptr<OptimizationMethod> optimizationMethod_;
// flat extrapolation of instantaneous forward before / after cutoff
Expand Down Expand Up @@ -300,6 +304,11 @@ namespace QuantLib {
return costValue_;
}

inline
EndCriteria::Type FittedBondDiscountCurve::FittingMethod::errorCode() const {
return errorCode_;
}

inline Array FittedBondDiscountCurve::FittingMethod::solution() const {
return solution_;
}
Expand Down
6 changes: 4 additions & 2 deletions test-suite/fittedbonddiscountcurve.cpp
Expand Up @@ -157,6 +157,8 @@ void FittedBondDiscountCurveTest::testFlatExtrapolation() {
bonds[i]->setPricingEngine(engine2);
modelPrices2.push_back(bonds[i]->cleanPrice());
}
BOOST_CHECK_EQUAL(curve1->fitResults().errorCode(), EndCriteria::MaxIterations);
BOOST_CHECK_EQUAL(curve2->fitResults().errorCode(), EndCriteria::MaxIterations);

// the resulting cost values are similar for both approaches
// i.e. the fit has a similar quality, I get for example:
Expand Down Expand Up @@ -184,15 +186,15 @@ void FittedBondDiscountCurveTest::testFlatExtrapolation() {
for (Size i = 0; i < helpers.size(); ++i) {
Real t = curve1->timeFromReference(helpers[i]->bond()->maturityDate());
// Real marketYield = bonds[i]->yield(quotes[i], Actual365Fixed(), Continuous, NoFrequency);
// Real modelYield1 =
bonds[i]->yield(modelPrices1[i], Actual365Fixed(), Continuous, NoFrequency);
// Real modelYield1 = bonds[i]->yield(modelPrices1[i], Actual365Fixed(), Continuous, NoFrequency);
Real modelYield2 =
bonds[i]->yield(modelPrices2[i], Actual365Fixed(), Continuous, NoFrequency);
// Real curveYield1 = curve1->zeroRate(t, Continuous).rate();
Real curveYield2 = curve2->zeroRate(t, Continuous).rate();

BOOST_CHECK_CLOSE(modelYield2, curveYield2, 1.0); // 1.0 percent relative tolerance
}

}


Expand Down

0 comments on commit 3377d6d

Please sign in to comment.