仮にある C++ のプライシング計算ルーチンの実行時間が、あるコンピュータ上で 1 分だったとしましょう。あなたは、ボラリティのような不確かなパラメータの(例えば、期間のために大きな値となりそうな数)n 個に関する計算価格値の感度を知りたいと考えたとします。ここで n=180 としましょう。有限差分法を順次計算すると、少なくとも n+1 回のプライシング計算が必要となり、その計算時間は少なくとも 3 時間は必要です。
この近似の品質は、有限桁の浮動小数点演算精度のため、打切りと桁落ち誤差により満足な結果は得られません。nAG の ADD ツール "dco/c++"(C++ のオーバーロードによる微分コード;文献 (2))を注意深く適用すると、全計算時間は 20 分(10 分以下の場合もある)以下に抑えられることが期待でき、さらにマシン精度の打切り誤差の無いグラジェント情報を得ることが出来ます。
以下の例は、実際に関連性のある応用において、より良い実行時間が得られることを示しています。文献 (1) において、我々は、dco/c++ をアメリカン・オプションプライシングの Longstaff-Schwartz アルゴリズムに適用しました。そのオプション価格の5つのパラメータ(株価、ストライク・プライス、金利、残存期間、ボラリティ)に関するグラジェントが、ほぼ一回のプライシング計算にかかるコストのみで、マシン精度で計算することが出来ます。中央有限差分近似は以下に示す測定の通り、6 倍以上のコストが掛かりました。
モンテカルロパス数 | プライシング(365 時間ステップ) | 中央有限差分 | dco/c++ アジョイント |
100000 | 6 | 39 | 6 |
200000 | 12 | 78 | 12 |
300000 | 18 | 121 | 19 |
AAD は手動による実装が可能で、AAD の専門技術者が任意のプライシング計算ルーチンに対して、ツールベースで作成された AD バージョンより実行時間の短いアジョイントバージョンを作成することが出来るかもしれません。
しかしこのプロセスは冗長で、面倒なエラーが発生しやすく、デバッグが非常に困難になる可能性があります。さらに重要なことは、維持性と保守性のような現代的なソフトウェアエンジニアリングの基本的な要請を満たしません。オリジナルのプライシング計算コードに対して修正したい場合は、そのアジョイントモデルコードにもそれに相当する修正が必要となります。常にこれら2つのコードの整合性を保つように維持するのは現実的ではありません。nAG の dco/c++ は、多くの成功した応用例で示されるように、現実的な大規模 C++ コード(金融工学も含む)での利用のために設計されています。
以上の事は、二次微分の AAD に対してさらなる利点を持ちます。dco/c++ は、C++ の演算オーバーロードとメタプログラミング技法を用いた再帰的なテンプレートのインスタント化を通して、任意の微分次数のアジョイントモデルをサポートします。また、キャッシュを最適化した内部表現との強力で柔軟性のあるユーザーインターフェイスを提供します。さらにサポートされる機能として、時間発展(例えば、偏微分方程式の有限差分法における)および集合系(例えば、確率微分方程式のモンテカルロ法における)に対するチェックポイント機能、ユーザー定義のアジョイントモデル関数(例えば、線形、非線形方程式、求積法、検定ルーチン等のソルバー)、ツールベースのアジョイントモデルとその計算の一部を手動でアジョイント化したパーツを組み合わせたハイブリッド ADD(例えば、GPU の組込み((4) を参照)や、スムーシング技法)、等を含みます。さらに dco/c++ は、nAG ライブラリルーチンをその固有なものとして認識します。nAG AD ライブラリとのリンクにより、その対応するアジョイントバージョンの利用を可能にします。
参考文献
J. Deussen: Adjoint Methods for American Option Pricing. MSc Thesis, STCE, Dept. of Computer Science, RWTH Aachen, 2015.
U. Naumann and J. du Toit:数理ファイナンスにおける典型的な数値計算パターンへのアジョイント自動微分ツールの適用(nAG テクニカル・レポート TR3/14), 2014.
U. Naumann: The Art of Differentiating Computer Programs. An Introduction to Algorithmic Differentiation. Number 24 in Software, Environments, and Tools, SIAM, 2012.
J. du Toit, J. Lotz, and U. Naumann:GPU 利用アプリケーションのアジョイント自動微分(nAG テクニカル・レポート TR2/14), 2014.