2014년 3월 24일 월요일

QuantLib 분석하기 - BootstrapHelper

기본적으로 template Class로 구성되어 있습니다. TS는 termstructure 에 대한 class type을 나타내고 있습니다.
observer, observable pattern을 상속 받고 있습니다. 
template <class TS>
    class BootstrapHelper : public Observer, public Observable {
      public:
생성자로는 const Handle<Quote>& 또는 Real을 받고 있습니다. 멤버  quote_ 을 채우기 위한 변수로 보입니다. 
        BootstrapHelper(const Handle<Quote>& quote);
        BootstrapHelper(Real quote);
        virtual ~BootstrapHelper() {}
        //! \name BootstrapHelper interface
        //@{
        const Handle<Quote>& quote() const { return quote_; }
pure virtual function 입니다. 본 클래스는 abstract class가 되겠습니다. impliedQuote 이라는 이름에서 느껴지듯이 Real Quote 과 Implied Quote 사이에 괴리가 존재 할수 있습니다.
        virtual Real impliedQuote() const = 0;
        Real quoteError() const { return quote_->value() - impliedQuote(); }
        //! sets the term structure to be used for pricing
경고를 주고 있습니다. TS 라는 Termstructure 가 rateHelper class의 whole life 동안 존재할지에 대해서 보장을 할수 없고 그런 구조는 프로그래머에게 pointer valid를 강요한다네요.
        /*! \warning Being a pointer and not a shared_ptr, the term
                     structure is not guaranteed to remain allocated
                     for the whole life of the rate helper. It is
                     responsibility of the programmer to ensure that
                     the pointer remains valid. It is advised that
                     this method is called only inside the term
                     structure being bootstrapped, setting the pointer
                     to <b>this</b>, i.e., the term structure itself.
        */
        virtual void setTermStructure(TS*);
relevant date 관련 Bootstrapping Class 를 위한 함수 입니다. 멤버  earliestDate_, latestDate_  와 관련이 있어 보입니다. 이름만 봐도 기간의 시작을과 만기일을 알려주는 느낌이네요.
거의 모든 Curve 관련 Bootstrapping Helper class 들이 이러한 구조를 가지고 갑니다.
        //! earliest relevant date
        /*! The earliest date at which data are needed by the
            helper in order to provide a quote.
        */
        virtual Date earliestDate() const;
        //! latest relevant date
        /*! The latest date at which data are needed by the
            helper in order to provide a quote. It does not
            necessarily equal the maturity of the underlying
            instrument.
        */
        virtual Date latestDate() const;
        //@}
        //! \name Observer interface
        //@{
        virtual void update();
        //@}
        //! \name Visitability
        //@{
        virtual void accept(AcyclicVisitor&);
        //@}
      protected:
        Handle<Quote> quote_;
        TS* termStructure_;
        Date earliestDate_, latestDate_;
    };

생성자입니다. 모양이 너무 일반적이네요. 특이한점은 termStructure_에 아무것도 넣지 않는다는것이 특징입니다. 파생 클래스에서 setTermStructure 함수를 통해 채워 넣어줄모양입니다. 
template <class TS>
    BootstrapHelper<TS>::BootstrapHelper(const Handle<Quote>& quote)
    : quote_(quote), termStructure_(0) {
        registerWith(quote_);
    }

    template <class TS>
    BootstrapHelper<TS>::BootstrapHelper(Real quote)
    : quote_(Handle<Quote>(boost::shared_ptr<Quote>(new SimpleQuote(quote)))),
      termStructure_(0) {}

    template <class TS>
    void BootstrapHelper<TS>::setTermStructure(TS* t) {
        QL_REQUIRE(t != 0, "null term structure given");
        termStructure_ = t;
    }

    template <class TS>
    Date BootstrapHelper<TS>::earliestDate() const {
        return earliestDate_;
    }

    template <class TS>
    Date BootstrapHelper<TS>::latestDate() const {
        return latestDate_;
    }
observer, observable 을 상속 받은 만큼 update를 구현하고 있습니다.
    template <class TS>
    void BootstrapHelper<TS>::update() {
        notifyObservers();
    }
해당 클래스의 가장 이해하기 힘든 부분입니다. Visitor pattern을 사용하고 있습니다. BootstrapHelper라는 이름 답게 다양항 작업을 수행할수 있는 구조가 필요해 보입니다. 이에 대한 자세한 설명은 차후에 이 함수가 적당하게 쓰이는 부분에서 같이 하겠습니다. 
    template <class TS>
    void BootstrapHelper<TS>::accept(AcyclicVisitor& v) {
        Visitor<BootstrapHelper<TS> >* v1 =
            dynamic_cast<Visitor<BootstrapHelper<TS> >*>(&v);
        if (v1 != 0)
            v1->visit(*this);
        else
            QL_FAIL("not a bootstrap-helper visitor");

    }

다음엔 RelativeDateBootstrapHelper class를 분석하겠습니다. 
감사합니다.

댓글 없음:

댓글 쓰기