差分法によるブラック-ショールズ方程式の解法
BS_FDM.c は差分法によりブラック-ショールズの偏微分方程式を解き,オプション価格を求める
Cプログラムです。当研究室の高柳健一郎君が作成しました。
このプログラムでは,まず変数変換を行ってブラック-ショールズ方程式を熱伝導方程式に変換し,
これを差分法により解いています。この変数変換については,[1][2] を参照してください。
プログラムは次の関数から成っています。
CallPayoff
コールオプションに対する(変換後の変数での)ペイオフを与える関数です。変換前の変数で言
うと,max(S-K, 0) という値を返します。前のこの関数と次の境界条件とを変更することにより,
コール以外のオプションの価格も計算できます。
CallBC1
コールオプションに対する S=0(変換後の変数では x → -∞)での境界条件を与える関数です。
ある時点で S=0 だと満期までずっと S=0 となるため,境界条件はオプション価値=0と設定して
います。
CallBC2
コールオプションに対する S → ∞(変換後の変数では x → ∞)での境界条件を与える関数です。
変換前の変数で言うと,S → ∞ のときのオプション価値を S - K*exp{-r(T-t)} と設定しています。
ExplicitFDM
陽的差分法によりブラック-ショールズの偏微分方程式を解き,ヨーロピアン・コールオプションの
価格を求める関数です。入力として,行使価格 K,安全資産の利子率 r,ボラティリティ sigma,
満期までの時間 T,変換後の変数 x の絶対値の最大値 xmax,x 方向の分割数 N,時間方向の
分割数 M を与えます。結果は,初期資産価格 S0 = K*exp(xmax/N*(l-N)) に対応するオプション
価格が V[l] に格納されます。ただし,V は長さ N+1 の配列です。なお,M,N は陽的差分法の
安定性の条件 dt <= (1/2)dx*dx すなわち (1/2)*T*sigma*sigma/M <= (1/2)*(xmax/N)*(xmax/N)
を満たすように決める必要があります。この解法は時間に関して1次精度,空間(資産価格)に
関して2次精度です。
TridiagonalSolve
三重対角行列を係数とする連立一次方程式の解をLU分解法により求める関数です。np に行列
の元数,配列 alpha,beta,gamma にそれぞれ行列の対角成分,対角より1つ下の成分,対角
より1つ上の成分,配列 dY に右辺ベクトルを入れます。また,iopt は,LU分解を行って解を求
める場合は ipot=1,LU分解のみを行う場合は iopt=2,既に計算したLU分解の結果を用いて解
を求める場合は iopt=3 と指定します。解は配列 x に格納されます。
ImplicitFDM
陰的差分法によりブラック-ショールズの偏微分方程式を解き,ヨーロピアン・コールオプションの
価格を求める関数です。入力として,行使価格 K,安全資産の利子率 r,ボラティリティ sigma,
満期までの時間 T,変換後の変数 x の絶対値の最大値 xmax,x 方向の分割数 N,時間方向の
分割数 M を与えます。結果は,初期資産価格 S0 = K*exp(xmax/N*(l-N)) に対応するオプション
価格が V[l] に格納されます。ただし,V は長さ N+1 の配列です。この解法は dx,dt の選び方に
よらず安定(すなわち絶対安定)です。この解法も陽的差分法と同様,時間に関して1次精度,
空間に関して2次精度です。
CrankNicolson
クランク-ニコルソン法によりブラック-ショールズの偏微分方程式を解き,ヨーロピアン・コール
オプションの価格を求める関数です。入力として,行使価格 K,安全資産の利子率 r,ボラティリ
ティ sigma,満期までの時間 T,変換後の変数 x の絶対値の最大値 xmax,x 方向の分割数 N,
時間方向の分割数 M を与えます。結果は,初期資産価格 S0 = K*exp(xmax/N*(l-N)) に対応
するオプション価格が V[l] に格納されます。ただし,V は長さ N+1 の配列です。この解法も陰的
差分法と同様に絶対安定であり,かつ時間・空間の両方に関して2次精度と,陽的差分法,陰的
差分法に比べて精度が向上しています。
main
関数 ExplicitFDM,ImplicitFDM および CrankNicolson のためのテストプログラムです。様々な
初期資産価格 S0 に対するオプションの価格を計算し,画面に表示します。また,同じ内容を
ファイル BS_FDM.txtにも出力します。
計算結果
陽的差分法により K=100,r=0.1,sigma=0.3 のコールオプションの価格を計算した例を図1に示
します。横軸を S0,縦軸をオプション価格とし,T=0,0.5,1.0 の3通りの満期について計算して
います。また,xmax=5.0 とし,x 方向の分割数は N=200,時間方向の分割数は M=150 (T=1.0の
場合)としています。なお,このとき dt = 0.48*dx*dx となり,安定性の条件は満たされています。
図1 陽的差分法で計算した価格(N=200,M=150)
次に,同じ条件で N だけを 210 に変えて計算した結果を図2に示します。本来なら分割数を増す
ことで結果はより正確になるはずですが,見ての通り,正負に大きく振動するめちゃくちゃな解に
なってしまっています。これは安定性の条件が満たされていないことが原因で,実際,この例では
dt = 0.53*dx*dx > (1/2)dx*dx となっています。
図2 陽的差分法で計算した価格(N=210,M=150)
次に,陰的差分法による結果を図3に示します。ここでは図1の陽的差分法と同じ条件で N だけ
を 400 に変えています。この場合,dt = 1.92*dx*dx > (1/2)dx*dx ですが,解は正しく計算されて
います。これは,この問題に対する陰的差分法が無条件安定であり,dx,dt の値にかかわらず,
安定して解を求めることができるからです。
図3 陰的差分法で計算した価格(N=400,M=150)
最後に,同じコールオプションで S0=100,T=1.0 の場合の価格を N,M を変えて陰的差分法とクラ
ンク-ニコルソン法の両方で計算した結果を図4に示します。時間方向の分割数 M を 5 から 640
まで2倍ずつ変化させ,N=10*M としています。また,ブラック-ショールズ公式により解析的に求め
た価格は 16.734108 で,図の縦軸はこの価格からのずれを表しています。図より,陰的差分法は
直線の傾きが約 -1 なので1次精度,クランク-ニコルソン法は約 -2 なので2次精度であることが
わかります。
図4 陰的差分法とクランク-ニコルソン法の精度
参考文献
[1] P. Wilmott, S. Howison and J. Dewynne(伊藤幹夫,戸瀬信之訳): 「デリバティブの
数学入門」, 共立出版株式会社,2002.
[2] P. Wilmott, J. Dewynne and S. Howison: "Option Pricing --- Mathematical Models
and Computation", Oxford Financial Press, Oxford, 1993.
2004年度応用数理工学特論のページに戻る
プログラムのページに戻る
Topに戻る