20#include <ql/exercise.hpp>
21#include <ql/experimental/finitedifferences/fdornsteinuhlenbeckvanillaengine.hpp>
22#include <ql/methods/finitedifferences/meshers/fdmmeshercomposite.hpp>
23#include <ql/methods/finitedifferences/meshers/fdmsimpleprocess1dmesher.hpp>
24#include <ql/methods/finitedifferences/operators/fdmlinearoplayout.hpp>
25#include <ql/methods/finitedifferences/operators/fdmornsteinuhlenbeckop.hpp>
26#include <ql/methods/finitedifferences/solvers/fdm1dimsolver.hpp>
27#include <ql/methods/finitedifferences/stepconditions/fdmstepconditioncomposite.hpp>
28#include <ql/methods/finitedifferences/utilities/fdminnervaluecalculator.hpp>
29#include <ql/processes/ornsteinuhlenbeckprocess.hpp>
30#include <ql/termstructures/yieldtermstructure.hpp>
36 class FdmOUInnerValue :
public FdmInnerValueCalculator {
38 FdmOUInnerValue(ext::shared_ptr<Payoff> payoff,
39 ext::shared_ptr<FdmMesher> mesher,
41 : payoff_(
std::move(payoff)), mesher_(
std::move(mesher)), direction_(direction) {}
44 Real innerValue(
const FdmLinearOpIterator& iter,
Time)
override {
45 const Real s = mesher_->location(iter, direction_);
49 Real avgInnerValue(
const FdmLinearOpIterator& iter,
Time t)
override {
50 return innerValue(iter, t);
54 const ext::shared_ptr<Payoff> payoff_;
55 const ext::shared_ptr<FdmMesher> mesher_;
56 const Size direction_;
61 ext::shared_ptr<OrnsteinUhlenbeckProcess> process,
62 const ext::shared_ptr<YieldTermStructure>& rTS,
68 : process_(
std::move(process)), rTS_(rTS), explicitDividends_(false),
69 tGrid_(tGrid), xGrid_(xGrid),
70 dampingSteps_(dampingSteps), epsilon_(epsilon), schemeDesc_(schemeDesc) {
76 ext::shared_ptr<OrnsteinUhlenbeckProcess> process,
77 const ext::shared_ptr<YieldTermStructure>& rTS,
84 : process_(
std::move(process)), rTS_(rTS),
85 dividends_(
std::move(dividends)), explicitDividends_(true),
86 tGrid_(tGrid), xGrid_(xGrid),
87 dampingSteps_(dampingSteps), epsilon_(epsilon), schemeDesc_(schemeDesc) {
95 QL_DEPRECATED_DISABLE_WARNING
97 QL_DEPRECATED_ENABLE_WARNING
100 const ext::shared_ptr<StrikedTypePayoff> payoff =
101 ext::dynamic_pointer_cast<StrikedTypePayoff>(
arguments_.payoff);
104 const Date referenceDate =
rTS_->referenceDate();
107 referenceDate,
arguments_.exercise->lastDate());
109 const ext::shared_ptr<Fdm1dMesher> equityMesher(
113 const ext::shared_ptr<FdmMesher> mesher (
117 const ext::shared_ptr<FdmInnerValueCalculator> calculator(
118 new FdmOUInnerValue(payoff, mesher, 0));
121 const ext::shared_ptr<FdmStepConditionComposite> conditions =
131 FdmSolverDesc solverDesc = { mesher, boundaries, conditions, calculator,
134 const ext::shared_ptr<FdmOrnsteinUhlenbeckOp> op(
137 const ext::shared_ptr<Fdm1DimSolver> solver(
143 results_.delta = solver->derivativeX(spot);
144 results_.gamma = solver->derivativeXX(spot);
145 results_.theta = solver->thetaAt(spot);
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
FdOrnsteinUhlenbeckVanillaEngine(ext::shared_ptr< OrnsteinUhlenbeckProcess >, const ext::shared_ptr< YieldTermStructure > &rTS, Size tGrid=100, Size xGrid=100, Size dampingSteps=0, Real epsilon=0.0001, const FdmSchemeDesc &schemeDesc=FdmSchemeDesc::Douglas())
void calculate() const override
const ext::shared_ptr< YieldTermStructure > rTS_
DividendSchedule dividends_
const ext::shared_ptr< OrnsteinUhlenbeckProcess > process_
const FdmSchemeDesc schemeDesc_
static ext::shared_ptr< FdmStepConditionComposite > vanillaComposite(const DividendSchedule &schedule, const ext::shared_ptr< Exercise > &exercise, const ext::shared_ptr< FdmMesher > &mesher, const ext::shared_ptr< FdmInnerValueCalculator > &calculator, const Date &refDate, const DayCounter &dayCounter)
DividendVanillaOption::results results_
DividendVanillaOption::arguments arguments_
std::pair< iterator, bool > registerWith(const ext::shared_ptr< Observable > &)
Real Time
continuous quantity with 1-year units
std::size_t Size
size of a container
std::vector< ext::shared_ptr< Dividend > > DividendSchedule
OperatorTraits< FdmLinearOp >::bc_set FdmBoundaryConditionSet