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