/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* Copyright (C) 2003 Ferdinando Ametrano Copyright (C) 2001, 2002, 2003 Sadruddin Rejeb Copyright (C) 2005 StatPro Italia 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. */ /*! \file binomialtree.hpp \brief Binomial tree class */ #ifndef quantlib_binomial_tree_hpp #define quantlib_binomial_tree_hpp #include #include #include #include namespace QuantLib { //! Binomial tree base class /*! \ingroup lattices */ template class BinomialTree : public Tree { public: enum Branches { branches = 2 }; BinomialTree(const boost::shared_ptr& process, Time end, Size steps) : Tree(steps+1) { x0_ = process->x0(); dt_ = end/steps; driftPerStep_ = process->drift(0.0, x0_) * dt_; } Size size(Size i) const { return i+1; } Size descendant(Size, Size index, Size branch) const { return index + branch; } protected: Real x0_, driftPerStep_; Time dt_; }; //! Base class for equal probabilities binomial tree /*! \ingroup lattices */ template class EqualProbabilitiesBinomialTree : public BinomialTree { public: EqualProbabilitiesBinomialTree( const boost::shared_ptr& process, Time end, Size steps) : BinomialTree(process, end, steps) {} Real underlying(Size i, Size index) const { BigInteger j = 2*BigInteger(index) - BigInteger(i); // exploiting the forward value tree centering return this->x0_*std::exp(i*this->driftPerStep_ + j*this->up_); } Real probability(Size, Size, Size) const { return 0.5; } protected: Real up_; }; //! Base class for equal jumps binomial tree /*! \ingroup lattices */ template class EqualJumpsBinomialTree : public BinomialTree { public: EqualJumpsBinomialTree( const boost::shared_ptr& process, Time end, Size steps) : BinomialTree(process, end, steps) {} Real underlying(Size i, Size index) const { BigInteger j = 2*BigInteger(index) - BigInteger(i); // exploiting equal jump and the x0_ tree centering return this->x0_*std::exp(j*this->dx_); } Real probability(Size, Size, Size branch) const { return (branch == 1 ? pu_ : pd_); } protected: Real dx_, pu_, pd_; }; //! Jarrow-Rudd (multiplicative) equal probabilities binomial tree /*! \ingroup lattices */ class JarrowRudd : public EqualProbabilitiesBinomialTree { public: JarrowRudd(const boost::shared_ptr&, Time end, Size steps, Real strike); }; //! Cox-Ross-Rubinstein (multiplicative) equal jumps binomial tree /*! \ingroup lattices */ class CoxRossRubinstein : public EqualJumpsBinomialTree { public: CoxRossRubinstein(const boost::shared_ptr&, Time end, Size steps, Real strike); }; //! Additive equal probabilities binomial tree /*! \ingroup lattices */ class AdditiveEQPBinomialTree : public EqualProbabilitiesBinomialTree { public: AdditiveEQPBinomialTree( const boost::shared_ptr&, Time end, Size steps, Real strike); }; //! %Trigeorgis (additive equal jumps) binomial tree /*! \ingroup lattices */ class Trigeorgis : public EqualJumpsBinomialTree { public: Trigeorgis(const boost::shared_ptr&, Time end, Size steps, Real strike); }; //! %Tian tree: third moment matching, multiplicative approach /*! \ingroup lattices */ class Tian : public BinomialTree { public: Tian(const boost::shared_ptr&, Time end, Size steps, Real strike); Real underlying(Size i, Size index) const { return x0_ * std::pow(down_, Real(BigInteger(i)-BigInteger(index))) * std::pow(up_, Real(index)); }; Real probability(Size, Size, Size branch) const { return (branch == 1 ? pu_ : pd_); } protected: Real up_, down_, pu_, pd_; }; //! Leisen & Reimer tree: multiplicative approach /*! \ingroup lattices */ class LeisenReimer : public BinomialTree { public: LeisenReimer(const boost::shared_ptr&, Time end, Size steps, Real strike); Real underlying(Size i, Size index) const { return x0_ * std::pow(down_, Real(BigInteger(i)-BigInteger(index))) * std::pow(up_, Real(index)); } Real probability(Size, Size, Size branch) const { return (branch == 1 ? pu_ : pd_); } protected: Real up_, down_, pu_, pd_; }; class Joshi4 : public BinomialTree { public: Joshi4(const boost::shared_ptr&, Time end, Size steps, Real strike); Real underlying(Size i, Size index) const { return x0_ * std::pow(down_, Real(BigInteger(i)-BigInteger(index))) * std::pow(up_, Real(index)); } Real probability(Size, Size, Size branch) const { return (branch == 1 ? pu_ : pd_); } protected: Real computeUpProb(Real k, Real dj) const; Real up_, down_, pu_, pd_; }; } #endif