モンテカルロ法によるオプション価格計算
MonteCarlo.c はモンテカルロ法により様々なオプションの価格を計算するCプログラムです。
資産価格のモデルとして,ブラック-ショールズモデル,マートンのジャンプ拡散モデル[1],Kou の
ジャンプ拡散モデル[2]の3つが使用できます。また,オプションとしては,ヨーロピアン・コールオ
プション,ヨーロピアン・プットオプション,バリアオプション(down-and-out call),ルックバック
・コールオプション,ハインドサイト・コールオプションの価格計算のための関数が用意されており,
ペイオフ計算の関数を追加するだけで,これ以外のオプションの価格も計算できます。
プログラムは次の関数から成っています。
UniformToNormal
区間[0,1)の一様乱数を1個与えると,それを標準正規分布に従う乱数へと変換する関数です。
「ブラウン運動のシミュレーション」のページを参照してください。
GenerateGBM
区間[0,T]の幾何ブラウン運動 dS = μSdt + σSdBt をシミュレーションする関数です。
「ブラウン運動のシミュレーション」のページを参照してください。
SetPoissonProb
強度λを持つポアソン過程において,時間 dt の間のジャンプ回数の確率を計算する関数です。
ジャンプが n 回以下である確率が pn[n+1] に入ります。
GenerateMerton
区間[0,T]において,分割数を n とし,マートンのジャンプ拡散モデルに従う資産価格のサンプル
パスを生成する関数です。パラメータについては Merton_MC の説明を見てください。結果は長
さn+1の配列Sに格納されます。
GenerateKou
区間[0,T]において,分割数を n とし,Kouのジャンプ拡散モデルに従う資産価格のサンプルパス
を生成する関数です。パラメータについては Kou_MC の説明を見てください。結果は長さn+1の
配列Sに格納されます。
EuroCallPayoff
ヨーロピアン・コールオプションに対する(割り引き後の)ペイオフを与える関数です。引数 H は
ダミーで,使用されません。
EuroPutPayoff
ヨーロピアン・プットオプションに対する(割り引き後の)ペイオフを与える関数です。引数 H は
ダミーで,使用されません。
DOCPayoff
離散時刻型バリアオプション(down-and-out call)に対する(割り引き後の)ペイオフを与える
関数です。n が観測日の数,H がバリアレベルです。時刻 t1,t2,... ,tn で資産価格の観測が
行われ,資産価格が H より小さくなる日が1日でもあれば,オプション価値は0となります。
LookBackPutPayoff
離散時刻型ルックバック・プットオプションに対する(割り引き後の)ペイオフを与える関数です。
時刻 t0, t1,t2,... ,tn での資産価格の最大値を Smax とするとき(時刻 t0 も入っていること
に注意),ペイオフは exp(-rT)*(Smax-Sn) となります。引数 H はダミーで,使用されません。
HSCallPayoff
離散時刻型ハインドサイト・コールオプションに対する(割り引き後の)ペイオフを与える関数です。
時刻 t0, t1,t2,... ,tn での資産価格の最大値を Smax とするとき(時刻 t0 も入っていることに
注意),ペイオフは exp(-rT)*max(Smax-K, 0) となります。引数 H はダミーで,使用されません。
BS_MC
ブラック-ショールズモデルの下でのオプション価格をモンテカルロ法により計算する関数です。
入力として,満期までの時間 T,離散型の経路依存型オプションにおける観測日の数 n,乱数の
初期値 seed,資産価格の初期値 S0,安全資産の利子率 r,ボラティリティ sigma,行使価格 K,
バリアレベル H,サンプルパスの数 nsamples,オプションの種類を指定する関数 func を与え
ます。なお,バリアオプション以外では,H は使用されません。結果は,オプション価格が V,
その標準誤差が se に格納されます。
Merton_MC
マートンのジャンプ拡散モデルの下でのオプション価格をモンテカルロ法により計算する関数
です。入力として,満期までの時間 T,離散型の経路依存型オプションにおける観測日の数 n,
乱数の初期値 seed,資産価格の初期値 S0,安全資産の利子率 r,ボラティリティ sigma,
ジャンプの起きる時刻を決めるポアソン過程の強度 lambda,ジャンプの大きさを決めるパラ
メータ gamma,delta,行使価格 K,バリアレベル H,サンプルパスの数 nsamples,オプションの
種類を指定する関数 func を与えます。資産価格の対数を取ったとき,1回のジャンプの大きさ
の確率分布は平均 gamma-0.5*delta*delta,分散 delta*delta の正規分布となります。なお,
バリアオプション以外では,H は使用されません。結果は,オプション価格が V,その標準誤差
が se に格納されます。
Kou_MC
Kouのジャンプ拡散モデルの下でのオプション価格をモンテカルロ法により計算する関数です。
入力として,満期までの時間 T,離散型の経路依存型オプションにおける観測日の数 n,乱数
の初期値 seed,資産価格の初期値 S0,安全資産の利子率 r,ボラティリティ sigma,ジャンプ
の起きる時刻を決めるポアソン過程の強度 lambda,ジャンプの大きさを決めるパラメータ p,
eta1,eta2,行使価格 K,バリアレベル H,サンプルパスの数 nsamples,オプションの種類を
指定する関数 func を与えます。p,eta1,eta2 についてはKouの論文[2]を見てください。なお,
バリアオプション以外では,H は使用されません。結果は,オプション価格が V,その標準誤差
が se に格納されます。
main
関数 BS_MC,Merton_MC,Kou_MC のためのテストプログラムです。指定した資産価格モデル
とオプションに対し,サンプルパスの数を10から始めて10倍ずつ増やしてモンテカルロ法を実行
し,計算した価格と標準誤差を出力します。結果は画面とファイル MonteCarlo.txt の両方に出
力します。
計算結果
ブラック-ショールズモデルの下で,現在の資産価格が S0=100,利子率が r=0.05,ボラティリティ
が σ=0.16 の場合に,満期が T=0.5,行使価格が K=98 のバリアオプション(down-and-out call
option)の価格を計算した例を図1に示します。横軸はサンプルパスの数,縦軸がオプション価格
で,バリアレベルは H=91,92,93 の3通りに変えています。バリアレベルが上がるにつれてオプ
ション価格は下がること(バリアに到達しやすくなるため),サンプルパスが 10**6 以下のあたり
では計算価格は大きく変動するが,10**7 まで計算すると約,ほぼ一定値に近づいていくことが
わかります。
図1 バリアオプションの価格
次に,上記のうち H=91 のオプションに対して,サンプルパス数と価格の誤差の関係を図2に示し
ます。ここで,真の価格としては,離散的な経路依存型オプションの価格を高精度に計算できる
DE-FGT法[3]によって計算した値 6.86323290 を用いました。図より,誤差は確かにサンプルパス
数とともに減少し,その傾きはほぼ-1/2,すなわちサンプルパスの平方根に反比例して誤差が減
少することがわかります。
図2 バリアオプションの価格の誤差
参考文献
[1] R. Merton: "Option Pricing when Underlying Stock Returns are Discontinuous", Journal of
Financial Economics, Vol. 3, pp. 125-144 (1976).
[2] S. Kou: "A Jump Diffusion Model for Option Pricing", Management Science, Vol. 48, No. 8,
pp. 1086-1101 (2002).
[3] M. Broadie and Y. Yamamoto: "A Double-Exponential Fast Gauss Transform Algorithm for
Pricing Discrete Path Dependent Options", conditionally accepted by Operations Research.
2004年度応用数理工学特論のページに戻る
プログラムのページに戻る
Topに戻る