2. "Implementing QuantLib"の和訳

Chapter VIII   The Finite-Difference Framework (有限差分法のフレームワーク)

8.2 The New Framework (新しいフレームワーク)

Appendicesを除けば、この Chapterが最後の章になるので、最後の機会を利用して、プログラムコードをトップダウンの見方で、説明してみたいと思います。これまでのように、基本的な構成要素の説明から始め、次第に高次のクラスへ移って行くのではなく、ここでは、最終的に完成した有限差分エンジンがどの様なものか、その説明から始めましょう。 

説明に使うのは FdBlackScholesVanillaEngineクラスです。その宣言部分と calculate( )メソッドの実装内容を下記 Listing 8.17に示します。 

Listing 8.17 : FdBlackScholesVanillaEngineクラスのインターフェース 

class FdBlackScholesVanillaEngine
    : public DividendVanillaOption::engine {
  public:
    FdBlackScholesVanillaEngine(
        const shared_ptr<GeneralizedBlackScholesProcess>&,
        Size tGrid=100, Size xGrid=100, Size dampingSteps=0,
        const FdmSchemeDesc& schemeDesc=FdmSchemeDesc::Douglas(),
        bool localVol=false,
        Real illegalLocalVolOverwrite=-Null<Real>());

    void calculate() const;
  private:
    // data members, not shown
};

void FdBlackScholesVanillaEngine::calculate() const {
    shared_ptr<StrikedTypePayoff> payoff =
        dynamic_pointer_cast<StrikedTypePayoff>(arguments_.payoff);
    Time maturity = process_->time(arguments_.exercise->lastDate());
    shared_ptr<Fdm1dMesher> equityMesher(new FdmBlackScholesMesher(
                xGrid_, process_, maturity, payoff->strike(),
                Null<Real>(), Null<Real>(), 0.0001, 1.5,
                std::pair<Real, Real>(payoff->strike(), 0.1)));

    shared_ptr<FdmMesher> mesher(new FdmMesherComposite(equityMesher));

    shared_ptr<FdmInnerValueCalculator> calculator(
                       new FdmLogInnerValue(payoff, mesher, 0));

    shared_ptr<FdmStepConditionComposite> conditions =
        FdmStepConditionComposite::vanillaComposite(
                      arguments_.cashFlow, arguments_.exercise,
                      mesher, calculator,
                      process_->riskFreeRate()->referenceDate(),
                      process_->riskFreeRate()->dayCounter());

    FdmBoundaryConditionSet boundaries;

    FdmSolverDesc solverDesc = {
        mesher, boundaries, conditions, calculator,
        maturity, tGrid_, dampingSteps_
    };
    shared_ptr<FdmBlackScholesSolver> solver(
        new FdmBlackScholesSolver(
               Handle<GeneralizedBlackScholesProcess>(process_),
               payoff->strike(), solverDesc, schemeDesc_,
               localVol_, illegalLocalVolOverwrite_));

    Real spot = process_->x0();
    results_.value = solver->valueAt(spot);
    results_.delta = solver->deltaAt(spot);
    results_.gamma = solver->gammaAt(spot);
    results_.theta = solver->thetaAt(spot);
} 

前のセクションで説明した FDAmericanEngineクラスとの違いは一目瞭然です。この新しいスタイルの価格エンジンは、必要な計算を、ベースクラスの関数機能を継承するのではなく、いくつかの components(主要部品)に分けて (例えば、MeshersやCalculatorsやConditionsなど)、それを統合する形で行っています。そうする事で、少なくとも原理的には、これらの componentsを他の価格エンジンでも使える様になっています。このセクションの残りの部分で、これらの主要部品が、いかに連携して動作しているかを見ていきましょう。 

 

 

<ライセンス表示>

QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。   ライセンス

目次

Page Top に戻る

// // //