1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
|
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2002, 2003 RiskMap srl
Copyright (C) 2003, 2004, 2005, 2006 StatPro Italia srl
Copyright (C) 2006, 2008 Ferdinando Ametrano
This file is part of QuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://quantlib.org/
QuantLib is free software: you can redistribute it and/or modify it
under the terms of the QuantLib license. You should have received a
copy of the license along with this program; if not, please email
<quantlib-dev@lists.sf.net>. The license is also available online at
<http://quantlib.org/license.shtml>.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
*/
/*! \file swaptionvolstructure.hpp
\brief Swaption volatility structure
*/
#ifndef quantlib_swaption_volatility_structure_hpp
#define quantlib_swaption_volatility_structure_hpp
#include <ql/termstructures/voltermstructure.hpp>
namespace QuantLib {
class SmileSection;
//! %Swaption-volatility structure
/*! This abstract class defines the interface of concrete swaption
volatility structures which will be derived from this one.
*/
class SwaptionVolatilityStructure : public VolatilityTermStructure {
public:
/*! \name Constructors
See the TermStructure documentation for issues regarding
constructors.
*/
//@{
#ifndef QL_DISABLE_DEPRECATED
/*! \warning term structures initialized by means of this
constructor must manage their own reference date
by overriding the referenceDate() method.
*/
SwaptionVolatilityStructure(const Calendar& calendar,
BusinessDayConvention bdc,
const DayCounter& dc = DayCounter());
#endif
/*! \warning term structures initialized by means of this
constructor must manage their own reference date
by overriding the referenceDate() method.
*/
SwaptionVolatilityStructure(BusinessDayConvention bdc,
const DayCounter& dc = DayCounter());
//! initialize with a fixed reference date
SwaptionVolatilityStructure(const Date& referenceDate,
const Calendar& calendar,
BusinessDayConvention bdc,
const DayCounter& dc = DayCounter());
//! calculate the reference date based on the global evaluation date
SwaptionVolatilityStructure(Natural settlementDays,
const Calendar&,
BusinessDayConvention bdc,
const DayCounter& dc = DayCounter());
//@}
virtual ~SwaptionVolatilityStructure() {}
//! \name Volatility, variance and smile
//@{
//! returns the volatility for a given option tenor and swap tenor
Volatility volatility(const Period& optionTenor,
const Period& swapTenor,
Rate strike,
bool extrapolate = false) const;
//! returns the volatility for a given option date and swap tenor
Volatility volatility(const Date& optionDate,
const Period& swapTenor,
Rate strike,
bool extrapolate = false) const;
//! returns the volatility for a given option time and swap tenor
Volatility volatility(Time optionTime,
const Period& swapTenor,
Rate strike,
bool extrapolate = false) const;
//! returns the volatility for a given option tenor and swap length
Volatility volatility(const Period& optionTenor,
Time swapLength,
Rate strike,
bool extrapolate = false) const;
//! returns the volatility for a given option date and swap length
Volatility volatility(const Date& optionDate,
Time swapLength,
Rate strike,
bool extrapolate = false) const;
//! returns the volatility for a given option time and swap length
Volatility volatility(Time optionTime,
Time swapLength,
Rate strike,
bool extrapolate = false) const;
//! returns the Black variance for a given option tenor and swap tenor
Real blackVariance(const Period& optionTenor,
const Period& swapTenor,
Rate strike,
bool extrapolate = false) const;
//! returns the Black variance for a given option date and swap tenor
Real blackVariance(const Date& optionDate,
const Period& swapTenor,
Rate strike,
bool extrapolate = false) const;
//! returns the Black variance for a given option time and swap tenor
Real blackVariance(Time optionTime,
const Period& swapTenor,
Rate strike,
bool extrapolate = false) const;
//! returns the Black variance for a given option tenor and swap length
Real blackVariance(const Period& optionTenor,
Time swapLength,
Rate strike,
bool extrapolate = false) const;
//! returns the Black variance for a given option date and swap length
Real blackVariance(const Date& optionDate,
Time swapLength,
Rate strike,
bool extrapolate = false) const;
//! returns the Black variance for a given option time and swap length
Real blackVariance(Time optionTime,
Time swapLength,
Rate strike,
bool extrapolate = false) const;
//! returns the smile for a given option tenor and swap tenor
boost::shared_ptr<SmileSection> smileSection(const Period& optionTenor,
const Period& swapTenor,
bool extr = false) const;
//! returns the smile for a given option date and swap tenor
boost::shared_ptr<SmileSection> smileSection(const Date& optionDate,
const Period& swapTenor,
bool extr = false) const;
//! returns the smile for a given option time and swap tenor
boost::shared_ptr<SmileSection> smileSection(Time optionTime,
const Period& swapTenor,
bool extr = false) const;
//! returns the smile for a given option tenor and swap length
boost::shared_ptr<SmileSection> smileSection(const Period& optionTenor,
Time swapLength,
bool extr = false) const;
//! returns the smile for a given option date and swap length
boost::shared_ptr<SmileSection> smileSection(const Date& optionDate,
Time swapLength,
bool extr = false) const;
//! returns the smile for a given option time and swap length
boost::shared_ptr<SmileSection> smileSection(Time optionTime,
Time swapLength,
bool extr = false) const;
//@}
//! \name Limits
//@{
//! the largest length for which the term structure can return vols
virtual const Period& maxSwapTenor() const = 0;
//! the largest swapLength for which the term structure can return vols
Time maxSwapLength() const;
//@}
//! implements the conversion between swap tenor and swap (time) length
Time swapLength(const Period& swapTenor) const;
//! implements the conversion between swap dates and swap (time) length
Time swapLength(const Date& start,
const Date& end) const;
protected:
virtual boost::shared_ptr<SmileSection> smileSectionImpl(
const Date& optionDate,
const Period& swapTenor) const;
virtual boost::shared_ptr<SmileSection> smileSectionImpl(
Time optionTime,
Time swapLength) const = 0;
virtual Volatility volatilityImpl(const Date& optionDate,
const Period& swapTenor,
Rate strike) const;
virtual Volatility volatilityImpl(Time optionTime,
Time swapLength,
Rate strike) const = 0;
void checkSwapTenor(const Period& swapTenor,
bool extrapolate) const;
void checkSwapTenor(Time swapLength,
bool extrapolate) const;
};
// inline definitions
// 1. methods with Period-denominated exercise convert Period to Date and then
// use the equivalent Date-denominated exercise methods
inline Volatility
SwaptionVolatilityStructure::volatility(const Period& optionTenor,
const Period& swapTenor,
Rate strike,
bool extrapolate) const {
Date optionDate = optionDateFromTenor(optionTenor);
return volatility(optionDate, swapTenor, strike, extrapolate);
}
inline Volatility
SwaptionVolatilityStructure::volatility(const Period& optionTenor,
Time swapLength,
Rate strike,
bool extrapolate) const {
Date optionDate = optionDateFromTenor(optionTenor);
return volatility(optionDate, swapLength, strike, extrapolate);
}
inline
Real SwaptionVolatilityStructure::blackVariance(const Period& optionTenor,
const Period& swapTenor,
Rate strike,
bool extrapolate) const {
Date optionDate = optionDateFromTenor(optionTenor);
return blackVariance(optionDate, swapTenor, strike, extrapolate);
}
inline
Real SwaptionVolatilityStructure::blackVariance(const Period& optionTenor,
Time swapLength,
Rate strike,
bool extrapolate) const {
Date optionDate = optionDateFromTenor(optionTenor);
return blackVariance(optionDate, swapLength, strike, extrapolate);
}
inline boost::shared_ptr<SmileSection>
SwaptionVolatilityStructure::smileSection(const Period& optionTenor,
const Period& swapTenor,
bool extrapolate) const {
Date optionDate = optionDateFromTenor(optionTenor);
return smileSection(optionDate, swapTenor, extrapolate);
}
// 2. blackVariance methods rely on volatility methods
inline
Real SwaptionVolatilityStructure::blackVariance(const Date& optionDate,
const Period& swapTenor,
Rate strike,
bool extrapolate) const {
Volatility v = volatility(optionDate, swapTenor, strike, extrapolate);
Time optionTime = timeFromReference(optionDate);
return v*v*optionTime;
}
inline
Real SwaptionVolatilityStructure::blackVariance(Time optionTime,
const Period& swapTenor,
Rate strike,
bool extrapolate) const {
Volatility v = volatility(optionTime, swapTenor, strike, extrapolate);
return v*v*optionTime;
}
inline
Real SwaptionVolatilityStructure::blackVariance(const Date& optionDate,
Time swapLength,
Rate strike,
bool extrapolate) const {
Volatility v = volatility(optionDate, swapLength, strike, extrapolate);
Time optionTime = timeFromReference(optionDate);
return v*v*optionTime;
}
inline
Real SwaptionVolatilityStructure::blackVariance(Time optionTime,
Time swapLength,
Rate strike,
bool extrapolate) const {
Volatility v = volatility(optionTime, swapLength, strike, extrapolate);
return v*v*optionTime;
}
// 3. relying on xxxImpl methods
inline Volatility
SwaptionVolatilityStructure::volatility(const Date& optionDate,
const Period& swapTenor,
Rate strike,
bool extrapolate) const {
checkSwapTenor(swapTenor, extrapolate);
checkRange(optionDate, extrapolate);
checkStrike(strike, extrapolate);
return volatilityImpl(optionDate, swapTenor, strike);
}
inline Volatility
SwaptionVolatilityStructure::volatility(const Date& optionDate,
Time swapLength,
Rate strike,
bool extrapolate) const {
checkSwapTenor(swapLength, extrapolate);
checkRange(optionDate, extrapolate);
checkStrike(strike, extrapolate);
Time optionTime = timeFromReference(optionDate);
return volatilityImpl(optionTime, swapLength, strike);
}
inline Volatility
SwaptionVolatilityStructure::volatility(Time optionTime,
const Period& swapTenor,
Rate strike,
bool extrapolate) const {
checkSwapTenor(swapTenor, extrapolate);
checkRange(optionTime, extrapolate);
checkStrike(strike, extrapolate);
Time length = swapLength(swapTenor);
return volatilityImpl(optionTime, length, strike);
}
inline Volatility
SwaptionVolatilityStructure::volatility(Time optionTime,
Time swapLength,
Rate strike,
bool extrapolate) const {
checkSwapTenor(swapLength, extrapolate);
checkRange(optionTime, extrapolate);
checkStrike(strike, extrapolate);
return volatilityImpl(optionTime, swapLength, strike);
}
inline boost::shared_ptr<SmileSection>
SwaptionVolatilityStructure::smileSection(const Date& optionDate,
const Period& swapTenor,
bool extrapolate) const {
checkSwapTenor(swapTenor, extrapolate);
checkRange(optionDate, extrapolate);
return smileSectionImpl(optionDate, swapTenor);
}
inline boost::shared_ptr<SmileSection>
SwaptionVolatilityStructure::smileSection(Time optionTime,
Time swapLength,
bool extrapolate) const {
checkSwapTenor(swapLength, extrapolate);
checkRange(optionTime, extrapolate);
return smileSectionImpl(optionTime, swapLength);
}
// 4. default implementation of Date-based xxxImpl methods
// relying on the equivalent Time-based methods
inline boost::shared_ptr<SmileSection>
SwaptionVolatilityStructure::smileSectionImpl(const Date& optionDate,
const Period& swapT) const {
return smileSectionImpl(timeFromReference(optionDate),
swapLength(swapT));
}
inline Volatility
SwaptionVolatilityStructure::volatilityImpl(const Date& optionDate,
const Period& swapTenor,
Rate strike) const {
return volatilityImpl(timeFromReference(optionDate),
swapLength(swapTenor),
strike);
}
inline Time SwaptionVolatilityStructure::maxSwapLength() const {
return swapLength(maxSwapTenor());
}
}
#endif
|