pythonで学ぶ金融工学(Greeksの算出)

前回まででMC・Treeによるオプションプライシングを行ったが、プライスと同じくらい重要な指標がいくつかある。デルタ、ベガ、ガンマ、セータが大体有名(+Volga,Vannaなどはスキューとか考慮すると出てきたりするっぽい)。

デルタ:原資産が1円変わるとPVがいくら変わるか
ベガ:ボラティリティが1%かわるとPVがいくら変わるか
ガンマ:原資産価格が1円変わるとデルタがいくらかわるか
セータ:期間が変わるとPVがいくら変わるか

ということで、それぞれ、ある条件が変わった時に他のある指標・PV等がいくら変わるかというもの。特にデルタ、ベガが重要。

デルタを例にとると、株価が100円のときのオプションPVを5円、101円としたときのオプションPVを5.5円とすると、(5.5-5)/(101-100)=0.5となる。1円変わるとオプション価格は0.5円変わるということ。

ただし、たとえば株価が10円変わった時にオプション価格は5円かというと、そうではない。もう少し変わる。これはオプションは原資産価格と比例関係ではない点に起因する。なので、二次微分であるガンマの項目が重要になってくる。これはテイラー展開すると分かるが詳細は専門書に譲ることとする。

ということで、これをプログラムに落とすにはどうするかというと、少しだけ(例えば0.01)原資産価格を変えてPVの差をとり、変化分で割ればよい。プログラムは、前回のを多少変更させる。このとき、MCは乱数なので試行回数を増やさなければPVの値が安定しないため、Greeksの値も不安定になる。ので今回はTreeをベースにGreeksの計算を行う。

これは、前回の記事のTreeのコードの最後をprint→returnに変えて保存(新たなファイルをresultと名付けておく)。その上で、新しい関数でresultを利用すれば良い。たとえばデルタの場合には次のようになる。

#flag=1:Call
def delta(S,K,sigma,T,r,flag):
 import result
 pv1=result.TreeE(S,K,sigma,T,r,flag)
 pv2=result.TreeE(S+0.001,K,sigma,T,r,flag)
 return (pv2-pv1)/0.001

結果は(S,K,sigma,T)=(100,100,0.1,1)でツール0.5377に対しwoflramだと0.520....あまり良くないな。。改良ができそうだったら次回以降にご紹介。