差分法によるブラック-ショールズ方程式の解法

 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に戻る