1 | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | |
3 | /* |
4 | Copyright (C) 2001, 2002, 2003 Sadruddin Rejeb |
5 | Copyright (C) 2003, 2004, 2005, 2006, 2008 Ferdinando Ametrano |
6 | Copyright (C) 2006 Mark Joshi |
7 | Copyright (C) 2006 StatPro Italia srl |
8 | Copyright (C) 2007 Cristina Duminuco |
9 | Copyright (C) 2007 Chiara Fornarola |
10 | Copyright (C) 2013 Gary Kennedy |
11 | Copyright (C) 2015 Peter Caspers |
12 | Copyright (C) 2017 Klaus Spanderen |
13 | Copyright (C) 2019 Wojciech Ślusarski |
14 | Copyright (C) 2020 Marcin Rybacki |
15 | |
16 | This file is part of QuantLib, a free-software/open-source library |
17 | for financial quantitative analysts and developers - http://quantlib.org/ |
18 | |
19 | QuantLib is free software: you can redistribute it and/or modify it |
20 | under the terms of the QuantLib license. You should have received a |
21 | copy of the license along with this program; if not, please email |
22 | <quantlib-dev@lists.sf.net>. The license is also available online at |
23 | <http://quantlib.org/license.shtml>. |
24 | |
25 | This program is distributed in the hope that it will be useful, but WITHOUT |
26 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
27 | FOR A PARTICULAR PURPOSE. See the license for more details. |
28 | */ |
29 | |
30 | /*! \file blackformula.hpp |
31 | \brief Black formula |
32 | */ |
33 | |
34 | #ifndef quantlib_blackformula_hpp |
35 | #define quantlib_blackformula_hpp |
36 | |
37 | #include <ql/instruments/payoffs.hpp> |
38 | #include <ql/option.hpp> |
39 | |
40 | namespace QuantLib { |
41 | |
42 | /*! Black 1976 formula |
43 | \warning instead of volatility it uses standard deviation, |
44 | i.e. volatility*sqrt(timeToMaturity) |
45 | */ |
46 | Real blackFormula(Option::Type optionType, |
47 | Real strike, |
48 | Real forward, |
49 | Real stdDev, |
50 | Real discount = 1.0, |
51 | Real displacement = 0.0); |
52 | |
53 | /*! Black 1976 formula |
54 | \warning instead of volatility it uses standard deviation, |
55 | i.e. volatility*sqrt(timeToMaturity) |
56 | */ |
57 | Real blackFormula(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
58 | Real forward, |
59 | Real stdDev, |
60 | Real discount = 1.0, |
61 | Real displacement = 0.0); |
62 | |
63 | /*! Black 1976 model forward derivative |
64 | \warning instead of volatility it uses standard deviation, |
65 | i.e. volatility*sqrt(timeToMaturity) |
66 | */ |
67 | Real blackFormulaForwardDerivative(Option::Type optionType, |
68 | Real strike, |
69 | Real forward, |
70 | Real stdDev, |
71 | Real discount = 1.0, |
72 | Real displacement = 0.0); |
73 | |
74 | /*! Black 1976 model forward derivative |
75 | \warning instead of volatility it uses standard deviation, |
76 | i.e. volatility*sqrt(timeToMaturity) |
77 | */ |
78 | Real blackFormulaForwardDerivative(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
79 | Real forward, |
80 | Real stdDev, |
81 | Real discount = 1.0, |
82 | Real displacement = 0.0); |
83 | |
84 | /*! Approximated Black 1976 implied standard deviation, |
85 | i.e. volatility*sqrt(timeToMaturity). |
86 | |
87 | It is calculated using Brenner and Subrahmanyan (1988) and Feinstein |
88 | (1988) approximation for at-the-money forward option, with the |
89 | extended moneyness approximation by Corrado and Miller (1996) |
90 | */ |
91 | Real blackFormulaImpliedStdDevApproximation(Option::Type optionType, |
92 | Real strike, |
93 | Real forward, |
94 | Real blackPrice, |
95 | Real discount = 1.0, |
96 | Real displacement = 0.0); |
97 | |
98 | /*! Approximated Black 1976 implied standard deviation, |
99 | i.e. volatility*sqrt(timeToMaturity). |
100 | |
101 | It is calculated using Brenner and Subrahmanyan (1988) and Feinstein |
102 | (1988) approximation for at-the-money forward option, with the |
103 | extended moneyness approximation by Corrado and Miller (1996) |
104 | */ |
105 | Real blackFormulaImpliedStdDevApproximation(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
106 | Real forward, |
107 | Real blackPrice, |
108 | Real discount = 1.0, |
109 | Real displacement = 0.0); |
110 | |
111 | /*! Approximated Black 1976 implied standard deviation, |
112 | i.e. volatility*sqrt(timeToMaturity). |
113 | |
114 | It is calculated following "An improved approach to computing |
115 | implied volatility", Chambers, Nawalkha, The Financial Review, |
116 | 2001, 89-100. The atm option price must be known to use this |
117 | method. |
118 | */ |
119 | Real blackFormulaImpliedStdDevChambers(Option::Type optionType, |
120 | Real strike, |
121 | Real forward, |
122 | Real blackPrice, |
123 | Real blackAtmPrice, |
124 | Real discount = 1.0, |
125 | Real displacement = 0.0); |
126 | |
127 | /*! Approximated Black 1976 implied standard deviation, |
128 | i.e. volatility*sqrt(timeToMaturity). |
129 | |
130 | It is calculated following "An improved approach to computing |
131 | implied volatility", Chambers, Nawalkha, The Financial Review, |
132 | 2001, 89-100. The atm option price must be known to use this |
133 | method. |
134 | */ |
135 | Real blackFormulaImpliedStdDevChambers(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
136 | Real forward, |
137 | Real blackPrice, |
138 | Real blackAtmPrice, |
139 | Real discount = 1.0, |
140 | Real displacement = 0.0); |
141 | |
142 | /*! Approximated Black 1976 implied standard deviation, |
143 | i.e. volatility*sqrt(timeToMaturity). |
144 | |
145 | It is calculated using |
146 | |
147 | "An Explicit Implicit Volatility Formula" |
148 | R. Radoicic, D. Stefanica, |
149 | https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2908494 |
150 | |
151 | "Tighter Bounds for Implied Volatility", |
152 | J. Gatheral, I. Matic, R. Radoicic, D. Stefanica |
153 | https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2922742 |
154 | */ |
155 | Real blackFormulaImpliedStdDevApproximationRS(Option::Type optionType, |
156 | Real strike, |
157 | Real forward, |
158 | Real blackPrice, |
159 | Real discount = 1.0, |
160 | Real displacement = 0.0); |
161 | |
162 | Real blackFormulaImpliedStdDevApproximationRS(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
163 | Real forward, |
164 | Real blackPrice, |
165 | Real discount = 1.0, |
166 | Real displacement = 0.0); |
167 | |
168 | |
169 | /*! Black 1976 implied standard deviation, |
170 | i.e. volatility*sqrt(timeToMaturity) |
171 | */ |
172 | Real blackFormulaImpliedStdDev(Option::Type optionType, |
173 | Real strike, |
174 | Real forward, |
175 | Real blackPrice, |
176 | Real discount = 1.0, |
177 | Real displacement = 0.0, |
178 | Real guess = Null<Real>(), |
179 | Real accuracy = 1.0e-6, |
180 | Natural maxIterations = 100); |
181 | |
182 | /*! Black 1976 implied standard deviation, |
183 | i.e. volatility*sqrt(timeToMaturity) |
184 | */ |
185 | Real blackFormulaImpliedStdDev(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
186 | Real forward, |
187 | Real blackPrice, |
188 | Real discount = 1.0, |
189 | Real displacement = 0.0, |
190 | Real guess = Null<Real>(), |
191 | Real accuracy = 1.0e-6, |
192 | Natural maxIterations = 100); |
193 | |
194 | /*! Black 1976 implied standard deviation, |
195 | i.e. volatility*sqrt(timeToMaturity) |
196 | |
197 | "An Adaptive Successive Over-relaxation Method for Computing the |
198 | Black-Scholes Implied Volatility" |
199 | M. Li, http://mpra.ub.uni-muenchen.de/6867/ |
200 | |
201 | |
202 | Starting point of the iteration is calculated based on |
203 | |
204 | "An Explicit Implicit Volatility Formula" |
205 | R. Radoicic, D. Stefanica, |
206 | https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2908494 |
207 | */ |
208 | Real blackFormulaImpliedStdDevLiRS(Option::Type optionType, |
209 | Real strike, |
210 | Real forward, |
211 | Real blackPrice, |
212 | Real discount = 1.0, |
213 | Real displacement = 0.0, |
214 | Real guess = Null<Real>(), |
215 | Real omega = 1.0, |
216 | Real accuracy = 1.0e-6, |
217 | Natural maxIterations = 100); |
218 | |
219 | Real blackFormulaImpliedStdDevLiRS(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
220 | Real forward, |
221 | Real blackPrice, |
222 | Real discount = 1.0, |
223 | Real displacement = 0.0, |
224 | Real guess = Null<Real>(), |
225 | Real omega = 1.0, |
226 | Real accuracy = 1.0e-6, |
227 | Natural maxIterations = 100); |
228 | |
229 | /*! Black 1976 probability of being in the money (in the bond martingale |
230 | measure), i.e. N(d2). |
231 | It is a risk-neutral probability, not the real world one. |
232 | \warning instead of volatility it uses standard deviation, |
233 | i.e. volatility*sqrt(timeToMaturity) |
234 | */ |
235 | Real blackFormulaCashItmProbability( |
236 | Option::Type optionType, Real strike, Real forward, Real stdDev, Real displacement = 0.0); |
237 | |
238 | /*! Black 1976 probability of being in the money (in the bond martingale |
239 | measure), i.e. N(d2). |
240 | It is a risk-neutral probability, not the real world one. |
241 | \warning instead of volatility it uses standard deviation, |
242 | i.e. volatility*sqrt(timeToMaturity) |
243 | */ |
244 | Real blackFormulaCashItmProbability(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
245 | Real forward, |
246 | Real stdDev, |
247 | Real displacement = 0.0); |
248 | |
249 | /*! Black 1976 probability of being in the money in the asset martingale |
250 | measure, i.e. N(d1). |
251 | It is a risk-neutral probability, not the real world one. |
252 | */ |
253 | Real blackFormulaAssetItmProbability( |
254 | Option::Type optionType, Real strike, Real forward, Real stdDev, Real displacement = 0.0); |
255 | |
256 | /*! Black 1976 probability of being in the money in the asset martingale |
257 | measure, i.e. N(d1). |
258 | It is a risk-neutral probability, not the real world one. |
259 | */ |
260 | Real blackFormulaAssetItmProbability(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
261 | Real forward, |
262 | Real stdDev, |
263 | Real displacement = 0.0); |
264 | |
265 | /*! Black 1976 formula for standard deviation derivative |
266 | \warning instead of volatility it uses standard deviation, i.e. |
267 | volatility*sqrt(timeToMaturity), and it returns the |
268 | derivative with respect to the standard deviation. |
269 | If T is the time to maturity Black vega would be |
270 | blackStdDevDerivative(strike, forward, stdDev)*sqrt(T) |
271 | */ |
272 | Real blackFormulaStdDevDerivative( |
273 | Real strike, Real forward, Real stdDev, Real discount = 1.0, Real displacement = 0.0); |
274 | |
275 | /*! Black 1976 formula for derivative with respect to implied vol, this |
276 | is basically the vega, but if you want 1% change multiply by 1% |
277 | */ |
278 | Real blackFormulaVolDerivative(Real strike, |
279 | Real forward, |
280 | Real stdDev, |
281 | Real expiry, |
282 | Real discount = 1.0, |
283 | Real displacement = 0.0); |
284 | |
285 | |
286 | /*! Black 1976 formula for standard deviation derivative |
287 | \warning instead of volatility it uses standard deviation, i.e. |
288 | volatility*sqrt(timeToMaturity), and it returns the |
289 | derivative with respect to the standard deviation. |
290 | If T is the time to maturity Black vega would be |
291 | blackStdDevDerivative(strike, forward, stdDev)*sqrt(T) |
292 | */ |
293 | Real blackFormulaStdDevDerivative(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
294 | Real forward, |
295 | Real stdDev, |
296 | Real discount = 1.0, |
297 | Real displacement = 0.0); |
298 | |
299 | /*! Black 1976 formula for second derivative by standard deviation |
300 | \warning instead of volatility it uses standard deviation, i.e. |
301 | volatility*sqrt(timeToMaturity), and it returns the |
302 | derivative with respect to the standard deviation. |
303 | */ |
304 | Real blackFormulaStdDevSecondDerivative( |
305 | Rate strike, Rate forward, Real stdDev, Real discount, Real displacement); |
306 | |
307 | /*! Black 1976 formula for second derivative by standard deviation |
308 | \warning instead of volatility it uses standard deviation, i.e. |
309 | volatility*sqrt(timeToMaturity), and it returns the |
310 | derivative with respect to the standard deviation. |
311 | */ |
312 | Real blackFormulaStdDevSecondDerivative(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
313 | Real forward, |
314 | Real stdDev, |
315 | Real discount = 1.0, |
316 | Real displacement = 0.0); |
317 | |
318 | /*! Black style formula when forward is normal rather than |
319 | log-normal. This is essentially the model of Bachelier. |
320 | |
321 | \warning Bachelier model needs absolute volatility, not |
322 | percentage volatility. Standard deviation is |
323 | absoluteVolatility*sqrt(timeToMaturity) |
324 | */ |
325 | Real bachelierBlackFormula( |
326 | Option::Type optionType, Real strike, Real forward, Real stdDev, Real discount = 1.0); |
327 | |
328 | /*! Black style formula when forward is normal rather than |
329 | log-normal. This is essentially the model of Bachelier. |
330 | |
331 | \warning Bachelier model needs absolute volatility, not |
332 | percentage volatility. Standard deviation is |
333 | absoluteVolatility*sqrt(timeToMaturity) |
334 | */ |
335 | Real bachelierBlackFormula(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
336 | Real forward, |
337 | Real stdDev, |
338 | Real discount = 1.0); |
339 | |
340 | /*! Bachelier Black model forward derivative. |
341 | |
342 | \warning Bachelier model needs absolute volatility, not |
343 | percentage volatility. Standard deviation is |
344 | absoluteVolatility*sqrt(timeToMaturity) |
345 | */ |
346 | Real bachelierBlackFormulaForwardDerivative( |
347 | Option::Type optionType, Real strike, Real forward, Real stdDev, Real discount = 1.0); |
348 | |
349 | /*! Bachelier Black model forward derivative. |
350 | |
351 | \warning Bachelier model needs absolute volatility, not |
352 | percentage volatility. Standard deviation is |
353 | absoluteVolatility*sqrt(timeToMaturity) |
354 | */ |
355 | Real bachelierBlackFormulaForwardDerivative( |
356 | const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
357 | Real forward, |
358 | Real stdDev, |
359 | Real discount = 1.0); |
360 | |
361 | /*! Approximated Bachelier implied volatility |
362 | |
363 | It is calculated using the analytic implied volatility approximation |
364 | of J. Choi, K Kim and M. Kwak (2009), “Numerical Approximation of the |
365 | Implied Volatility Under Arithmetic Brownian Motion”, |
366 | Applied Math. Finance, 16(3), pp. 261-268. |
367 | */ |
368 | Real bachelierBlackFormulaImpliedVol(Option::Type optionType, |
369 | Real strike, |
370 | Real forward, |
371 | Real tte, |
372 | Real bachelierPrice, |
373 | Real discount = 1.0); |
374 | |
375 | /*! Bachelier formula for standard deviation derivative |
376 | \warning instead of volatility it uses standard deviation, i.e. |
377 | volatility*sqrt(timeToMaturity), and it returns the |
378 | derivative with respect to the standard deviation. |
379 | If T is the time to maturity Black vega would be |
380 | blackStdDevDerivative(strike, forward, stdDev)*sqrt(T) |
381 | */ |
382 | |
383 | Real bachelierBlackFormulaStdDevDerivative(Real strike, |
384 | Real forward, |
385 | Real stdDev, |
386 | Real discount = 1.0); |
387 | |
388 | Real bachelierBlackFormulaStdDevDerivative(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
389 | Real forward, |
390 | Real stdDev, |
391 | Real discount = 1.0); |
392 | |
393 | /*! Bachelier formula for probability of being in the money in the asset martingale |
394 | measure, i.e. N(d). |
395 | It is a risk-neutral probability, not the real world one. |
396 | */ |
397 | Real bachelierBlackFormulaAssetItmProbability(Option::Type optionType, |
398 | Real strike, |
399 | Real forward, |
400 | Real stdDev); |
401 | |
402 | /*! Bachelier formula for of being in the money in the asset martingale |
403 | measure, i.e. N(d). |
404 | It is a risk-neutral probability, not the real world one. |
405 | */ |
406 | Real bachelierBlackFormulaAssetItmProbability(const ext::shared_ptr<PlainVanillaPayoff>& payoff, |
407 | Real forward, |
408 | Real stdDev); |
409 | |
410 | } |
411 | |
412 | #endif |
413 | |