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
|
/* -*- 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
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 optionletvolatilitystructure.hpp
\brief optionlet (caplet/floorlet) volatility structure
*/
#ifndef quantlib_optionlet_volatility_structure_hpp
#define quantlib_optionlet_volatility_structure_hpp
#include <ql/termstructures/voltermstructure.hpp>
namespace QuantLib {
class SmileSection;
//! Optionlet (caplet/floorlet) volatility structure
/*! This class is purely abstract and defines the interface of
concrete structures which will be derived from this one.
*/
class OptionletVolatilityStructure : public VolatilityTermStructure {
public:
/*! \name Constructors
See the TermStructure documentation for issues regarding
constructors.
*/
//@{
/*! \warning term structures initialized by means of this
constructor must manage their own reference date
by overriding the referenceDate() method.
\deprecated
*/
QL_DEPRECATED
OptionletVolatilityStructure(const Calendar& cal,
BusinessDayConvention bdc = Following,
const DayCounter& dc = DayCounter());
//! default constructor
/*! \warning term structures initialized by means of this
constructor must manage their own reference date
by overriding the referenceDate() method.
*/
OptionletVolatilityStructure(BusinessDayConvention bdc = Following,
const DayCounter& dc = DayCounter());
//! initialize with a fixed reference date
OptionletVolatilityStructure(const Date& referenceDate,
const Calendar& cal,
BusinessDayConvention bdc,
const DayCounter& dc = DayCounter());
//! calculate the reference date based on the global evaluation date
OptionletVolatilityStructure(Natural settlementDays,
const Calendar&,
BusinessDayConvention bdc,
const DayCounter& dc = DayCounter());
//@}
virtual ~OptionletVolatilityStructure() {}
//! \name Volatility and Variance
//@{
//! returns the volatility for a given option tenor and strike rate
Volatility volatility(const Period& optionTenor,
Rate strike,
bool extrapolate = false) const;
//! returns the volatility for a given option date and strike rate
Volatility volatility(const Date& optionDate,
Rate strike,
bool extrapolate = false) const;
//! returns the volatility for a given option time and strike rate
Volatility volatility(Time optionTime,
Rate strike,
bool extrapolate = false) const;
//! returns the Black variance for a given option tenor and strike rate
Real blackVariance(const Period& optionTenor,
Rate strike,
bool extrapolate = false) const;
//! returns the Black variance for a given option date and strike rate
Real blackVariance(const Date& optionDate,
Rate strike,
bool extrapolate = false) const;
//! returns the Black variance for a given option time and strike rate
Real blackVariance(Time optionTime,
Rate strike,
bool extrapolate = false) const;
//! returns the smile for a given option tenor
boost::shared_ptr<SmileSection> smileSection(const Period& optionTenor,
bool extr = false) const;
//! returns the smile for a given option date
boost::shared_ptr<SmileSection> smileSection(const Date& optionDate,
bool extr = false) const;
//! returns the smile for a given option time
boost::shared_ptr<SmileSection> smileSection(Time optionTime,
bool extr = false) const;
//@}
protected:
virtual boost::shared_ptr<SmileSection> smileSectionImpl(
const Date& optionDate) const;
//! implements the actual smile calculation in derived classes
virtual boost::shared_ptr<SmileSection> smileSectionImpl(
Time optionTime) const = 0;
virtual Volatility volatilityImpl(const Date& optionDate,
Rate strike) const;
//! implements the actual volatility calculation in derived classes
virtual Volatility volatilityImpl(Time optionTime,
Rate strike) const = 0;
};
// inline definitions
// 1. Period-based methods convert Period to Date and then
// use the equivalent Date-based methods
inline Volatility
OptionletVolatilityStructure::volatility(const Period& optionTenor,
Rate strike,
bool extrapolate) const {
Date optionDate = optionDateFromTenor(optionTenor);
return volatility(optionDate, strike, extrapolate);
}
inline
Real OptionletVolatilityStructure::blackVariance(const Period& optionTenor,
Rate strike,
bool extrapolate) const {
Date optionDate = optionDateFromTenor(optionTenor);
return blackVariance(optionDate, strike, extrapolate);
}
inline boost::shared_ptr<SmileSection>
OptionletVolatilityStructure::smileSection(const Period& optionTenor,
bool extrapolate) const {
Date optionDate = optionDateFromTenor(optionTenor);
return smileSection(optionDate, extrapolate);
}
// 2. blackVariance methods rely on volatility methods
inline
Real OptionletVolatilityStructure::blackVariance(const Date& optionDate,
Rate strike,
bool extrapolate) const {
Volatility v = volatility(optionDate, strike, extrapolate);
Time t = timeFromReference(optionDate);
return v*v*t;
}
inline
Real OptionletVolatilityStructure::blackVariance(Time optionTime,
Rate strike,
bool extrapolate) const {
Volatility v = volatility(optionTime, strike, extrapolate);
return v*v*optionTime;
}
// 3. relying on xxxImpl methods
inline Volatility
OptionletVolatilityStructure::volatility(const Date& optionDate,
Rate strike,
bool extrapolate) const {
checkRange(optionDate, extrapolate);
checkStrike(strike, extrapolate);
return volatilityImpl(optionDate, strike);
}
inline Volatility
OptionletVolatilityStructure::volatility(Time optionTime,
Rate strike,
bool extrapolate) const {
checkRange(optionTime, extrapolate);
checkStrike(strike, extrapolate);
return volatilityImpl(optionTime, strike);
}
inline boost::shared_ptr<SmileSection>
OptionletVolatilityStructure::smileSection(const Date& optionDate,
bool extrapolate) const {
checkRange(optionDate, extrapolate);
return smileSectionImpl(optionDate);
}
inline boost::shared_ptr<SmileSection>
OptionletVolatilityStructure::smileSection(Time optionTime,
bool extrapolate) const {
checkRange(optionTime, extrapolate);
return smileSectionImpl(optionTime);
}
// 4. default implementation of Date-based xxxImpl methods
// relying on the equivalent Time-based methods
inline boost::shared_ptr<SmileSection>
OptionletVolatilityStructure::smileSectionImpl(const Date& optionDate) const {
return smileSectionImpl(timeFromReference(optionDate));
}
inline Volatility
OptionletVolatilityStructure::volatilityImpl(const Date& optionDate,
Rate strike) const {
return volatilityImpl(timeFromReference(optionDate), strike);
}
}
#endif
|