20#include <ql/exercise.hpp>
21#include <ql/pricingengines/blackcalculator.hpp>
22#include <ql/pricingengines/vanilla/analyticdividendeuropeanengine.hpp>
28 ext::shared_ptr<GeneralizedBlackScholesProcess> process,
30 : process_(
std::move(process)), dividends_(
std::move(dividends)),
31 explicitDividends_(true) {
36 ext::shared_ptr<GeneralizedBlackScholesProcess> process)
37 : process_(
std::move(process)), explicitDividends_(false) {
44 QL_DEPRECATED_DISABLE_WARNING
46 QL_DEPRECATED_ENABLE_WARNING
49 "not an European option");
51 ext::shared_ptr<StrikedTypePayoff> payoff =
52 ext::dynamic_pointer_cast<StrikedTypePayoff>(
arguments_.payoff);
53 QL_REQUIRE(payoff,
"non-striked payoff given");
55 Date settlementDate =
process_->riskFreeRate()->referenceDate();
58 for (i=0; i<dividendSchedule.size(); i++) {
59 const Date cashFlowDate = dividendSchedule[i]->date();
61 if ( cashFlowDate >= settlementDate
62 && cashFlowDate <= arguments_.exercise->lastDate()) {
64 riskless += dividendSchedule[i]->amount() *
65 process_->riskFreeRate()->discount(cashFlowDate) /
66 process_->dividendYield()->discount(cashFlowDate);
70 Real spot =
process_->stateVariable()->value() - riskless;
71 QL_REQUIRE(spot > 0.0,
72 "negative or null underlying after subtracting dividends");
79 Real forwardPrice = spot * dividendDiscount / riskFreeDiscount;
82 process_->blackVolatility()->blackVariance(
97 process_->blackVolatility()->referenceDate(),
101 Real delta_theta = 0.0, delta_rho = 0.0;
102 for (i = 0; i < dividendSchedule.size(); i++) {
103 Date d = dividendSchedule[i]->date();
105 if ( d >= settlementDate
106 && d <= arguments_.exercise->lastDate()) {
108 delta_theta -= dividendSchedule[i]->amount() *
111 process_->riskFreeRate()->discount(d) /
112 process_->dividendYield()->discount(d);
115 delta_rho += dividendSchedule[i]->amount() * t *
116 process_->riskFreeRate()->discount(t) /
117 process_->dividendYield()->discount(t);
123 delta_theta * black.
delta(spot);
129 delta_rho * black.
delta(spot);
void calculate() const override
DividendSchedule dividends_
AnalyticDividendEuropeanEngine(ext::shared_ptr< GeneralizedBlackScholesProcess > process, DividendSchedule dividends)
ext::shared_ptr< GeneralizedBlackScholesProcess > process_
Black 1976 calculator class.
virtual Real delta(Real spot) const
Real vega(Time maturity) const
virtual Real gamma(Real spot) const
virtual Real theta(Real spot, Time maturity) const
Real rho(Time maturity) const
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.
DividendSchedule cashFlow
DividendVanillaOption::results results_
DividendVanillaOption::arguments arguments_
template class providing a null value for a given type.
std::pair< iterator, bool > registerWith(const ext::shared_ptr< Observable > &)
Real Time
continuous quantity with 1-year units
Real DiscountFactor
discount factor between dates
std::size_t Size
size of a container
std::vector< ext::shared_ptr< Dividend > > DividendSchedule