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の表示が義務付けられているので、添付します。 ライセンス