21#include <ql/pricingengines/vanilla/batesengine.hpp>
22#include <ql/instruments/payoffs.hpp>
27 Size integrationOrder)
31 Real relTolerance,
Size maxEvaluations)
37 ext::shared_ptr<BatesModel> batesModel =
38 ext::dynamic_pointer_cast<BatesModel>(*
model_);
40 const Real nu_ = batesModel->nu();
41 const Real delta2_ = 0.5*batesModel->delta()*batesModel->delta();
42 const Real lambda_ = batesModel->lambda();
43 const Real i = (j == 1)? 1.0 : 0.0;
44 const std::complex<Real> g(i, phi);
47 return t*lambda_*(std::exp(nu_*g + delta2_*g*g) - 1.0
48 -g*(std::exp(nu_+delta2_) - 1.0));
53 const ext::shared_ptr<BatesDetJumpModel>& model,
54 Size integrationOrder)
58 const ext::shared_ptr<BatesDetJumpModel>& model,
59 Real relTolerance,
Size maxEvaluations)
60 :
BatesEngine(model, relTolerance, maxEvaluations) { }
65 const std::complex<Real> l =
68 ext::shared_ptr<BatesDetJumpModel> batesDetJumpModel =
69 ext::dynamic_pointer_cast<BatesDetJumpModel>(*
model_);
71 const Real lambda = batesDetJumpModel->lambda();
72 const Real kappaLambda = batesDetJumpModel->kappaLambda();
73 const Real thetaLambda = batesDetJumpModel->thetaLambda();
75 return (kappaLambda*t - 1.0 + std::exp(-kappaLambda*t))
76 * thetaLambda*l/(kappaLambda*t*lambda)
77 + (1.0 - std::exp(-kappaLambda*t))*l/(kappaLambda*t);
82 const ext::shared_ptr<BatesDoubleExpModel> & model,
83 Size integrationOrder)
87 const ext::shared_ptr<BatesDoubleExpModel>& model,
88 Real relTolerance,
Size maxEvaluations)
93 ext::shared_ptr<BatesDoubleExpModel> batesDoubleExpModel =
94 ext::dynamic_pointer_cast<BatesDoubleExpModel>(*
model_);
96 const Real p_ = batesDoubleExpModel->p();
97 const Real q_ = 1.0-p_;
98 const Real nuDown_= batesDoubleExpModel->nuDown();
99 const Real nuUp_ = batesDoubleExpModel->nuUp();
100 const Real lambda_= batesDoubleExpModel->lambda();
101 const Real i = (j == 1)? 1.0 : 0.0;
102 const std::complex<Real> g(i, phi);
104 return t*lambda_*(p_/(1.0-g*nuUp_) + q_/(1.0+g*nuDown_) - 1.0
105 - g*(p_/(1-nuUp_) + q_/(1+nuDown_)-1));
109 const ext::shared_ptr<BatesDoubleExpDetJumpModel> & model,
110 Size integrationOrder)
114 const ext::shared_ptr<BatesDoubleExpDetJumpModel>& model,
115 Real relTolerance,
Size maxEvaluations)
120 const std::complex<Real> l =
123 ext::shared_ptr<BatesDoubleExpDetJumpModel> doubleExpDetJumpModel
124 = ext::dynamic_pointer_cast<BatesDoubleExpDetJumpModel>(*
model_);
126 const Real lambda = doubleExpDetJumpModel->lambda();
127 const Real kappaLambda = doubleExpDetJumpModel->kappaLambda();
128 const Real thetaLambda = doubleExpDetJumpModel->thetaLambda();
130 return (kappaLambda*t - 1.0 + std::exp(-kappaLambda*t))
131 * thetaLambda*l/(kappaLambda*t*lambda)
132 + (1.0 - std::exp(-kappaLambda*t))*l/(kappaLambda*t);
analytic Heston-model engine based on Fourier transform
std::complex< Real > addOnTerm(Real phi, Time t, Size j) const override
BatesDetJumpEngine(const ext::shared_ptr< BatesDetJumpModel > &model, Size integrationOrder=144)
BatesDoubleExpDetJumpEngine(const ext::shared_ptr< BatesDoubleExpDetJumpModel > &model, Size integrationOrder=144)
std::complex< Real > addOnTerm(Real phi, Time t, Size j) const override
BatesDoubleExpEngine(const ext::shared_ptr< BatesDoubleExpModel > &model, Size integrationOrder=144)
std::complex< Real > addOnTerm(Real phi, Time t, Size j) const override
Bates model engines based on Fourier transform.
std::complex< Real > addOnTerm(Real phi, Time t, Size j) const override
BatesEngine(const ext::shared_ptr< BatesModel > &model, Size integrationOrder=144)
Handle< HestonModel > model_
Real Time
continuous quantity with 1-year units
std::size_t Size
size of a container