1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 3 /* 4 Copyright (C) 2007 Ferdinando Ametrano 5 Copyright (C) 2007 Mark Joshi 6 7 This file is part of QuantLib, a free-software/open-source library 8 for financial quantitative analysts and developers - http://quantlib.org/ 9 10 QuantLib is free software: you can redistribute it and/or modify it 11 under the terms of the QuantLib license. You should have received a 12 copy of the license along with this program; if not, please email 13 <quantlib-dev@lists.sf.net>. The license is also available online at 14 <http://quantlib.org/license.shtml>. 15 16 This program is distributed in the hope that it will be useful, but WITHOUT 17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 18 FOR A PARTICULAR PURPOSE. See the license for more details. 19 */ 20 21 #ifndef quantlib_ctsmm_caplet_calibration_hpp 22 #define quantlib_ctsmm_caplet_calibration_hpp 23 24 #include <ql/models/marketmodels/curvestate.hpp> 25 #include <ql/models/marketmodels/evolutiondescription.hpp> 26 #include <ql/models/marketmodels/piecewiseconstantcorrelation.hpp> 27 #include <ql/shared_ptr.hpp> 28 #include <vector> 29 30 namespace QuantLib { 31 32 class PiecewiseConstantVariance; 33 class Matrix; 34 35 class CTSMMCapletCalibration { 36 public: 37 virtual ~CTSMMCapletCalibration(); 38 CTSMMCapletCalibration( 39 const EvolutionDescription& evolution, 40 const ext::shared_ptr<PiecewiseConstantCorrelation>& corr, 41 const std::vector<ext::shared_ptr< 42 PiecewiseConstantVariance> >& 43 displacedSwapVariances, 44 const std::vector<Volatility>& mktCapletVols, // displaced?? 45 const ext::shared_ptr<CurveState>& cs, 46 Spread displacement); // ?? 47 // modifiers 48 bool calibrate(Natural numberOfFactors, 49 50 Natural maxIterations, 51 Real tolerance, 52 53 Natural innerMaxIterations = 100, 54 Real innerTolerance = 1e-8); 55 // inspectors 56 Natural failures() const; 57 Real deformationSize() const; 58 59 Real capletRmsError() const; 60 Real capletMaxError() const; 61 Real swaptionRmsError() const; 62 Real swaptionMaxError() const; 63 64 const std::vector<Matrix>& swapPseudoRoots() const; 65 const Matrix& swapPseudoRoot(Size i) const; 66 67 const std::vector<Volatility>& mktCapletVols() const; 68 const std::vector<Volatility>& mdlCapletVols() const; 69 const std::vector<Volatility>& mktSwaptionVols() const; 70 const std::vector<Volatility>& mdlSwaptionVols() const; 71 const std::vector<Volatility>& timeDependentCalibratedSwaptionVols(Size i) const; 72 const std::vector<Volatility>& timeDependentUnCalibratedSwaptionVols(Size i) const; 73 74 75 static void performChecks( 76 const EvolutionDescription& evolution, 77 const PiecewiseConstantCorrelation& corr, 78 const std::vector<ext::shared_ptr< 79 PiecewiseConstantVariance> >& 80 displacedSwapVariances, 81 const std::vector<Volatility>& mktCapletVols, 82 const CurveState& cs); 83 84 const ext::shared_ptr<CurveState>& curveState() const; 85 std::vector<Spread> displacements() const; 86 protected: 87 virtual Natural calibrationImpl_(Natural numberOfFactors, 88 89 Natural innerMaxIterations, 90 Real innerTolerance) = 0; 91 // input 92 EvolutionDescription evolution_; 93 ext::shared_ptr<PiecewiseConstantCorrelation> corr_; 94 std::vector<ext::shared_ptr<PiecewiseConstantVariance> > 95 displacedSwapVariances_; 96 97 std::vector<Volatility> mktCapletVols_, mdlCapletVols_; 98 std::vector<Volatility> mktSwaptionVols_, mdlSwaptionVols_; 99 std::vector<std::vector<Volatility> > timeDependentCalibratedSwaptionVols_; 100 101 ext::shared_ptr<CurveState> cs_; 102 Spread displacement_; 103 Size numberOfRates_; 104 // working variables 105 std::vector<Volatility> usedCapletVols_; 106 // results 107 bool calibrated_; 108 Natural failures_; 109 Real deformationSize_; 110 Real capletRmsError_, capletMaxError_; 111 Real swaptionRmsError_, swaptionMaxError_; 112 std::vector<Matrix> swapCovariancePseudoRoots_; 113 }; 114 115 // inline 116 117 inline const std::vector<Volatility>& mktCapletVols() const118 CTSMMCapletCalibration::mktCapletVols() const { 119 return mktCapletVols_; 120 } 121 122 inline const std::vector<Volatility>& mdlCapletVols() const123 CTSMMCapletCalibration::mdlCapletVols() const { 124 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 125 return mdlCapletVols_; 126 } 127 128 inline const std::vector<Volatility>& mktSwaptionVols() const129 CTSMMCapletCalibration::mktSwaptionVols() const { 130 return mktSwaptionVols_; 131 } 132 133 inline const std::vector<Volatility>& mdlSwaptionVols() const134 CTSMMCapletCalibration::mdlSwaptionVols() const { 135 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 136 return mdlSwaptionVols_; 137 } 138 failures() const139 inline Natural CTSMMCapletCalibration::failures() const { 140 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 141 return failures_; 142 } 143 deformationSize() const144 inline Real CTSMMCapletCalibration::deformationSize() const { 145 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 146 return deformationSize_; 147 } 148 capletRmsError() const149 inline Real CTSMMCapletCalibration::capletRmsError() const { 150 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 151 return capletRmsError_; 152 } 153 capletMaxError() const154 inline Real CTSMMCapletCalibration::capletMaxError() const { 155 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 156 return capletMaxError_; 157 } 158 swaptionRmsError() const159 inline Real CTSMMCapletCalibration::swaptionRmsError() const { 160 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 161 return swaptionRmsError_; 162 } 163 swaptionMaxError() const164 inline Real CTSMMCapletCalibration::swaptionMaxError() const { 165 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 166 return swaptionMaxError_; 167 } 168 169 inline const std::vector<Matrix>& swapPseudoRoots() const170 CTSMMCapletCalibration::swapPseudoRoots() const { 171 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 172 return swapCovariancePseudoRoots_; 173 } 174 175 inline const Matrix& swapPseudoRoot(Size i) const176 CTSMMCapletCalibration::swapPseudoRoot(Size i) const { 177 QL_REQUIRE(calibrated_, "not successfully calibrated yet"); 178 QL_REQUIRE(i<swapCovariancePseudoRoots_.size(), 179 i << "is an invalid index, must be less than " 180 << swapCovariancePseudoRoots_.size()); 181 return swapCovariancePseudoRoots_[i]; 182 } 183 184 inline const ext::shared_ptr<CurveState>& curveState() const185 CTSMMCapletCalibration::curveState() const { 186 return cs_; 187 } 188 189 inline std::vector<Spread> displacements() const190 CTSMMCapletCalibration::displacements() const { 191 return std::vector<Volatility>(numberOfRates_, displacement_); 192 } 193 194 } 195 196 #endif 197