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....あまり良くないな。。改良ができそうだったら次回以降にご紹介。