ここでは見えませんが、背後で個別のCouponインスタンスを生成するプロセスが動いています。>ここで、キャッシュフローの基本単位である、Couponクラスについて、少し説明したいと思います。Couponクラスは、CashFlowクラスから派生しており、CashFlowクラスはEventクラスから、さらにEventクラスはObservableクラスから派生しています。(具体的クラス)という階層になっています。Observableについては、既に説明しました。Eventクラスですが、特定の日付に発生する経済事象を抽象化したクラスです。Flowの発生や、オプション期日の到来、オプションの行使、などが想定されています。Flowの発生事象を抽象化したクラスです。この階層でも、まだ抽象クラスです。Flowの構成要素は、“日付”と“金額”になりますが、この階層では、いずれの情報もメンバー変数として持っていません。)メソッドが宣言されており、その内容は派生クラスで実装する必要があります。Flowの金額を返します。“Coupon”クラスがそこから派生しています。実は、この階層でもまだ抽象クラスで、このクラスのインスタンスを作る事はできません。このクラスは、債券のクーポン属性をオブジェクトモデル化したクラスです。債券のクーポンに共通する属性として思い浮かぶものを挙げてみると、“クーポンレート”、“クーポン計算期間”、“クーポン支払日”、“クーポン日が休日の取扱い”、“クーポン金額”、“経過利息の計算”、などがあります。従って、このクラスは、こういった属性の情報にアクセスできるインターフェースと、メンバー変数を持ちます。メンバー変数では、クーポン支払日、クーポン計算期間、クーポンレート参照期間、みなし元本額などの情報を持ちます。肝心の“クーポンレート”を保持するメンバー変数がありません。インターフェースの一部も純粋仮想関数として宣言されているだけであり、このままでは使えません。このクラスから、さらにクーポンのタイプを細かく類型化し、具体的な派生クラスを作っていきます。“FixedRateCoupon”クラスは、Couponクラスから派生した具体的クラスで、ここで初めてインスタンスを生成する事が出来ます。固定金利クーポンの属性や計算機能をカプセル化したクラスです。この変数の意味は名前から明白です。この値を使って、Couponクラスで宣言された様々なインターフェースの実装が行えます。金利は、例えば年率2.5%と表示されていても、複利の回数や、日数計算方法の違いによって、実際に支払われる金額が異なってきます。InterestRateクラスになります。Coupon情報のみを取り扱います。通常、債券のクーポンは複数存在するので、これの配列を作る必要があります。それが、一般的なキャッシュフローの配列を取り扱う“Leg”クラスになります。Legクラスは、CashFlowクラスの配列ですが、typedefを使って下記のように定義されています。引数として取る配列変数です。CashFlowクラスの任意の派生クラスを取る事が出来きます。債券クーポンの'Leg'を作るには、クーポン毎に、クーポン支払日、クーポン計算期間、その期間に適用となる元本額(減債条項付きの債券の場合、元本が逓減していきます)などの情報を設定する必要があります。その作業をする為に作られたクラスがあり、“FixedRateLeg”がそれです。このクラスはLegクラスの派生クラスではありません。Legを生成する為のHelperクラスになります。パターンが使われている様子が判ります。出来れば、価格エンジンの役割は、それを現在価値に割引くだけです。部品さえ揃えば、FixedRateBondオブジェクトを構築するのは簡単です。それらの部品をコンストラクターに渡せば終わりです。そのコンストラクターが裏で行っている作業は、Scheduleオブジェクトの生成や、クーポンキャッシュフローの生成など、膨大です。それらはすべてQuantLibがデフォールトで用意しています。ユーザーは、必要な部品を集めてくるだけです。変動金利債の生成テストコードから大分それたので、元に戻します。行目で変動金利債オブジェクトを生成しています。等の金利インデックスに従って定期的に見直されます。オプションが付随したりして、固定金利債よりはるかに複雑です。従って、必要な部品も、固定金利債よりはるかに多くなります。その中で、最も重要な部品は変動金利インデックスのオブジェクトです。この例ではLIBORインデックスのオブジェクトを生成しています。先ほどの固定金利債と同様、クーポン日の配列(Scheduleオブジェクト)も必要となります。クーポンにデリバティブズのリスクが組み込まれる場合は、クーポン毎に、価格エンジンに相当する部品が必要になります。この例でも、CouponPricerと呼ばれるクラスを使って、そのオブジェクトを生成しています。Exampleコードを見ながら、これらの部品が作られる所から見てみます。3か月LIBORインデックスのオブジェクトを生成しています。Curveとなるイールドカーブが必要です。Handle(ポインターへのポインター)が生成されています。Handleを接続ソケットのように使って具体的なイールドカーブをはめ込みます。このHandleを部品として、USDLiborインデックスのオブジェクトを生成しています。434行目は、既にFixingが終わって確定している、変動金利クーポンを設定しています。>Exampleから少し離れて、QuantLibで定義されている“金利インデックス”オブジェクトについて説明します。このインデックスの中で、最も一般的なのは、LIBORインデックスです。432行目で生成された"USDLibor"クラスのインスタンスがそれに該当します。このクラスは、次の順序で派生してきたクラスです。ついては、説明済みです。それを除くと、基本となるベースクラスは、"Index"クラスになります。ここでは“金融指標”と訳すのが最も適当でしょう。クレジットなどさまざまな金融商品のグループ(ポートフォリオとかバスケットと呼んでもいいでしょう)の'価格'や'金利水準'を代表する数値です。インフレーションスワップやインフレーションリンク債などは、各国のインフレ率を金融指標として使うので、こういった指標も取り扱えるクラスです。このベースクラスは、抽象クラスで、ここで宣言されているメソッドは、ほとんどが純粋仮想関数です。共通するようなインターフェースを提供しています。QuantLibの開発者が考えた共通するインターフェースとは、基本的には、日付に対応するインデックスの値の設定と、設定された値へのアクセス方法になります。このベースクラスから、"金利"に関するインデックスを取り扱うクラスとして、"InterestRateIndex"クラスが派生しています。Fund金利、Swap金利、など様々な金利関連商品のインデックスがあります。それらすべてをカバーするベースクラスになります。このクラスが提供しているインターフェースや、格納しているメンバー変数は、これらの金利インデックスすべてに共通するものです。インターフェースは、主にインデックスの決定(Fixing)に必要な情報へのアクセスを提供しています。メンバー変数は、インデックスの名前や期間、Fixingに必要な日付に関する情報、カレンダーなどです。Ballabio)は、若干汎用性に欠ける点がある、と述べています。’インデックス間のスプレッド’のような情報、例えばCMSスプレッドなどは、このクラスで取り扱えません。このクラスからIborIndexクラスが派生しています。Rate、すなわち貸出金利)のことです。Rate、すなわち資金の受け手が呈示する預金金利もありますが、大半のインターバンク市場の金利指標は、Offer-Rate(貸出金利)の方を使っています。Rate)、などがあり、これらすべてをカバーするベースクラスです。LIBORクラスは、そこから派生しています。ロンドンのインターバンク資金市場における取引慣行などをカプセル化したクラスになります。そこから、通貨ごとのクラスが派生し、それが最終的に具体的なクラスになり、そのインスタンスを生成して使うことができます。このExampleでも、最終的にUSDLiborクラスのインスタンスを生成しています。ここでは、US$の3か月Liborクラスを生成しています。そのコンストラクターは、LIBOR・Swapイールドカーブを引数として取っており、このカーブを使って、現在あるいは将来の、特定の時点における3か月Libor金利をFixingあるいは推定します。Indexクラスは、あくまでインデックスの‘Fixingに必要な情報’や、‘Fixingの方法’をカプセル化したオブジェクトモデルで、Fixing後のデータを保持するクラスでは無い点に注意して下さい。このクラス階層の、どの段階にもFixingされた指標の値を保持するメンバー変数はありません。後のデータは、"IndexManager"と呼ばれるオブジェクトに、すべてまとめて保管されています。このExampleのコードには出てこないので、その説明は省略します。Ends”の中で、解説している部分があるので、そちらを参考にして下さい。IndexManagerについても、説明があります。436行目でクーポンキャッシュフローのScheduleオブジェクトを生成しています。そのコンストラクターの引数は次の様になっています。Unadjusted,DateGeneration::Backward,true);各引数の意味は、既に説明した通りです。実際に使われている引数(すなわち部品)は固定金利債のScheduleオブジェクトと、微妙に異なります。この設定内容についても、具体的な債券で使われている取引慣行に基づいて設定する必要があります。(クーポン日と償還日の休日の取扱いが、いずれもUnadjustedになっています。Followingが多いですが、テストコードなので気にしないでいきます)441から460行目で、以上の部品と、他に必要な情報をコンストラクターに渡し、FloatingRateBondオブジェクトを生成しています。コンストラクターにどのような引数が渡されているか、見てみましょう。(取引日から決済日までの期間。(クーポン日が休日の場合、次の営業日にする。休日が月末の場合は、次営業日が翌月になるので、前営業日に戻る。Floaterクーポンにおける変動金利にかける倍率。配列にしているのは、クーポン毎に設定する為。ここでは一般の変動金利債なので、配列は1で倍率は1.0に設定。0.001)(変動金利のスプレッド。配列にしているのはクーポン毎に設定できるようにする為。(変動金利の上限金利。CAP付き変動金利債の場合に使う。(変動金利の下限金利。(変動金利を金利期間の最後に決める。ここではtrueだが、あまり一般的では無い。(額面100%で償還)非常に多くの情報が、コンストラクターに渡されているのが判ります。これまで、様々な変動金利債のバリエーションが開発され、発行されてきた歴史を反映しています。いったバリエーションは、実は1980年代に大半が開発されていましたが、最近はあまり見かけなくなりました。従って、金融実務に携わってあまり時間が経ってない人にとっては、各設定情報の意味が判りにくいかもしれません。これらの情報は、大半のデリバティブズシステムでも使われており、実務で慣れていくしかありません。>CouponPricerについて、少し説明したいと思います。Flowの現在価値合計を計算します。この値が債券の'NPV'すなわち(経過利息込みの)債券価格です。この場合、債券キャッシュフローを確定的なものとしてとらえ、その現在価値を計算しているだけです。付いたクーポンは、一種の金利オプションであり、その価格計算には、何等かのオプション価格計算のエンジンが必要になります。場合も、何等かのオプション価格エンジンが必要になります。CouponPricerは一種の簡易版価格エンジンで、それが個別の'FloatingRateCoupon'オブジェクト毎に設定されます。変動利付債のクーポンの態様は千差万別で、それぞれの種類についてCouponPricerが必要になるでしょう。このLibraryを拡張して使うUserは、価格計算をしようとしている変動利付債の種類ごとに、CouponPricerが既に用意されているかどうか、チェックする必要があります。用意されていないのであれば、自分で開発する必要があるでしょう。このExampleでは、465行目に、BlackIborCouponPricerクラスのインスタンスを生成しています。Structureオブジェクトを生成しています。これを、BlackIborCouponPricerにセットしてCouponPricerが生成されました。480行目で、そのCouponPricerを、すでに作成済の変動利付債の商品オブジェクトに設定しています。ここでは、Volatilityの値が0に設定されており、オプションの価格計算上、意味の無い値になっています。CAPもFLOORも付いていないので、そもそもオプション価値を計算する必要がなかったのです。Adjustmentが必要です。従って、その為に何等かのCouponPricerが必要ですが、ここではその計算は行っていません。Adjustmentを計算する機能は備わっていないようです。QuantLibのライブラリーを見ても、それ用のCouponPricerが見つかりませんでした。Adjustmentの額も微小なので、特に気にする必要は無いと思います。変動利付債用にCouponPricerを生成し設定する作業、が終わりました。)を走らせて、価格計算をするだけです。Console画面に出力しています。yield()といったインターフェースを使って、価格計算アルゴリズムを呼び出し、その計算結果を出力しています。インターフェースは債券オブジェクトのものですが、実際の計算アルゴリズムは価格エンジンやCouponPricerが担っています。これまでのステップを見る限り、価格計算までのプロセスは相当複雑な操作です。債券トレーディングの実務で使われている、価格から最終利回りを計算する方法や、最終利回りから価格を計算する方法は、もっと簡単ではないかと思われる方もいるでしょう。Structure)を使った現在価値計算方法であり、Swapなどのデリバティブズの現在価値計算と同じ方法を使っています。従って、イールドカーブの構築が必要になり、それに相当の手間がかかっています。計算のアルゴリズムとは相当異なります。シンプルな固定金利債や、変動利付債の利回りや価格計算は、もっと簡単にアルゴリズム構築可能です。Return)の考え方をベースにしています。そこでは、すべてのキャッシュフローについて金利の期間構造を勘案せず、同じ利回りになる前提で計算されています。現在から債券の満期日まで、同じレートで再投資・再運用できるとう仮定のもとで計算される利回りです。560~567行目の計算は、その方法で行ったものです。yield()を異なる引数でOverloadしたメソッドで、背後にあるアルゴリズムは、BondFunctionsクラスが提供する関数群を使っています。BondFunctionsクラスは、さらにCashFlowsクラスの関数群を呼び出しており、アルゴリズムの実体は、CashFlowsクラスの中で定義されています。以上で、このExampleの説明は終わりです。<ライセンス表示>QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。