1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 
3 /*
4  Copyright (C) 2002, 2003 Ferdinando Ametrano
5 
6  This file is part of QuantLib, a free-software/open-source library
7  for financial quantitative analysts and developers - http://quantlib.org/
8 
9  QuantLib is free software: you can redistribute it and/or modify it
10  under the terms of the QuantLib license.  You should have received a
11  copy of the license along with this program; if not, please email
12  <quantlib-dev@lists.sf.net>. The license is also available online at
13  <http://quantlib.org/license.shtml>.
14 
15  This program is distributed in the hope that it will be useful, but WITHOUT
16  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17  FOR A PARTICULAR PURPOSE.  See the license for more details.
18 */
19 
20 #include <ql/termstructures/volatility/equityfx/blackvoltermstructure.hpp>
21 
22 namespace QuantLib {
23 
BlackVolTermStructure(BusinessDayConvention bdc,const DayCounter & dc)24     BlackVolTermStructure::BlackVolTermStructure(BusinessDayConvention bdc,
25                                                  const DayCounter& dc)
26     : VolatilityTermStructure(bdc, dc) {}
27 
BlackVolTermStructure(const Date & refDate,const Calendar & cal,BusinessDayConvention bdc,const DayCounter & dc)28     BlackVolTermStructure::BlackVolTermStructure(const Date& refDate,
29                                                  const Calendar& cal,
30                                                  BusinessDayConvention bdc,
31                                                  const DayCounter& dc)
32     : VolatilityTermStructure(refDate, cal, bdc, dc) {}
33 
BlackVolTermStructure(Natural settlDays,const Calendar & cal,BusinessDayConvention bdc,const DayCounter & dc)34     BlackVolTermStructure::BlackVolTermStructure(Natural settlDays,
35                                                  const Calendar& cal,
36                                                  BusinessDayConvention bdc,
37                                                  const DayCounter& dc)
38     : VolatilityTermStructure(settlDays, cal, bdc, dc) {}
39 
blackForwardVol(const Date & date1,const Date & date2,Real strike,bool extrapolate) const40     Volatility BlackVolTermStructure::blackForwardVol(const Date& date1,
41                                                       const Date& date2,
42                                                       Real strike,
43                                                       bool extrapolate) const {
44         // (redundant) date-based checks
45         QL_REQUIRE(date1 <= date2,
46                    date1 << " later than " << date2);
47         checkRange(date2, extrapolate);
48 
49         // using the time implementation
50         Time time1 = timeFromReference(date1);
51         Time time2 = timeFromReference(date2);
52         return blackForwardVol(time1, time2, strike, extrapolate);
53     }
54 
blackForwardVol(Time time1,Time time2,Real strike,bool extrapolate) const55     Volatility BlackVolTermStructure::blackForwardVol(Time time1,
56                                                       Time time2,
57                                                       Real strike,
58                                                       bool extrapolate) const {
59         QL_REQUIRE(time1 <= time2,
60                    time1 << " later than " << time2);
61         checkRange(time2, extrapolate);
62         checkStrike(strike, extrapolate);
63         if (time2==time1) {
64             if (time1==0.0) {
65                 Time epsilon = 1.0e-5;
66                 Real var = blackVarianceImpl(epsilon, strike);
67                 return std::sqrt(var/epsilon);
68             } else {
69                 Time epsilon = std::min<Time>(1.0e-5, time1);
70                 Real var1 = blackVarianceImpl(time1-epsilon, strike);
71                 Real var2 = blackVarianceImpl(time1+epsilon, strike);
72                 QL_ENSURE(var2>=var1,
73                           "variances must be non-decreasing");
74                 return std::sqrt((var2-var1)/(2*epsilon));
75             }
76         } else {
77             Real var1 = blackVarianceImpl(time1, strike);
78             Real var2 = blackVarianceImpl(time2, strike);
79             QL_ENSURE(var2 >= var1,
80                       "variances must be non-decreasing");
81             return std::sqrt((var2-var1)/(time2-time1));
82         }
83     }
84 
blackForwardVariance(const Date & date1,const Date & date2,Real strike,bool extrapolate) const85     Real BlackVolTermStructure::blackForwardVariance(const Date& date1,
86                                                      const Date& date2,
87                                                      Real strike,
88                                                      bool extrapolate)
89                                                                       const {
90         // (redundant) date-based checks
91         QL_REQUIRE(date1 <= date2,
92                    date1 << " later than " << date2);
93         checkRange(date2, extrapolate);
94 
95         // using the time implementation
96         Time time1 = timeFromReference(date1);
97         Time time2 = timeFromReference(date2);
98         return blackForwardVariance(time1, time2, strike, extrapolate);
99     }
100 
blackForwardVariance(Time time1,Time time2,Real strike,bool extrapolate) const101     Real BlackVolTermStructure::blackForwardVariance(Time time1,
102                                                      Time time2,
103                                                      Real strike,
104                                                      bool extrapolate) const {
105         QL_REQUIRE(time1 <= time2,
106                    time1 << " later than " << time2);
107         checkRange(time2, extrapolate);
108         checkStrike(strike, extrapolate);
109         Real v1 = blackVarianceImpl(time1, strike);
110         Real v2 = blackVarianceImpl(time2, strike);
111         QL_ENSURE(v2 >= v1,
112                   "variances must be non-decreasing");
113         return v2-v1;
114     }
115 
BlackVolatilityTermStructure(BusinessDayConvention bdc,const DayCounter & dc)116     BlackVolatilityTermStructure::BlackVolatilityTermStructure(
117                                                     BusinessDayConvention bdc,
118                                                     const DayCounter& dc)
119     : BlackVolTermStructure(bdc, dc) {}
120 
BlackVolatilityTermStructure(const Date & refDate,const Calendar & cal,BusinessDayConvention bdc,const DayCounter & dc)121     BlackVolatilityTermStructure::BlackVolatilityTermStructure(
122                                                     const Date& refDate,
123                                                     const Calendar& cal,
124                                                     BusinessDayConvention bdc,
125                                                     const DayCounter& dc)
126     : BlackVolTermStructure(refDate, cal, bdc, dc) {}
127 
BlackVolatilityTermStructure(Natural settlementDays,const Calendar & cal,BusinessDayConvention bdc,const DayCounter & dc)128     BlackVolatilityTermStructure::BlackVolatilityTermStructure(
129                                                     Natural settlementDays,
130                                                     const Calendar& cal,
131                                                     BusinessDayConvention bdc,
132                                                     const DayCounter& dc)
133     : BlackVolTermStructure(settlementDays, cal, bdc, dc) {}
134 
BlackVarianceTermStructure(BusinessDayConvention bdc,const DayCounter & dc)135     BlackVarianceTermStructure::BlackVarianceTermStructure(
136                                                     BusinessDayConvention bdc,
137                                                     const DayCounter& dc)
138     : BlackVolTermStructure(bdc, dc) {}
139 
BlackVarianceTermStructure(const Date & refDate,const Calendar & cal,BusinessDayConvention bdc,const DayCounter & dc)140     BlackVarianceTermStructure::BlackVarianceTermStructure(
141                                                     const Date& refDate,
142                                                     const Calendar& cal,
143                                                     BusinessDayConvention bdc,
144                                                     const DayCounter& dc)
145     : BlackVolTermStructure(refDate, cal, bdc, dc) {}
146 
BlackVarianceTermStructure(Natural settlementDays,const Calendar & cal,BusinessDayConvention bdc,const DayCounter & dc)147     BlackVarianceTermStructure::BlackVarianceTermStructure(
148                                                     Natural settlementDays,
149                                                     const Calendar& cal,
150                                                     BusinessDayConvention bdc,
151                                                     const DayCounter& dc)
152     : BlackVolTermStructure(settlementDays, cal, bdc, dc) {}
153 
154 }
155