1.  QuantLibを使ってみる

1.2   Example を試す

1.2.7  Gaussian1dModels : Gaussian Short Rate Model と Markov Functional Model

1.2.7.4  ソースコードの解析 (その3)
1.2.7.4.6   Call Option付きの債券の価格評価(364~461行目)

Call Option が付いた債券の価格評価については、すでに CallableBonds プロジェクトでも行いました。そこでは、商品オブジェクトとして、Bond クラスのオブジェクトを作成し、Hull-White Model を使った価格エンジンで価格評価をテストしました。ここでは、Bond クラスではなく、NonStandardSwaption クラスを応用して、Call Option 付債券の価格評価を行っています。CallableBonds プロジェクトと違う点は、 

  • CallableBonds プロジェクトでは、シンプルな Hull-White Model を使ったので、Volatility の期間構造にフィットできなかったが、 GSR モデルの Volatilityは、時間の関数と看做すので、Volatilityの期間構造によりフィットした形で導出できる。
  • CallableBonds プロジェクトでは、forecasting curve と discounting curve で同じカーブを使っていたが、ここでは、両者を分ける multi-curve 方式で価格評価を行う。特に、forecasting curveについては、債券発行体のクレジットスプレッドを勘案したものを使う。
  • CalibrationHelperの配列も、CallableBondsプロジェクトでは外生的に与えていましたが、ここではcalibrationBasket()関数を使って自動的に生成する。従って、ストライク金利を債券のクーポンやクレジットスプレッドを勘案した形でCalibrationHelperを生成する事が可能。

以上のような違いに留意しながら、コードの内容を見て行きます。 

(1)   Call Option付債券の商品オブジェクトの作成(374~382行目) 

まずCall Option付債券の商品オブジェクトを、部品から作り上げます。ここでは、Bondクラスのオブジェクトを作るのではなく、NonStandardSwapクラスのオブジェクトとして作成しています。スワップのキャッシュフローの内、変動金利サイドのみなし元本を0にし、固定金利サイドだけを使えば、固定金利債券と全く同じキャッシュフローを作ることができます(374~376行目でそのような設定を行っています)。なので、そのキャッシュフローを債券と看做して、価格やリスク量の計算ができます。さらに、このクラスを使う事で、このクラスに備わっているcalibrationBasket()関数を使う事ができます。378行目にあるコンストラクターと、その引数(部品)を下記します。 

	auto underlying3 = ext::make_shared<NonstandardSwap>(
	     	Swap::Receiver, 	:債券のCash Flowを固定金利の受取CFと看做す
		nominalFixed2, 	:債券の元本を固定金利CFのみなし元本とみなす
		nominalFloating2, :変動金利CFの看做し元本は375行目で0に設定
		fixedSchedule, 	:固定金利CFのスケジュール
		strikes, 		:Call Option行使の際の償還額
		Thirty360(Thirty360::BondBasis), :固定金利CFの日数計算方法
		floatingSchedule, 	:変動金利CFのスケジュール
		euribor6m,		:変動金利インデックス
		1.0, 			:レバレッジ
		0.0, 			:変動金利スプレッド
		Actual360(), 	:変動金利日数計算方法
		false,			:途中でのみなし元本交換を"false"なしに設定
		true			:最終期日でのみなし元本の交換を“true”ありに設定
		);  

(2)   (1)のスワップ(債券CF)を対象とする、バーミューダン・スワップションを作成(386行目) 

さらに、(1)を対象資産とするバーミューダン・スワップションを作成すれば、Call Option付債券と同じ特性を持ったスワップションが出来上がる。 これをCall Option付き債券と看做す。

	auto swaption3 = ext::make_shared<NonstandardSwaption>(
		underlying3, 	:上記で生成した債券に模したスワップ
		exercise2		:386行目で生成したリベート付きの行使価格	
		); 

(3)   次に、債券のクレジットスプレッドを 0 と 100bp の2通り用意(388,389行目 oas0 と oas100) 

これを価格エンジンに与えるとGSRモデルの中心回帰レベルとなる forecasting curve が、Swapカーブ+クレジットスプレッドに修正される(392~394行目)。 

(4)   CalibrationHelper の自動作成と、Calibration の実行、価格評価-1(396~422行目) 

まず、クレジットスプレッドを 0 に設定して、calibrationBasket()関数を呼び、CalibrationHelperを生成する。さらに、calibrateVolatilitiesIterative()関数で、calibrationを実行。最後に NPV を計算。  

(5)   CalibrationHelper の自動作成と、Calibration の実行、価格評価-2(429~461行目) 

次に、クレジットスプレッドを100bpに設定し、calibrationBasket()関数を呼び、CalibrationHelperを生成する。さらに、calibrateVolatilitiesIterative()関数で、calibrationを実行。最後にNPVを計算。 

 以上の実行結果のConsole画面出力を下記に添付します。 

Gaussian1DModelsプロジェクトのアウトプット(5) Gaussian1DModelsプロジェクトのアウトプット(6)

この出力結果の見るべきポイントは、 

  • oas0 すなわち、クレジットスプレッド=0 のケースでは、生成された CalibrationHelper のストライクはおおむね4%になっています。債券発行体は、金利がこれを下回ると、Call Optionを行使する事になります。
     
  • Call Option の価格は、11.54% となっています(あくまで債券に内包している Call Option の価値であって、Call Option付債券の価格ではありません)。前の、バーミューダン・スワップションは、Payer Swaptionだったので、4%のストライクはdeep out of the moneyになっていました。しかし、ここでの債券のCall Optionは、債券発行体が持つオプションで、債券発行体にとっては、4%のストライクはdeep in the moneyになります。なので、オプション価格は元本対比、大きな値になります。
     
  • oas100 すなわち、クレジットスプレッド=100bp のケースでは、生成された CalibrationHelper のストライクは、おおむね 3%になっています。これは、債券発行体にとって、スワップ金利が3%以下になった時に、すなわち自らの再調達コストが4%以下になった時にCall Optionを行使する事になるので、自動生成されたCalibrationHelperのストライクがそのように調整されたました。
     
  • この場合のCall Optionの価格は、4.498%で、oas0のケースより小さくなります。In the Moneyの度合いが、少し小さくなった為です。  

 

<ライセンス表示>

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

目次

Page Top に戻る

// // //