1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 
3 /*
4  Copyright (C) 2014 Fabien Le Floc'h
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 /*! \file analytichestonengine.hpp
21     \brief analytic Heston expansion engine
22 */
23 
24 #ifndef quantlib_heston_expansion_engine_hpp
25 #define quantlib_heston_expansion_engine_hpp
26 
27 #include <ql/pricingengines/genericmodelengine.hpp>
28 #include <ql/models/equity/hestonmodel.hpp>
29 #include <ql/instruments/vanillaoption.hpp>
30 
31 namespace QuantLib {
32 
33     //! Heston-model engine for European options based on analytic expansions
34     /*! References:
35 
36         M Forde, A Jacquier, R Lee, The small-time smile and term
37         structure of implied volatility under the Heston model
38         SIAM Journal on Financial Mathematics, 2012 - SIAM
39 
40         M Lorig, S Pagliarani, A Pascucci, Explicit implied vols for
41         multifactor local-stochastic vol models
42         arXiv preprint arXiv:1306.5447v3, 2014 - arxiv.org
43 
44         \ingroup vanillaengines
45     */
46     class HestonExpansionEngine
47         : public GenericModelEngine<HestonModel,
48                                     VanillaOption::arguments,
49                                     VanillaOption::results> {
50       public:
51         enum HestonExpansionFormula { LPP2, LPP3, Forde };
52 
53         HestonExpansionEngine(const ext::shared_ptr<HestonModel>& model,
54                               HestonExpansionFormula formula);
55 
56         void calculate() const;
57 
58       private:
59         const HestonExpansionFormula formula_;
60     };
61 
62     /*! Interface to represent some Heston expansion formula.
63         During calibration, it would typically be initialized once per
64         implied volatility surface slice, then calls for each surface
65         strike to impliedVolatility(strike, forward) would be
66         performed.
67     */
68     class HestonExpansion {
69       public:
~HestonExpansion()70         virtual ~HestonExpansion() {}
71         virtual Real impliedVolatility(Real strike, Real forward) const = 0;
72     };
73 
74     /*! Lorig Pagliarani Pascucci expansion of order-2 for the Heston model.
75         During calibration, it can be initialized once per expiry, and
76         called many times with different strikes.  The formula is also
77         available in the Mathematica notebook from the authors at
78         http://explicitsolutions.wordpress.com/
79     */
80     class LPP2HestonExpansion : public HestonExpansion {
81       public:
82         LPP2HestonExpansion(Real kappa, Real theta, Real sigma, Real v0, Real rho, Real term);
83         virtual Real impliedVolatility(Real strike, Real forward) const;
84 
85       private:
86         Real coeffs[3];
87         Real ekt, e2kt, e3kt, e4kt;
88         Real z0(Real t, Real kappa, Real theta,
89                 Real delta, Real y, Real rho) const;
90         Real z1(Real t, Real kappa, Real theta,
91                 Real delta, Real y, Real rho) const;
92         Real z2(Real t, Real kappa, Real theta,
93                 Real delta, Real y, Real rho) const;
94     };
95 
96     /*! Lorig Pagliarani Pascucci expansion of order-3 for the Heston model.
97         During calibration, it can be initialized once per expiry, and
98         called many times with different strikes.  The formula is also
99         available in the Mathematica notebook from the authors at
100         http://explicitsolutions.wordpress.com/
101     */
102     class LPP3HestonExpansion : public HestonExpansion{
103       public:
104         LPP3HestonExpansion(Real kappa, Real theta, Real sigma, Real v0, Real rho, Real term);
105         virtual Real impliedVolatility(Real strike, Real forward) const;
106 
107       private:
108         Real coeffs[4];
109         Real ekt, e2kt, e3kt, e4kt;
110         Real z0(Real t, Real kappa, Real theta,
111                 Real delta, Real y, Real rho) const;
112         Real z1(Real t, Real kappa, Real theta,
113                 Real delta, Real y, Real rho) const;
114         Real z2(Real t, Real kappa, Real theta,
115                 Real delta, Real y, Real rho) const;
116         Real z3(Real t, Real kappa, Real theta,
117                 Real delta, Real y, Real rho) const;
118     };
119 
120     /*! Small-time expansion from
121         "The small-time smile and term structure of implied volatility
122         under the Heston model" M Forde, A Jacquier, R Lee - SIAM
123         Journal on Financial Mathematics, 2012 - SIAM
124     */
125     class FordeHestonExpansion : public HestonExpansion {
126       public:
127         FordeHestonExpansion(Real kappa, Real theta, Real sigma, Real v0, Real rho, Real term);
128         virtual Real impliedVolatility(Real strike, Real forward) const;
129 
130       private:
131         Real coeffs[5];
132     };
133 
134 }
135 
136 
137 #endif
138