)StochasticProcessのインターフェースに戻ります。このクラスではいくつかのインスペクター関数を定義しています。Processインスタンスがモデル化している確率変数の数を返します。Black-Scholesモデルでは1ですし、ボラティリティー確率変動モデルでは2になります。N個あり、それぞれ一定の相関を持ってBlack-Scholes過程で変動するモデルであれば、Nを返します。)メソッドは、確率変数を動かす確率変動成分の数を返します。)と同じ値を返しますが、後で考えてみるとそれで良かったか疑問です。デフォールト値を設定せずに、常に外生的に与えられる値を要求すべきであったかも知れません。時点の対象資産の値を返します。言い換えると、初期値であり、その値に確率的な性格はありません。Disposableクラステンプレートのインスタンスで受取ります。これは、配列や行列の型で値を返す場合に発生するメモリー上のコピーを避ける為です。置き換える事ができます。QuantLibライブラリーの環境をC++11準拠の環境に移すには、あと数年かかるでしょう。(ある意味インスペクター関数でもありますが)、Processインスタンスに関する、より詳細な情報を返します。次元の行列になります。)メソッドが返す値と同じになります。拡散項の行列には、相関の情報も含めなければなりません。Pathの離散化を扱います。N個の配列)を返します。)メソッドに渡しその計算結果を返します。このような単純な計算の為に、なぜこのような多相的なメソッドが必要なのか疑問に思われるでしょう。これについては、悲しい話ですが、もう少し後で説明します。)メソッドは、その値の2乗を返します。デフォールトの実装は、両方のメソッドとも、discretizationインスタンスにその計算を委託しています。)メソッドですが、やや抽象的なレベルのインターフェースを提供しています。(その値には確率変動の中の確定項の部分も含みます)。)メソッドを呼び出したり、別の時には同じグループの他のメソッドを呼び出したりしています。Methodパターンの一種と言えます。この仕組みにより、StochasticProcessクラスの派生クラスにおいて、様々なレベルでの動作を実装する事が可能になっています。)メソッドを実装する必要があります。StochasticProcessを生成するのに十分なパーツとなります。discretizationインスタンスに計算を委託するようになっています。discretizationストラテジーを記述する事ができますが、何かデフォールトの実装をこしらえてもいいですし、ユーザー自身の選択にすべて任せてしまっても構いません。)メソッドをオーバーライドする事も可能です。計算を解析解で導出できるような場合には、そのようなプログラムコードを書く事も出来ます。discretizationインスタンスの生成をさせず、解析解の式を必ず使うようにさせるか、あるいはコンストラクターにそのインスタンスを持たせるものの、オーバーライドするメソッドが呼ばれた時にそのインスタンスの有無をチェックし、仮に存在していれば自分自身のインスタンスを使わずベースクラスの実装に動作を投げる、という風に決める事ができます。)メソッドに託されています。)メソッドをオーバーライドする事も可能です。(訳注:マリア様お願いパス。アメリカンフットボールにおいて、終了間際の逆転を狙ったロングパス。)メソッドに加える事も可能です。ガウス分布の乱数とポアソン分布の乱数を適切に組み合わせた乱数を生成して、そのメソッドに渡す必要があります。jumpする拡散項を扱えるものを加えた方がいいでしょうか?もし開発者がそのインターフェースの周りではなく、それそのものを使って作業をできるのであれば、その方がいいかも知れません。する拡散項を扱うメソッドを加えるのは2つの問題があると思います。ひとつは、適切なインターフェースがどのようなものか、私自身、確信がありません。jumpを取り込んだ一般的な計算式を1つ用意すればいいのか?後で正しくなかったと言われる可能性のあるインターフェースを今の段階でリリースする事はしたくありません。現段階では、それを汎用的に使えるようなプログラムコードを持っておらず、そうなる可能性が大です。Diffusionのインターフェースを、コミットせずに取り込むにはいいかも知れません。)メソッドを持つクラスを実験的に作ってみて、動作するかどうか試してみれば、何等かの有用な情報が得られるかも知れません。)少し、脇道に逸れ過ぎました。Diffusionを取り扱えるメソッドが無いのは、良くない事です。今それを加えようとすると、出来の悪いものしか出来ないでしょう。私としては、誰かが作動するプログラムコードを提供してくれるのを、窓の横に座って待っています。どなたか、助けて頂いてそのような実験的なクラスを提供して頂けるなら、大変感謝します。いくつかの具体例に進む前に、最後の寄り道です。一次元の確率過程を実装する場合、Arrays(配列を扱うクラス)やそれに似たものが、若干邪魔になります。これらのデータ型を使うと、プログラムコードを書いたり読んだりするのが、より大変になります。理想的には、StochasticProcessクラスの中に、配列や行列の値ではなく、単なる実数値を入出力するようなメソッド群を加えた方がよかったかも知れません。StochasticProcessクラスの関数をオーバーロードするような形で宣言する事はできません。Processに利用できなくなるからです。一次元の確率過程だけの為に別の独立した階層構造をつくるのもしたくありません。StochasticProcessであるからです。StochasticProcess1Dクラスを提供する事により、その問題を解決しています。};一方で、このクラスは、StochasticProcessクラスのインターフェースをそのまま写したインターフェースを宣言しています。デフォールトの実装までも、同じ内容ですが、(変数の取扱いをArrayではなく)実数の型を使っています。a”という事を示したかったのです)。Real(実数)に入れ替えており、その結果このクラスを使って開発を行う際に配列を気にする必要がなくなりました。端的に言えば、Adapterパターンをそっくりそのまま使ったという事です。(訳注:多次元のインターフェースの配列変数の要素の数を1とすれば同じ動作をする)。StochasticProcessクラスと同じように、カスタマイズが可能になっています。2006.***********************************************************************************今から1つ、いえ3つの例を示します。Black-Scholes過程です。(GeneralizedBlackScholesProcessという長ったらしい名前でした)。その時使ったプログラムコード(の問題点)については後程説明しますが、その時に、現在のデザインが持ついくつかの欠点と将来的な解決策についても議論します。ここではまず、現在の実装について見てみましょう。};まず最初に、クラス名の長さについて説明すべきでしょう。”generalized”の部分は、このモデルの拡張性を示したものではありません。Black-Scholesプロセス、Black-Scholes-Mertonプロセス、Blackプロセスなどです)。短いクラス名は、それら細分類をカバーする為に残していました。Structure、です。StochasticProcessクラスのインターフェースを実装する為、discretizationクラスのインスタンスも引数として取り込んでいます。金融商品の価格モデルに必要なすべての入力項目はコンストラクターによって生成されたインスタンスに保持され、インスペクター関数を使ってその内容を取り出す事が出来ます。引数として取っているのに気が付かれたでしょうか。Volatilityへの換算のタイミングを調整しています。Lazyに行われます。Volatilityが必要となった場合にのみ再計算します)。あるのか)に合わせて、それぞれ異なるアルゴリズムを使って、その値を必要な形に変換しています。cast演算子を使ってRun-timeでチェックされます。Visitorパターンを使うよりは簡単です。Processクラスの中にすでにハードコードされており、ユーザーによって内容を書き換える事はできません。提供する事も出来ません。)はこのクラスの根幹部分になります。このプロセスは、実際には原資産の価格そのものの確率過程ではなく、価格の対数の確率過程を表しています。(この点が、もうひとつの問題点ですが、後で説明します)。Volatilityの値を返します。確率変数として価格の対数を選択した事により、いくつか問題となる影響が出ています。最初に、このクラスが取り扱う確率変数は、ベースクラスのインターフェースが外部とデータのやり取りを行う際に想定している値とは違ってきます。)メソッドが返す値も原資産の価格を想定しています。)などの他のメソッドでも、原資産の価格そのものを想定したデータのやり取りをしています。(読者の方の“あ~あ”という声が聞こえます)。自分達ですでに開発したデザインに引きずられてこうなりました。重要なピースが抜けているという事に気づくべきでした。Listingの中の至る所に出ています。)メソッドを仮想関数にする必要があり、かつそのメソッドが存在している理由そのものです。)メソッドも同様に影響を受けます。このメソッドが間違った値を返さないようにする為、今の所このメソッドを使えない状態にしています(使おうとすると例外処理に飛びます)。)メソッドに依存していましたが、(それが使えない為)別の方法を使ってオーバーライドしなければなりませんでした。)メソッドは、計算速度の問題から、いずれにしてもオーバーライドする必要がありました。返すようになっています。(訳注:指数計算の演算は時間がかかるので、デフォールトでは2回行うところを、オーバーライドしたメソッドでは1回で済む))上記のような、まずいデザインに加え、計算速度の問題も抱えていました。(この人たちからは他にも様々なコメントを頂きました)。)メソッドを使っているので、離散化した時間の各ステップで、指数関数を計算する事になってしまいます。Structureインスタンスに値を求めています。Structureを使って、そこからゼロ金利を取り出すような不要な手間をかけている事もあり得ます。最後にもうひとつ、デザイン上の問題があります。Black-Scholes過程を既に使っていました。StochasticProcessクラスを本来の目的通りに使っていません。Structureのデータの入れ物として使っていました。この事は、StochasticProcessクラスをよろず屋のように使っている事を示しています。これをどのように修正して行きましょうか?おそらく、設計のやり直しが必要でしょう。このChapterを書く為にコードを見直していく中で、いくつかのアイデアが浮かびました。だいたい、次のようなものです。現段階では仮説程度のものですし、実際のプログラムコードも出来ていませんが。Structureのような‘データを保存している部分’を分けます。BlackShcolesModelのようなクラス名を付けて、新しいクラスを作ります。Engineに渡されてそこで使われる事を想定しています。Volatilityに変換し、それを提供できるようにしたりします。Model(クラス)から、StochasticProcessクラスを構築できるようにします。(クラス間の協働の度合いやクラスの数をどの程度にしたいかによりますが)。Factoryメソッドをいくつか加えてもいいです。StochasticProcessクラスのコンストラクターを作ってもいいかもしれません。StochasticProcessクラスを作ることが出来るでしょう。(レートは原資産の価値に依存しないので事前計算が可能です)。Smileは、対象資産価格とStrikeの距離によってVolatilityの値が変わるので、導出するには対象資産価格が必要になり、事前計算できない)。StochasticProcessクラスとして設計し直した方が良いでしょう。)などのその他のメソッドについても、そのようにします。すれば、このクラスは整合性と明確さを取り戻せるでしょう。Clientコードでは、確率変数の値(log(x))を原資産の価格(x)に変換する関数あるいは関数オブジェクトが必要になるかもしれません。そのような関数は、StochasticProcessクラスのインターフェースに加えるか、Clientコードに任せるかでしょう。***********************************************************************************実際のプログラムコードに戻りましょう。6.7を見てみましょう。そのまま(時間軸に沿って)積分していく事が出来るという事です。)メソッドについても、この過程が記述する確率変動の値をそのまま返すようにオーバーライドしています。)が実装されています)、数値積分を行っていく際に起こり得る数値的不安定性を防ぐため、2パターンに分岐するようになっています。なる極限の値を返すようになっています。***********************************************************************************最後に、複数の確率変動成分を持つ確率過程の例を示します。6.8に示す、StochasticProcessArrayクラスを見てみましょう。};このクラスは、特定の確率過程をモデル化したものでは無く、互いに相関を持つN個の1次元確率過程を統合したものです。このクラスを使って、相関係数(行列)が、どのようにして確率過程の中に取り込まれていくのかを示します。コンストラクターは、複数の1次元確率変数の配列と、それらの相関行列を引数として取ります。確率変数の配列は、メンバー変数に保存されますが、相関行列は保存されません。Observerとして、引数で取った各StochasticProcess1Dインスタンスに登録し、データの変更があった場合に通知を受けられるようにします。)などのメソッドは、引数で取った各StochasticProcess1Dインスタンスの該当する同じメソッドをLoopの中で呼び出し、計算結果を配列にまとめるだけです。)メソッドも同じく各ProcessインスタンスのメソッドをLoopの中で呼び出しますが、それらの計算結果を、相関行列を使って変換します。含む各確率過程の標準偏差の行列を使います。(つまり、確率変数(の初期値)に計算された変動部分(ドリフトと拡散を足しているだけなら)、デフォールトの実装をそのまま継承すればいいだけです。確率変動成分の配列を掛け、それにドリフト項の値を足せばいいだけでした。)メソッドは別の方法で実装する必要があります。ガウス分布する確率変動成分(の配列)に相関行列の平方根を掛け、相関する確率変動成分の配列を算出します。)メソッドを呼び出して、その配列メンバー毎の計算結果を集計します。<ライセンス表示>QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。