Trinomial Tree

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Trinomial Tree

John Maiden
I'm working towards creating a trinomial tree convertible engine for the
convertible bond class. As a first step I've added to the trinomial tree class.
I've tried to reformat the Trinomial tree class into a simpler class like the
Binomial Tree class. Since I'd like to use the trinomial tree of Kamrad-Ritchken
(which is a first order approximation of Boyle, http://www.sitmo.com/eq/441),
I've created two derived classes from the new Trinomial tree class, RejebTree
(from the original code by Sadruddin Rejeb), and KamradRitchken. Input would be
appreciated.

/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */

/*
 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
 <[hidden email]>. The license is also available online at
 <http://quantlib.org/license.shtml>.

 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 NewTrinomialTree.hpp
    \brief Trinomial tree class
*/

#ifndef trinomial_tree_hpp
#define trinomial_tree_hpp

#include <ql/stochasticprocess.hpp>
#include <ql/methods/lattices/tree.hpp>
#include <ql/timegrid.hpp>

namespace QuantLib {

    //! Recombining trinomial tree class
    /*! This class defines a recombining trinomial tree approximating a
        1-D stochastic process.
        \warning The diffusion term of the SDE must be independent of the
                 underlying process.

        \ingroup lattices
    */

        template <class T>
    class NewTrinomialTree : public Tree<T> {
          protected:
        class Branching;
      public:
        enum Branches { branches = 3 };
        NewTrinomialTree(const boost::shared_ptr<StochasticProcess1D>& process,
                      const TimeGrid& timeGrid,
                      bool isPositive = false);
        Real dx(Size i) const { return dx_[i]; }
        const TimeGrid& timeGrid() const { return timeGrid_; }

        Size size(Size i) const;
        Real underlying(Size i, Size index) const;
        Size descendant(Size i, Size index, Size branch) const;
        Real probability(Size i, Size index, Size branch) const;

      protected:
        std::vector<Branching> branchings_;
        Real x0_;
        std::vector<Real> dx_;
        TimeGrid timeGrid_;

      protected:
        /* Branching scheme for a trinomial node.  Each node has three
           descendants, with the middle branch linked to the node
           which is closest to the expectation of the variable. */
        class Branching {
          public:
            Branching();
            Size descendant(Size index, Size branch) const;
            Real probability(Size index, Size branch) const;
            Size size() const;
            Integer jMin() const;
            Integer jMax() const;
            void add(Integer k, Real p1, Real p2, Real p3);
          private:
            std::vector<Integer> k_;
            std::vector<std::vector<Real> > probs_;
            Integer kMin_, jMin_, kMax_, jMax_;
        };
    };

        class RejebTree : public NewTrinomialTree<RejebTree> {
                public:
                        RejebTree(const boost::shared_ptr<StochasticProcess1D>& process,
                                const TimeGrid& timeGrid, bool isPositive = false);

        };

        class KamradRitchken : public NewTrinomialTree<KamradRitchken> {
                public:
                        KamradRitchken(const boost::shared_ptr<StochasticProcess1D>& process,
                                const TimeGrid& timeGrid, Real lambda = std::sqrt(2.0), bool isPositive =
false);
                private:
                        Real lambda_;
        };

    // inline definitions

        template <class T>
    inline Size NewTrinomialTree<T>::size(Size i) const {
        return i==0 ? 1 : branchings_[i-1].size();
    }

        template <class T>
    inline Real NewTrinomialTree<T>::underlying(Size i, Size index) const {
        if (i==0)
            return x0_;
        else
            return x0_ + (branchings_[i-1].jMin() +
                          static_cast<Real>(index))*dx(i);
    }

        template <class T>
    inline Size NewTrinomialTree<T>::descendant(Size i, Size index,
                                          Size branch) const {
        return branchings_[i].descendant(index, branch);
    }

        template <class T>
    inline Real NewTrinomialTree<T>::probability(Size i, Size j, Size b) const {
        return branchings_[i].probability(j, b);
    }

        template <class T>
    inline NewTrinomialTree<T>::Branching::Branching()
    : probs_(3), kMin_(QL_MAX_INTEGER), jMin_(QL_MAX_INTEGER),
                 kMax_(QL_MIN_INTEGER), jMax_(QL_MIN_INTEGER) {}

        template <class T>
    inline Size NewTrinomialTree<T>::Branching::descendant(Size index,
                                                     Size branch) const {
        return k_[index] - jMin_ - 1 + branch;
    }

        template <class T>
    inline Real NewTrinomialTree<T>::Branching::probability(Size index,
                                                      Size branch) const {
        return probs_[branch][index];
    }

        template <class T>
    inline Size NewTrinomialTree<T>::Branching::size() const {
        return jMax_ - jMin_ + 1;
    }

        template <class T>
    inline Integer NewTrinomialTree<T>::Branching::jMin() const {
        return jMin_;
    }

        template <class T>
    inline Integer NewTrinomialTree<T>::Branching::jMax() const {
        return jMax_;
    }

        template <class T>
    inline void NewTrinomialTree<T>::Branching::add(Integer k,
                                              Real p1, Real p2, Real p3) {
        // store
        k_.push_back(k);
        probs_[0].push_back(p1);
        probs_[1].push_back(p2);
        probs_[2].push_back(p3);
        // maintain invariants
        kMin_ = std::min(kMin_, k);
        jMin_ = kMin_ - 1;
        kMax_ = std::max(kMax_, k);
        jMax_ = kMax_ + 1;
    }

}


#endif


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
QuantLib-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-dev
Reply | Threaded
Open this post in threaded view
|

Re: Trinomial Tree

John Maiden
I'm trying to post the .cpp, but it's longer than 80 lines. Is there a place I
can post it without problem?


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
QuantLib-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-dev
Reply | Threaded
Open this post in threaded view
|

Re: Trinomial Tree

Luigi Ballabio

On Jun 4, 2007, at 8:12 PM, John Maiden wrote:
> I'm trying to post the .cpp, but it's longer than 80 lines. Is there a
> place I
> can post it without problem?

John,
        don't worry, just zip the .hpp and the .cpp together and attach the
archive. We'll copy the relevant lines ourselves if we had to review
them.

Thanks,
        Luigi


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
QuantLib-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-dev
Reply | Threaded
Open this post in threaded view
|

Re: Trinomial Tree

John Maiden
Ok, here are the files. I've also gone ahead and
created new TF Lattice, BlackScholes Lattice, and
Trinomial Convertible Engine files. At the moment they
don't work (for some reason the program does not pass
the arguments of the Convertible Bond to the
Convertible Engine), but I'm sure that can be fixed
easily. I've also included a sample version that tests
the new convertible engine. All the files contain
comments on the changes.

Regards,

                 John Maiden


 
____________________________________________________________________________________
Food fight? Enjoy some healthy debate
in the Yahoo! Answers Food & Drink Q&A.
http://answers.yahoo.com/dir/?link=list&sid=396545367
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
QuantLib-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-dev

TestTrinomialTree.rar (16K) Download Attachment