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