/*
Copyright (C) 2007 Richard Gomes
This file is part of JQuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://jquantlib.org/
JQuantLib is free software: you can redistribute it and/or modify it
under the terms of the QuantLib license. You should have received a
copy of the license along with this program; if not, please email
. The license is also available online at
.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
JQuantLib is based on QuantLib. http://quantlib.org/
When applicable, the original copyright notice follows this notice.
*/
/*
Copyright (C) 2003 Ferdinando Ametrano
Copyright (C) 2000, 2001, 2002, 2003 RiskMap srl
This file is part of QuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://quantlib.org/
QuantLib is free software: you can redistribute it and/or modify it
under the terms of the QuantLib license. You should have received a
copy of the license along with this program; if not, please email
. The license is also available online at
.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
*/
package org.jquantlib.pricingengines.vanilla;
/**
* European option pricing engine using Monte Carlo simulation
*
* @category vanillaengines
*
* @author Richard Gomes
*/
//test the correctness of the returned value is tested by checking it against analytic results.
public class MCEuropeanEngine /*extends MCVanillaEngine<
SingleVariate extends Variate,
RNG extends RandomNumberGenerator,
S extends Statistics>*/ {
public MCEuropeanEngine() {
throw new UnsupportedOperationException("work in progress");
}
}
//template
//class MCEuropeanEngine : public MCVanillaEngine {
// public:
// typedef
// typename MCVanillaEngine::path_generator_type
// path_generator_type;
// typedef
// typename MCVanillaEngine::path_pricer_type
// path_pricer_type;
// typedef typename MCVanillaEngine::stats_type
// stats_type;
// // constructor
// MCEuropeanEngine(Size timeSteps,
// Size timeStepsPerYear,
// bool brownianBridge,
// bool antitheticVariate,
// bool controlVariate,
// Size requiredSamples,
// Real requiredTolerance,
// Size maxSamples,
// BigNatural seed);
// protected:
// boost::shared_ptr pathPricer() const;
//};
//
////! Monte Carlo European engine factory
//template
//class MakeMCEuropeanEngine {
// public:
// MakeMCEuropeanEngine();
// // named parameters
// MakeMCEuropeanEngine& withSteps(Size steps);
// MakeMCEuropeanEngine& withStepsPerYear(Size steps);
// MakeMCEuropeanEngine& withBrownianBridge(bool b = true);
// MakeMCEuropeanEngine& withSamples(Size samples);
// MakeMCEuropeanEngine& withTolerance(Real tolerance);
// MakeMCEuropeanEngine& withMaxSamples(Size samples);
// MakeMCEuropeanEngine& withSeed(BigNatural seed);
// MakeMCEuropeanEngine& withAntitheticVariate(bool b = true);
// MakeMCEuropeanEngine& withControlVariate(bool b = true);
// // conversion to pricing engine
// operator boost::shared_ptr() const;
// private:
// bool antithetic_, controlVariate_;
// Size steps_, stepsPerYear_, samples_, maxSamples_;
// Real tolerance_;
// bool brownianBridge_;
// BigNatural seed_;
//};
//
//class EuropeanPathPricer : public PathPricer {
// public:
// EuropeanPathPricer(Option::Type type,
// Real strike,
// DiscountFactor discount);
// Real operator()(const Path& path) const;
// private:
// PlainVanillaPayoff payoff_;
// DiscountFactor discount_;
//};
//
//
//// inline definitions
//
//template
//inline
//MCEuropeanEngine::MCEuropeanEngine(Size timeSteps,
// Size timeStepsPerYear,
// bool brownianBridge,
// bool antitheticVariate,
// bool controlVariate,
// Size requiredSamples,
// Real requiredTolerance,
// Size maxSamples,
// BigNatural seed)
//: MCVanillaEngine(timeSteps,
// timeStepsPerYear,
// brownianBridge,
// antitheticVariate,
// controlVariate,
// requiredSamples,
// requiredTolerance,
// maxSamples,
// seed) {}
//
//
//template
//inline
//boost::shared_ptr::path_pricer_type>
//MCEuropeanEngine::pathPricer() const {
//
// boost::shared_ptr payoff =
// boost::dynamic_pointer_cast(
// this->arguments_.payoff);
// QL_REQUIRE(payoff, "non-plain payoff given");
//
// boost::shared_ptr process =
// boost::dynamic_pointer_cast(
// this->arguments_.stochasticProcess);
// QL_REQUIRE(process, "Black-Scholes process required");
//
// return boost::shared_ptr<
// QL_TYPENAME MCEuropeanEngine::path_pricer_type>(
// new EuropeanPathPricer(
// payoff->optionType(),
// payoff->strike(),
// process->riskFreeRate()->discount(this->timeGrid().back())));
//}
//
//
//template
//inline MakeMCEuropeanEngine::MakeMCEuropeanEngine()
//: antithetic_(false), controlVariate_(false),
// steps_(Null()), stepsPerYear_(Null()),
// samples_(Null()), maxSamples_(Null()),
// tolerance_(Null()), brownianBridge_(false), seed_(0) {}
//
//template
//inline MakeMCEuropeanEngine&
//MakeMCEuropeanEngine::withSteps(Size steps) {
// steps_ = steps;
// return *this;
//}
//
//template
//inline MakeMCEuropeanEngine&
//MakeMCEuropeanEngine::withStepsPerYear(Size steps) {
// stepsPerYear_ = steps;
// return *this;
//}
//
//template
//inline MakeMCEuropeanEngine&
//MakeMCEuropeanEngine::withSamples(Size samples) {
// QL_REQUIRE(tolerance_ == Null(),
// "tolerance already set");
// samples_ = samples;
// return *this;
//}
//
//template
//inline MakeMCEuropeanEngine&
//MakeMCEuropeanEngine::withTolerance(Real tolerance) {
// QL_REQUIRE(samples_ == Null(),
// "number of samples already set");
// QL_REQUIRE(RNG::allowsErrorEstimate,
// "chosen random generator policy "
// "does not allow an error estimate");
// tolerance_ = tolerance;
// return *this;
//}
//
//template
//inline MakeMCEuropeanEngine&
//MakeMCEuropeanEngine::withMaxSamples(Size samples) {
// maxSamples_ = samples;
// return *this;
//}
//
//template
//inline MakeMCEuropeanEngine&
//MakeMCEuropeanEngine::withSeed(BigNatural seed) {
// seed_ = seed;
// return *this;
//}
//
//template
//inline MakeMCEuropeanEngine&
//MakeMCEuropeanEngine::withBrownianBridge(bool brownianBridge) {
// brownianBridge_ = brownianBridge;
// return *this;
//}
//
//template
//inline MakeMCEuropeanEngine&
//MakeMCEuropeanEngine::withAntitheticVariate(bool b) {
// antithetic_ = b;
// return *this;
//}
//
//template
//inline MakeMCEuropeanEngine&
//MakeMCEuropeanEngine::withControlVariate(bool b) {
// controlVariate_ = b;
// return *this;
//}
//
//template
//inline
//MakeMCEuropeanEngine::operator boost::shared_ptr()
// const {
// QL_REQUIRE(steps_ != Null() || stepsPerYear_ != Null(),
// "number of steps not given");
// QL_REQUIRE(steps_ == Null() || stepsPerYear_ == Null(),
// "number of steps overspecified");
// return boost::shared_ptr(new
// MCEuropeanEngine(steps_,
// stepsPerYear_,
// brownianBridge_,
// antithetic_,
// controlVariate_,
// samples_, tolerance_,
// maxSamples_,
// seed_));
//}
//
//
//
//inline EuropeanPathPricer::EuropeanPathPricer(Option::Type type,
// Real strike,
// DiscountFactor discount)
//: payoff_(type, strike), discount_(discount) {
// QL_REQUIRE(strike>=0.0,
// "strike less than zero not allowed");
//}
//
//inline Real EuropeanPathPricer::operator()(const Path& path) const {
// QL_REQUIRE(path.length() > 0, "the path cannot be empty");
// return payoff_(path.back()) * discount_;
//}
Ads help maintain this website.