1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 3 /* 4 Copyright (C) 2002, 2003, 2004 Ferdinando Ametrano 5 Copyright (C) 2003, 2004, 2005, 2006, 2007 StatPro Italia srl 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 /*! \file blackconstantvol.hpp 22 \brief Black constant volatility, no time dependence, no strike dependence 23 */ 24 25 #ifndef quantlib_blackconstantvol_hpp 26 #define quantlib_blackconstantvol_hpp 27 28 #include <ql/termstructures/volatility/equityfx/blackvoltermstructure.hpp> 29 #include <ql/quotes/simplequote.hpp> 30 #include <ql/time/daycounters/actual365fixed.hpp> 31 32 namespace QuantLib { 33 34 //! Constant Black volatility, no time-strike dependence 35 /*! This class implements the BlackVolatilityTermStructure 36 interface for a constant Black volatility (no time/strike 37 dependence). 38 */ 39 class BlackConstantVol : public BlackVolatilityTermStructure { 40 public: 41 BlackConstantVol(const Date& referenceDate, 42 const Calendar&, 43 Volatility volatility, 44 const DayCounter& dayCounter); 45 BlackConstantVol(const Date& referenceDate, 46 const Calendar&, 47 const Handle<Quote>& volatility, 48 const DayCounter& dayCounter); 49 BlackConstantVol(Natural settlementDays, 50 const Calendar&, 51 Volatility volatility, 52 const DayCounter& dayCounter); 53 BlackConstantVol(Natural settlementDays, 54 const Calendar&, 55 const Handle<Quote>& volatility, 56 const DayCounter& dayCounter); 57 //! \name TermStructure interface 58 //@{ 59 Date maxDate() const; 60 //@} 61 //! \name VolatilityTermStructure interface 62 //@{ 63 Real minStrike() const; 64 Real maxStrike() const; 65 //@} 66 //! \name Visitability 67 //@{ 68 virtual void accept(AcyclicVisitor&); 69 //@} 70 protected: 71 virtual Volatility blackVolImpl(Time t, Real) const; 72 private: 73 Handle<Quote> volatility_; 74 }; 75 76 77 // inline definitions 78 BlackConstantVol(const Date & referenceDate,const Calendar & cal,Volatility volatility,const DayCounter & dc)79 inline BlackConstantVol::BlackConstantVol(const Date& referenceDate, 80 const Calendar& cal, 81 Volatility volatility, 82 const DayCounter& dc) 83 : BlackVolatilityTermStructure(referenceDate, cal, Following, dc), 84 volatility_(ext::shared_ptr<Quote>(new SimpleQuote(volatility))) {} 85 BlackConstantVol(const Date & referenceDate,const Calendar & cal,const Handle<Quote> & volatility,const DayCounter & dc)86 inline BlackConstantVol::BlackConstantVol(const Date& referenceDate, 87 const Calendar& cal, 88 const Handle<Quote>& volatility, 89 const DayCounter& dc) 90 : BlackVolatilityTermStructure(referenceDate, cal, Following, dc), 91 volatility_(volatility) { 92 registerWith(volatility_); 93 } 94 BlackConstantVol(Natural settlementDays,const Calendar & cal,Volatility volatility,const DayCounter & dc)95 inline BlackConstantVol::BlackConstantVol(Natural settlementDays, 96 const Calendar& cal, 97 Volatility volatility, 98 const DayCounter& dc) 99 : BlackVolatilityTermStructure(settlementDays, cal, Following, dc), 100 volatility_(ext::shared_ptr<Quote>(new SimpleQuote(volatility))) {} 101 BlackConstantVol(Natural settlementDays,const Calendar & cal,const Handle<Quote> & volatility,const DayCounter & dc)102 inline BlackConstantVol::BlackConstantVol(Natural settlementDays, 103 const Calendar& cal, 104 const Handle<Quote>& volatility, 105 const DayCounter& dc) 106 : BlackVolatilityTermStructure(settlementDays, cal, Following, dc), 107 volatility_(volatility) { 108 registerWith(volatility_); 109 } 110 maxDate() const111 inline Date BlackConstantVol::maxDate() const { 112 return Date::maxDate(); 113 } 114 minStrike() const115 inline Real BlackConstantVol::minStrike() const { 116 return QL_MIN_REAL; 117 } 118 maxStrike() const119 inline Real BlackConstantVol::maxStrike() const { 120 return QL_MAX_REAL; 121 } 122 accept(AcyclicVisitor & v)123 inline void BlackConstantVol::accept(AcyclicVisitor& v) { 124 Visitor<BlackConstantVol>* v1 = 125 dynamic_cast<Visitor<BlackConstantVol>*>(&v); 126 if (v1 != 0) 127 v1->visit(*this); 128 else 129 BlackVolatilityTermStructure::accept(v); 130 } 131 blackVolImpl(Time,Real) const132 inline Volatility BlackConstantVol::blackVolImpl(Time, Real) const { 133 return volatility_->value(); 134 } 135 136 } 137 138 139 #endif 140