1. QuantLibを使ってみる
1.2 Example を試す
1.2.8 Replication ; バリアオプションを、ヨーロピアンオプションのポートフォリオでReplicattionする
1.2.8.1 はじめに
今回のプロジェクト例は、down-and-out のプットオプション(Barrier Optionの一種)を、ヨーロピアンのプットオプションとデジタルオプションのポートフォリオを使って Replicate(模倣)し、両者の価格を比較します。ここでテストされているバリアオプションは、ヨーロピアンタイプのプットオプションに、期間中、対象資産価格がバリア以下に下がるとそのオプションの権利が消滅する条件がついたものです。このバリアオプションを、
- 同じ満期日のヨーロピアンタイプのプット・スプレッドのポジションと、
- 同じ満期日のヨーロピアンタイプのデジタルオプションと、
- さらに、行使日までの期間をいくつかに分割し、その時点を満期とするプットオプションのシリーズで、
近似的に Replicate します。 具体的には
当初のバリアオプションの行使日を \(T_B\)、ストライクを \(K\)、down-and-out のバリアを \(B~(但し~B~ <~ K)~\)とすると、このオプションのロングポジションは、
- \(T_B\) を行使日とするヨーロピアンオプションで、ストライクが \(K\) のプットの買いとストライクが \(B\) のプットの売りのプット・スプレッドのポジション
- \(T_B\) を行使日とし、Payoff 額が \(K-B\) となる、ヨーロピアンタイプのデジタルオプションのショートポジション
を使って、最終行使日の Payoff を近似的に Replicate できます。すなわち、最終行使日において、対象資産価格 \(S~が~B\) を下回ると、バリアをヒットするのでバリアオプションの価値は 0 になる一方、①と②の合算のポジションは、すべてのオプションが行使され、プット・スプレッドからの利益 \(K-B\) と、デジタルオプションからの損失 \(-(K-B)\) が相殺され、やはり価値は 0 になります。\(S~が~ B< S < K\) の間にある場合は、バリアオプションの Payoff は \(K-S\) となる一方、①と②のポートフォリオでは、ストライク \(K\) のプットオプションのみ行使され、Payoffはやはり \(K-S\) になります。さらに \(S> K\) の場合は、バリアオプションも、①、②のポートフォリオもすべて行使されず Expire するので、いずれも価値は 0 です。
しかしながら、バリアオプションは、行使日までの間に \(S\) がバリアをヒットすると、その時点でオプションが消滅するのに対し、①と②のポジションは、いずれもヨーロピアンタイプである為、一定のオプション価値が残っています。そこで、次のような、そのオプション価値を消すようなオプションの配列を、①と②のポートフォリオに加えます。
- \(T_B\) までの期間を n 個に分割し(\(T_i,~~~ i=1,…,n,~~ T_n=T_B\))、各 \(T_i\) を行使日とし、\(B\) をストライクとするヨーロピアンプットの配列をショートする。但し、ショートする額は、各 \(T_i-1\) 時点において、Replication ポートフォリオを、\(対象資産価格~=~B\) として時価評価した値にリンクさせる。(具体的な計算式は後程説明)
③のポジションは、オプション期間中にいくつかの観測点を設けて、仮にその時点でバリアをヒットしたと仮定した場合に、Replicationポートフォリオに残っているオプション価値をヘッジする(消す)ようなポジションになります。言い換えると、バリアがヒットした際のポートフォリオ全体の条件付き期待値が 0 になるようなポジション調整をしています。 しかし、①と②と③の合算ポートフォリオは、バリアヒットを観測する時点が限られている為に、Replicationはあくまで近似的に行われているだけです。また、期間中に対象資産価格がバリアをヒットしたとしても、最終行使日において、損益が発生する可能性があります(その期待値が0というだけで、実際にはいくらかの損益が発生する)。なので、完全なReplicationにはなっていません。
このプロジェクトでは、バリアオプションを Replicate したヨーロピアンオプションのポートフォリオを 3 種類作成し、それぞれの価格をバリアオプションの価格と比較しています。3 種類は、オプションの最終期日までの間に、バリアヒットを観測するポイント数によって変えており、それぞれ12回、24回、52回、となっています。観測するポイント数が増える程、もともとのバリアオプションとの価格誤差が小さくなっていく様子が分かります。
1.2.8.2 プロジェクトのビルド
これまでのプロジェクトと同様、まず”Replication”プロジェクトのソースコードをビルドします。
- QuantLib のディレクトリ下にあるソリューションファイル QuantLib.sln を開けます。すると、Visual Studio が起動され、このソリューションファイル下にあるプロジェクトがオープンされます。ソリューションエクスプローラー画面にある 21 個のプロジェクトファイルの中から、Replication プロジェクトを選択します。
- Replication プロジェクトのディレクトリを展開し、SourceFiles のフォルダーにある Replication.cpp をクリックすると、約 340行あるソースコードが開かれます。
- メニューバーから “プロジェクト(P)” → “スタートアッププロジェクトに設定(A)” を選択します。これで、QuantLib.sln の中で、最初に Replication プロジェクトのメイン関数が呼び出されます。
- 同じくメニューバーから、“プロジェクト(P)” → “プロパティ(P)” を選択し、これまでのプロジェクトと同様、boost ライブラリへのパスを設定します。(実践編 1.1.5 “QuantLibソリューションのビルド”の解説を参照)
- メニューバーから ”ビルド” → ”Replicationのビルド” を選択するとビルドが開始されます。エラー無くビルドが正常終了すれば、試しにプログラムを走らせてみます。メニューバーの ”デバック” → ”デバックの開始” を選択し、下記の Console 画面が出力されれば成功です。
(注:プログラムが終了すると同時にConsole画面も消えてしまうようであれば、ツール→オプション→デバック→全般とし、「デバックの停止時に自動的にコンソールを閉じる」のチェックボックスをはずす。)
1.2.8.3 ソースコードの全体像
このプロジェクトのソースコードは、"Replication.cpp" になります。この解説はそのソースコードを見ながら読み進めてください。それをブラウザーでも見れるように、htmlファイルに変換したソースコード(”ReplicationCpp.html ”)を載せておきます。
さて、ソースコードは見ての通り、約340行あります。その構成は、
― | プリプロセッサ | (1~45行目) |
― | メイン関数 | (47~344行目) |
・本体 | (49~337行目 try{ }で囲まれた部分) | |
・例外処理 | (338~344行目 catch{ }部分) |
と成っています。
また、本体部分は、以下のような構成になっています。
- バリアオプションのオブジェクトと、その価格エンジンを部品から作成し、価格を計算。さらに計算結果を画面出力(51~114行目)
- Replicate されたポートフォリオを3種類作成し、「1.2.8.1.はじめに」で示した1.と2.のポジションを加える。(116~139行目)
- 「1.2.8.1.はじめに」で示した3.のポジションを計算して、2で作成したポートフォリオに加える。すなわち、オプション最終期日までの期間を 12 個に分割し、各時点でバリアをヒットしたと仮定して、その時点の1.2.の合算ポジションのオプション価値を消すような新たなプションを作成し、それを Replicate されたポジションに加える。(141~165行目)
- その Replicate されたポジションの価格を計算し、バリアオプションの価格と比較し、それを画面出力。(166~177行目)
- 3 と 4 と同じ操作を、オプション期間の分割数を 26,52、に変えて行う。(それぞれ179~205行目と207~233行目)
- 現在の対象資産価格を、Out of the Moneyに変更して4.の計算を行う(235~280行目)。さらに現在の対象資産価格を、In the Moneyに変更して同様の計算を行う(282~325行目)。
- 最後に若干のコメントを出力
この全体像を踏まえながら、次にソースコードの中味を解説していきます。
<ライセンス表示>
QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。 ライセンス