有限差分法を用いた : ブラック・ショールズ(Black-Scholes)方程式の解

Fortranによるサンプルソースコード : 使用ルーチン名:d03ncf

ホーム > 製品 > nAG数値計算ライブラリ > nAG Fortranライブラリ > サンプルソースコード集 > 有限差分法を用いたブラック・ショールズ(Black-Scholes)方程式の解

Keyword: 有限差分法, ブラック・ショールズ, Black-Scholes

概要

本サンプルは有限差分法を用いてブラック・ショールズ(Black-Scholes)方程式を解くFortranによるサンプルプログラムです。 本サンプルは引数として行使価格やタイムステップ数を与えオプション価格とグリークス(Delta, Gamma, Lambda, Theta, Rho)を算出します。

※本サンプルはnAG Fortranライブラリに含まれるルーチン d03ncf() のExampleコードです。本サンプル及びルーチンの詳細情報は d03ncf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで

入力データ

(本ルーチンの詳細はd03ncf のマニュアルページを参照)

このデータをダウンロード
D03NCF Example Program Data
  21  11  4                : ns, nt, ntkeep
  4                        : kopt
  50.                      : x
  'U'                      : mesh
  0.0  100.                : s(1), s(ns)
  0.0  0.4166667           : t(1), t(nt)
  1.0                      : alpha
  .FALSE. .FALSE. .FALSE.  : tdpar
  0.0  0.1  0.4            : q(1), r(1), sigma(1)

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目に有限差分メッシュで使用される株価の数(ns=21)、有限差分法で使用されるタイムステップの数(nt=11)、格納される解の数(ntkeep=4)を指定しています。
  • 3行目にオプションの種類(kopt=4:アメリカンプットオプション)を指定しています。
  • 4行目に行使価格(x=50.)を指定しています。
  • 5行目に有限差分メッシュの種類(mesh='U':一様メッシュ)を指定しています。
  • 6行目に株価の最小価格(s(1)=0.0)と最大価格(s(21)=100.)を指定しています。
  • 7行目にタイムステップの最小値(t(1)=0.0)と最大値(t(11)=0.4166667)を指定しています。
  • 8行目にタイムステップスキーマに使用されるλの値(alpha=1.0:陰的後退オイラースキーム)を指定しています。
  • 9行目にパラメータ r (無リスク金利)が時間依存かどうか(tdpar(1)=.FALSE.:一定)、パラメータ q(連続配当)が時間依存かどうか(tdpar(2)=.FALSE.:一定)、パラメータ σ (ボラティリティ)が時間依存かどうか(tdpar(3)=.FALSE.:一定)を指定しています。
  • 10行目に連続配当 q の定値(q(1)=0.0)、無リスク金利 r の定値(r(1)=0.1)、ボラティリティ σ の定値(sigma(1)=0.4)を指定しています。

出力結果

(本ルーチンの詳細はd03ncf のマニュアルページを参照)

この出力例をダウンロード
 D03NCF Example Program Results


 Option Values
 -------------
   Stock Price  |   Time to Maturity (months)
                |   5.0000E+00  4.5000E+00  4.0000E+00  3.5000E+00
  -----------------------------------------------------------------
   0.0000E+00   |   5.0000E+01  5.0000E+01  5.0000E+01  5.0000E+01
   5.0000E+00   |   4.5000E+01  4.5000E+01  4.5000E+01  4.5000E+01
   1.0000E+01   |   4.0000E+01  4.0000E+01  4.0000E+01  4.0000E+01
   1.5000E+01   |   3.5000E+01  3.5000E+01  3.5000E+01  3.5000E+01
   2.0000E+01   |   3.0000E+01  3.0000E+01  3.0000E+01  3.0000E+01
   2.5000E+01   |   2.5000E+01  2.5000E+01  2.5000E+01  2.5000E+01
   3.0000E+01   |   2.0000E+01  2.0000E+01  2.0000E+01  2.0000E+01
   3.5000E+01   |   1.5000E+01  1.5000E+01  1.5000E+01  1.5000E+01
   4.0000E+01   |   1.0154E+01  1.0096E+01  1.0046E+01  1.0012E+01
   4.5000E+01   |   6.5848E+00  6.4424E+00  6.2916E+00  6.1306E+00
   5.0000E+01   |   4.0672E+00  3.8785E+00  3.6729E+00  3.4463E+00
   5.5000E+01   |   2.4264E+00  2.2423E+00  2.0454E+00  1.8336E+00
   6.0000E+01   |   1.4174E+00  1.2662E+00  1.1096E+00  9.4813E-01
   6.5000E+01   |   8.1951E-01  7.0724E-01  5.9532E-01  4.8515E-01
   7.0000E+01   |   4.7241E-01  3.9411E-01  3.1904E-01  2.4845E-01
   7.5000E+01   |   2.7257E-01  2.2016E-01  1.7174E-01  1.2815E-01
   8.0000E+01   |   1.5725E-01  1.2328E-01  9.2935E-02  6.6682E-02
   8.5000E+01   |   8.9662E-02  6.8478E-02  5.0100E-02  3.4731E-02
   9.0000E+01   |   4.8449E-02  3.6251E-02  2.5901E-02  1.7469E-02
   9.5000E+01   |   2.1100E-02  1.5584E-02  1.0968E-02  7.2680E-03
   1.0000E+02   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00

 Theta
 -----
   Stock Price  |   Time to Maturity (months)
                |   5.0000E+00  4.5000E+00  4.0000E+00  3.5000E+00
  -----------------------------------------------------------------
   0.0000E+00   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   5.0000E+00   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   1.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   1.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   2.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   2.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   3.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   3.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   4.0000E+01   |  -1.4043E+00 -1.1857E+00 -8.3285E-01 -2.8064E-01
   4.5000E+01   |  -3.4185E+00 -3.6183E+00 -3.8646E+00 -4.1880E+00
   5.0000E+01   |  -4.5285E+00 -4.9339E+00 -5.4387E+00 -6.0796E+00
   5.5000E+01   |  -4.4165E+00 -4.7277E+00 -5.0821E+00 -5.4821E+00
   6.0000E+01   |  -3.6294E+00 -3.7585E+00 -3.8748E+00 -3.9632E+00
   6.5000E+01   |  -2.6946E+00 -2.6860E+00 -2.6441E+00 -2.5561E+00
   7.0000E+01   |  -1.8790E+00 -1.8018E+00 -1.6941E+00 -1.5505E+00
   7.5000E+01   |  -1.2578E+00 -1.1621E+00 -1.0461E+00 -9.0969E-01
   8.0000E+01   |  -8.1539E-01 -7.2821E-01 -6.3006E-01 -5.2314E-01
   8.5000E+01   |  -5.0841E-01 -4.4106E-01 -3.6887E-01 -2.9433E-01
   9.0000E+01   |  -2.9276E-01 -2.4840E-01 -2.0237E-01 -1.5656E-01
   9.5000E+01   |  -1.3237E-01 -1.1079E-01 -8.8802E-02 -6.7378E-02
   1.0000E+02   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00

 Delta
 -----
   Stock Price  |   Time to Maturity (months)
                |   5.0000E+00  4.5000E+00  4.0000E+00  3.5000E+00
  -----------------------------------------------------------------
   0.0000E+00   |  -1.0000E+00 -1.0000E+00 -1.0000E+00 -1.0000E+00
   5.0000E+00   |  -1.0000E+00 -1.0000E+00 -1.0000E+00 -1.0000E+00
   1.0000E+01   |  -1.0000E+00 -1.0000E+00 -1.0000E+00 -1.0000E+00
   1.5000E+01   |  -1.0000E+00 -1.0000E+00 -1.0000E+00 -1.0000E+00
   2.0000E+01   |  -1.0000E+00 -1.0000E+00 -1.0000E+00 -1.0000E+00
   2.5000E+01   |  -1.0000E+00 -1.0000E+00 -1.0000E+00 -1.0000E+00
   3.0000E+01   |  -1.0000E+00 -1.0000E+00 -1.0000E+00 -1.0000E+00
   3.5000E+01   |  -9.8457E-01 -9.9042E-01 -9.9536E-01 -9.9883E-01
   4.0000E+01   |  -8.4152E-01 -8.5576E-01 -8.7084E-01 -8.8694E-01
   4.5000E+01   |  -6.0871E-01 -6.2173E-01 -6.3735E-01 -6.5654E-01
   5.0000E+01   |  -4.1584E-01 -4.2000E-01 -4.2463E-01 -4.2970E-01
   5.5000E+01   |  -2.6498E-01 -2.6123E-01 -2.5633E-01 -2.4982E-01
   6.0000E+01   |  -1.6069E-01 -1.5351E-01 -1.4500E-01 -1.3485E-01
   6.5000E+01   |  -9.4501E-02 -8.7208E-02 -7.9055E-02 -6.9969E-02
   7.0000E+01   |  -5.4694E-02 -4.8708E-02 -4.2358E-02 -3.5699E-02
   7.5000E+01   |  -3.1515E-02 -2.7084E-02 -2.2610E-02 -1.8177E-02
   8.0000E+01   |  -1.8291E-02 -1.5168E-02 -1.2164E-02 -9.3423E-03
   8.5000E+01   |  -1.0880E-02 -8.7026E-03 -6.7034E-03 -4.9214E-03
   9.0000E+01   |  -6.8562E-03 -5.2894E-03 -3.9132E-03 -2.7463E-03
   9.5000E+01   |  -4.8449E-03 -3.6251E-03 -2.5901E-03 -1.7469E-03
   1.0000E+02   |  -4.2199E-03 -3.1168E-03 -2.1936E-03 -1.4536E-03

 Gamma
 -----
   Stock Price  |   Time to Maturity (months)
                |   5.0000E+00  4.5000E+00  4.0000E+00  3.5000E+00
  -----------------------------------------------------------------
   0.0000E+00   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   5.0000E+00   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   1.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   1.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   2.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   2.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   3.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   3.5000E+01   |   6.1726E-03  3.8321E-03  1.8558E-03  4.6773E-04
   4.0000E+01   |   5.1047E-02  5.0031E-02  4.7953E-02  4.4288E-02
   4.5000E+01   |   4.2075E-02  4.3582E-02  4.5444E-02  4.7873E-02
   5.0000E+01   |   3.5072E-02  3.7109E-02  3.9646E-02  4.2863E-02
   5.5000E+01   |   2.5275E-02  2.6400E-02  2.7671E-02  2.9089E-02
   6.0000E+01   |   1.6442E-02  1.6688E-02  1.6860E-02  1.6900E-02
   6.5000E+01   |   1.0032E-02  9.8331E-03  9.5193E-03  9.0515E-03
   7.0000E+01   |   5.8907E-03  5.5669E-03  5.1595E-03  4.6562E-03
   7.5000E+01   |   3.3809E-03  3.0827E-03  2.7396E-03  2.3529E-03
   8.0000E+01   |   1.9091E-03  1.6834E-03  1.4388E-03  1.1808E-03
   8.5000E+01   |   1.0551E-03  9.0291E-04  7.4543E-04  5.8760E-04
   9.0000E+01   |   5.5449E-04  4.6239E-04  3.7065E-04  2.8244E-04
   9.5000E+01   |   2.5001E-04  2.0330E-04  1.5859E-04  1.1731E-04
   1.0000E+02   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00

 Lambda
 ------
   Stock Price  |   Time to Maturity (months)
                |   5.0000E+00  4.5000E+00  4.0000E+00  3.5000E+00
  -----------------------------------------------------------------
   0.0000E+00   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   5.0000E+00   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   1.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   1.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   2.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   2.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   3.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   3.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   4.0000E+01   |   6.3243E+00  5.1893E+00  3.8089E+00  2.1118E+00
   4.5000E+01   |   1.0721E+01  9.9718E+00  9.2140E+00  8.4953E+00
   5.0000E+01   |   1.2381E+01  1.1807E+01  1.1228E+01  1.0636E+01
   5.5000E+01   |   1.1483E+01  1.0837E+01  1.0142E+01  9.3795E+00
   6.0000E+01   |   9.3227E+00  8.5840E+00  7.7870E+00  6.9211E+00
   6.5000E+01   |   6.9621E+00  6.2206E+00  5.4412E+00  4.6264E+00
   7.0000E+01   |   4.9268E+00  4.2651E+00  3.5937E+00  2.9227E+00
   7.5000E+01   |   3.3602E+00  2.8204E+00  2.2920E+00  1.7866E+00
   8.0000E+01   |   2.2221E+00  1.8126E+00  1.4248E+00  1.0683E+00
   8.5000E+01   |   1.4122E+00  1.1240E+00  8.5856E-01  6.2248E-01
   9.0000E+01   |   8.2686E-01  6.4587E-01  4.8252E-01  3.4083E-01
   9.5000E+01   |   3.7891E-01  2.9252E-01  2.1553E-01  1.4976E-01
   1.0000E+02   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00

 Rho
 ---
   Stock Price  |   Time to Maturity (months)
                |   5.0000E+00  4.5000E+00  4.0000E+00  3.5000E+00
  -----------------------------------------------------------------
   0.0000E+00   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   5.0000E+00   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   1.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   1.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   2.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   2.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   3.0000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   3.5000E+01   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
   4.0000E+01   |  -7.1918E+00 -6.0114E+00 -4.5204E+00 -2.5855E+00
   4.5000E+01   |  -8.4541E+00 -7.6378E+00 -6.8479E+00 -6.1657E+00
   5.0000E+01   |  -7.5988E+00 -6.9323E+00 -6.2879E+00 -5.6707E+00
   5.5000E+01   |  -5.8905E+00 -5.2837E+00 -4.6809E+00 -4.0772E+00
   6.0000E+01   |  -4.1854E+00 -3.6547E+00 -3.1306E+00 -2.6135E+00
   6.5000E+01   |  -2.8221E+00 -2.3904E+00 -1.9743E+00 -1.5775E+00
   7.0000E+01   |  -1.8437E+00 -1.5137E+00 -1.2055E+00 -9.2283E-01
   7.5000E+01   |  -1.1812E+00 -9.4071E-01 -7.2326E-01 -5.3162E-01
   8.0000E+01   |  -7.4513E-01 -5.7680E-01 -4.2921E-01 -3.0383E-01
   8.5000E+01   |  -4.5907E-01 -3.4659E-01 -2.5060E-01 -1.7161E-01
   9.0000E+01   |  -2.6550E-01 -1.9656E-01 -1.3892E-01 -9.2652E-02
   9.5000E+01   |  -1.2280E-01 -8.9807E-02 -6.2569E-02 -4.1033E-02
   1.0000E+02   |   0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00

  • 6〜29行目には株価と満期までの期間に対応したオプションの値が出力されています。
  • 33〜56行目には株価と満期までの期間に対応したThetaの値が出力されています。
  • 60〜83行目には株価と満期までの期間に対応したDeltaの値が出力されています。
  • 87〜110行目には株価と満期までの期間に対応したGammaの値が出力されています。
  • 114〜137行目には株価と満期までの期間に対応したLambdaの値が出力されています。
  • 141〜164行目には株価と満期までの期間に対応したRhoの値が出力されています。

ソースコード

(本ルーチンの詳細はd03ncf のマニュアルページを参照)

※本サンプルソースコードは科学技術・統計計算ライブラリである「nAG Fortranライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法


このソースコードをダウンロード
!   D03NCF Example Program Text
!   Mark 23 Release. nAG Copyright 2011.

    MODULE d03ncfe_mod

!      D03NCF Example Program Module:
!             Parameters and User-defined Routines

!      .. Use Statements ..
       USE nag_library, ONLY : nag_wp
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       INTEGER, PARAMETER                  :: nin = 5, nout = 6
    CONTAINS
       SUBROUTINE print_greek(ns,ntkeep,nt,s,t,grname,greek)

!         .. Implicit None Statement ..
          IMPLICIT NONE
!         .. Scalar Arguments ..
          INTEGER, INTENT (IN)                :: ns, nt, ntkeep
          CHARACTER (*), INTENT (IN)          :: grname
!         .. Array Arguments ..
          REAL (KIND=nag_wp), INTENT (IN)     :: greek(ns,ntkeep), s(ns), t(nt)
!         .. Local Scalars ..
          INTEGER                             :: i, j
!         .. Intrinsic Functions ..
          INTRINSIC                              len
!         .. Executable Statements ..
          WRITE (nout,*)
          WRITE (nout,*) grname
          WRITE (nout,*) ('-',i=1,len(grname))
          WRITE (nout,*) '  Stock Price  |   Time to Maturity (months)'
          WRITE (nout,99999) '|', (12.0_nag_wp*(t(nt)-t(i)),i=1,ntkeep)
          WRITE (nout,*) ' -----------------', ('------------',i=1,ntkeep)
          DO i = 1, ns
             WRITE (nout,99998) s(i), '|', (greek(i,j),j=1,ntkeep)
          END DO

          RETURN

99999     FORMAT (16X,A,1X,12(1P,E12.4))
99998     FORMAT (1X,1P,E12.4,3X,A,1X,12(1P,E12.4))
       END SUBROUTINE print_greek
    END MODULE d03ncfe_mod

    PROGRAM d03ncfe

!      D03NCF Example Main Program

!      .. Use Statements ..
       USE nag_library, ONLY : d03ncf, nag_wp
       USE d03ncfe_mod, ONLY : nin, nout, print_greek
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       LOGICAL, PARAMETER                  :: gprnt(5) = .TRUE.
!      .. Local Scalars ..
       REAL (KIND=nag_wp)                  :: alpha, x
       INTEGER                             :: ifail, kopt, ldf, ns, nt, ntkeep
       CHARACTER (1)                       :: mesh
!      .. Local Arrays ..
       REAL (KIND=nag_wp), ALLOCATABLE     :: delta(:,:), f(:,:), gamma(:,:),  &
                                              lambda(:,:), rho(:,:), s(:),     &
                                              t(:), theta(:,:), work(:)
       REAL (KIND=nag_wp)                  :: q(3), r(3), sigma(3)
       INTEGER, ALLOCATABLE                :: iwork(:)
       LOGICAL                             :: tdpar(3)
!      .. Executable Statements ..
       WRITE (nout,*) 'D03NCF Example Program Results'
       WRITE (nout,*)
!      Skip heading in data file
       READ (nin,*)
       READ (nin,*) ns, nt, ntkeep
       ldf = ns

       ALLOCATE (delta(ldf,ntkeep),f(ldf,ntkeep),gamma(ldf,ntkeep), &
          lambda(ldf,ntkeep),rho(ldf,ntkeep),s(ldf),t(nt),theta(ldf,ntkeep), &
          work(4*ns),iwork(ns))

!      Read problem parameters

       READ (nin,*) kopt
       READ (nin,*) x
       READ (nin,*) mesh
       READ (nin,*) s(1), s(ns)
       READ (nin,*) t(1), t(nt)
       READ (nin,*) alpha

!      Set up input parameters for D03NCF

       READ (nin,*) tdpar(1:3)
       READ (nin,*) q(1), r(1), sigma(1)

!      Call Black-Scholes solver
       ifail = 0
       CALL d03ncf(kopt,x,mesh,ns,s,nt,t,tdpar,r,q,sigma,alpha,ntkeep,f,theta, &
          delta,gamma,lambda,rho,ldf,work,iwork,ifail)

!      Output option values and possibly Greeks.

       CALL print_greek(ns,ntkeep,nt,s,t,'Option Values',f)

       IF (gprnt(1)) CALL print_greek(ns,ntkeep,nt,s,t,'Theta',theta)
       IF (gprnt(2)) CALL print_greek(ns,ntkeep,nt,s,t,'Delta',delta)
       IF (gprnt(3)) CALL print_greek(ns,ntkeep,nt,s,t,'Gamma',gamma)
       IF (gprnt(4)) CALL print_greek(ns,ntkeep,nt,s,t,'Lambda',lambda)
       IF (gprnt(5)) CALL print_greek(ns,ntkeep,nt,s,t,'Rho',rho)

    END PROGRAM d03ncfe


関連情報
Privacy Policy  /  Trademarks