20#include <ql/exercise.hpp>
21#include <ql/experimental/variancegamma/analyticvariancegammaengine.hpp>
22#include <ql/math/distributions/gammadistribution.hpp>
23#include <ql/math/integrals/gausslobattointegral.hpp>
24#include <ql/math/integrals/kronrodintegral.hpp>
25#include <ql/math/integrals/segmentintegral.hpp>
26#include <ql/pricingengines/blackscholescalculator.hpp>
35 Integrand(ext::shared_ptr<StrikedTypePayoff> payoff,
38 Real riskFreeDiscount,
39 Real dividendDiscount,
43 : payoff_(
std::move(payoff)), s0_(s0), t_(t), riskFreeDiscount_(riskFreeDiscount),
44 dividendDiscount_(dividendDiscount), sigma_(sigma), nu_(nu), theta_(theta) {
45 omega_ = std::log(1.0 - theta_ * nu_ - (sigma_ * sigma_ * nu_) / 2.0) / nu_;
49 gammaDenom_ = std::exp(gf.logValue(t_ / nu_)) * std::pow(nu_, t_ / nu_);
54 Real s0_adj = s0_ * std::exp(theta_ * x + omega_ * t_ + (sigma_ * sigma_ * x) / 2.0);
55 Real vol_adj = sigma_ * std::sqrt(x / t_);
56 vol_adj *= std::sqrt(t_);
58 BlackScholesCalculator bs(payoff_, s0_adj, dividendDiscount_, vol_adj, riskFreeDiscount_);
59 Real bsprice = bs.value();
62 Real gamp = (std::pow(x, t_ / nu_ - 1.0) * std::exp(-x / nu_)) / gammaDenom_;
63 Real result = bsprice * gamp;
68 ext::shared_ptr<StrikedTypePayoff> payoff_;
71 Real riskFreeDiscount_;
72 Real dividendDiscount_;
84 : process_(
std::move(process)), absErr_(absoluteError) {
85 QL_REQUIRE(
absErr_ > 0,
"absolute error must be positive");
92 "not an European Option");
94 ext::shared_ptr<StrikedTypePayoff> payoff =
96 QL_REQUIRE(payoff,
"non-striked payoff given");
110 t, riskFreeDiscount, dividendDiscount,
115 Real val = f(infinity);
116 while (std::abs(val)>target){
123 Real pvA = integrator1(f, 0, split);
125 Real pvB = integrator2(f, split, infinity);
Time yearFraction(const Date &, const Date &, const Date &refPeriodStart=Date(), const Date &refPeriodEnd=Date()) const
Returns the period between two dates as a fraction of year.
Integral of a 1-dimensional function using the Gauss-Kronrod methods.
Integral of a one-dimensional function.
OneAssetOption::results results_
OneAssetOption::arguments arguments_
std::pair< iterator, bool > registerWith(const ext::shared_ptr< Observable > &)
ext::shared_ptr< Exercise > exercise
ext::shared_ptr< Payoff > payoff
ext::shared_ptr< VarianceGammaProcess > process_
VarianceGammaEngine(ext::shared_ptr< VarianceGammaProcess >, Real absoluteError=1e-5)
void calculate() const override
Real Time
continuous quantity with 1-year units
Real DiscountFactor
discount factor between dates