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