24#include <ql/methods/finitedifferences/meshers/fdmblackscholesmesher.hpp>
25#include <ql/methods/finitedifferences/meshers/fdmmeshercomposite.hpp>
26#include <ql/methods/finitedifferences/meshers/uniform1dmesher.hpp>
27#include <ql/methods/finitedifferences/operators/fdmlinearoplayout.hpp>
28#include <ql/methods/finitedifferences/solvers/fdmsimple2dbssolver.hpp>
29#include <ql/methods/finitedifferences/stepconditions/fdmsimpleswingcondition.hpp>
30#include <ql/methods/finitedifferences/stepconditions/fdmstepconditioncomposite.hpp>
31#include <ql/methods/finitedifferences/utilities/fdminnervaluecalculator.hpp>
32#include <ql/pricingengines/vanilla/fdsimplebsswingengine.hpp>
33#include <ql/processes/blackscholesprocess.hpp>
39 ext::shared_ptr<GeneralizedBlackScholesProcess> process,
43 : process_(
std::move(process)), tGrid_(tGrid), xGrid_(xGrid), schemeDesc_(schemeDesc) {}
47 "Bermudan exercise supported only");
50 const ext::shared_ptr<StrikedTypePayoff> payoff =
52 QL_REQUIRE(payoff,
"Strike type payoff expected");
55 const ext::shared_ptr<Fdm1dMesher> equityMesher(
57 maturity, payoff->strike()));
59 const ext::shared_ptr<Fdm1dMesher> exerciseMesher(
64 const ext::shared_ptr<FdmMesher> mesher (
68 ext::shared_ptr<FdmInnerValueCalculator> calculator(
72 std::list<ext::shared_ptr<StepCondition<Array> > > stepConditions;
73 std::list<std::vector<Time> > stoppingTimes;
76 std::vector<Time> exerciseTimes;
79 QL_REQUIRE(t >= 0,
"exercise dates must not contain past date");
80 exerciseTimes.push_back(t);
82 stoppingTimes.push_back(exerciseTimes);
84 ext::shared_ptr<FdmInnerValueCalculator> exerciseCalculator(
89 exerciseTimes, mesher, exerciseCalculator,
92 ext::shared_ptr<FdmStepConditionComposite> conditions(
100 calculator, maturity,
tGrid_, 0 };
101 ext::shared_ptr<FdmSimple2dBSSolver> solver(
109 results_.delta = solver->deltaAt(spot, 1, spot*0.01);
110 results_.gamma = solver->gammaAt(spot, 1, spot*0.01);
111 results_.theta = solver->thetaAt(spot, 1);
FdSimpleBSSwingEngine(ext::shared_ptr< GeneralizedBlackScholesProcess > p, Size tGrid=50, Size xGrid=100, const FdmSchemeDesc &schemeDesc=FdmSchemeDesc::Douglas())
void calculate() const override
const ext::shared_ptr< GeneralizedBlackScholesProcess > process_
const FdmSchemeDesc schemeDesc_
VanillaSwingOption::results results_
VanillaSwingOption::arguments arguments_
Shared handle to an observable.
condition to be applied at every time step
ext::shared_ptr< SwingExercise > exercise
ext::shared_ptr< StrikedTypePayoff > payoff
Real Time
continuous quantity with 1-year units
std::size_t Size
size of a container
OperatorTraits< FdmLinearOp >::bc_set FdmBoundaryConditionSet