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