(%i1) | load(distrib)$ |
(%i2) | snormal(y):=cdf_normal(y,0,1); |
--> | /* 正規密度関数を定義 */; |
--> | /* 正規累積密度関数を定義 */; |
--> | /* 以下はブラックショールズのコールオプション式を定義 */; |
--> | /* s=株式時価 x=権利行使価格 sigma=年率ボラティリティ(標準偏差) */; |
--> | /* T=残存年数(残存日数30日なら T=30/365 r=年率金利 */; |
(%i3) | d1(s, x, sigma, T, r):=(log(s/x)+(r+sigma^2/2)*T)/(sigma*sqrt(T)); |
(%i4) | d2(s, x, sigma, T, r):=d1(s, x, sigma, T, r)-sigma*sqrt(T); |
(%i6) | float(bsCall(42, 40, 0.2, 0.5, 0.1)); |
(%i7) | dd1:float(d1(42, 40, 0.2, 0.5, 0.1)); |
(%i8) | bsPut(s,x,sigma,T,r):=bsCall(s,x,sigma,T,r)+x*exp(-r*T)-s$ |
(%i9) | float(bsPut(42, 40, 0.2, 0.5, 0.1)); |
(%i10) | wxplot2d(bsCall(s, 40, 0.2,0.5, 0.1),[s,0.01,50]); |
(%i11) | wxplot2d(bsPut(s, 40, 0.2,0.5, 0.1),[s,0.01,50]); |
/* 累積密度関数を微分すれば密度関数となる */;
オプションのデルタについてオプションのデルタはコールの価格式を株価sで偏微分すれば求まるが、これが意外に一筋縄ではいかない。何故なら正規分布関数の引数d1、 d2 にはsが含まれており、ややこしい合成関数の微分となってしまう。この辺の証明は上記のよくわかるブラック・ショールズモデル 蓑谷千凰彦 に書かれているので、それを参考にして数式処理する。なお、HullのOptions,Futures and other derivatives では練習問題として取り上げられており、Solutions manualの中で詳しい証明が示されている。 \[\frac{\partial C}{\partial s}= Φ(d1)+\{s・ \frac{\partial Φ(d1)}{\partial s}-x・ exp^{-rT} \frac{\partial Φ(d2)}{\partial s}\} \] 上式は株価sで偏微分した結果になるが{ }で括った部分がゼロとなることが確かめられればデルタはΦ(d1) つまり標準正規分布関数となる。括弧の部分がゼロとなることをmaximaで確かめると以下のようになる。 |
(%i12) | z1:diff(snormal(d1),d1); |
(%i13) | z2:diff(d1(s, x, sigma, T, r),s); |
(%i14) | z3:z1*z2; |
(%i15) | z4:diff(snormal(d2),d2); |
(%i16) | z5:s*z1-x*exp(-r*T)*z4; |
--> | /* subst(代入する式,変数名,式)は(式z5式)中の(変数-d1^2/2)に */; |
--> | /* (代入する式(-r*T-log(s/x)-d2^2/2))を代入する */; |
(%i17) | z6:subst((-r*T-log(s/x)-d2^2/2),-d1^2/2,z5); |
(%i18) | DELT:z1+z6; |
(%i19) | define (Delta(s, x, sigma, T, r),diff(bsCall(s, x, sigma, T, r),s))$ |
(%i20) | float(Delta(42, 40, 0.2, 0.5, 0.1)); |
(%i21) | wxplot2d(Delta(s, 40, 0.2,0.5, 0.1),[s,0.01,50]); |
(%i22) | wxplot3d(Delta(s, 40, 0.2,T, 0.1),[T,0.1,0.95],[s,0.1,80]); |