業務でC#を用いることになったので、最近勉強していなくて朧気になってきた知識をReviseする意味でも、以下の書籍を読みながらC#で実装してみる。昨日は別のことをしていたので進んでおらず。今日はP.17-18まで。
2. グリークス(続き)
オプションは、理論価格があるために、入力パラメータが明示的にわかっている。あらためて挙げるとこのとおり:
このため、この5つの変化がオプション価格に影響を与える。そこでリスク(価格変化)を管理するには、それらが変化したときにオプション価格がどの程度動くかを評価する。各パラメータに対する価格変化の指標をまとめてグリークス(Greeks)という。
なお行使価格は契約で決まっている(定数である)ため、リスク管理には用いない。
2. 6 シータ
満期までの時間の変化に対するオプション価格の変化をシータ\Thetaという。
プット・オプションのシータは、プット・コール・パリティを用いれば*1
と同値である。
さらに展開してみよう。
である。ここに
および
を代入することで
プット・オプションの場合、
まとめよう:
- コール・オプションのシータ
- プット・オプションのシータ
2.7 C#での実装
前回と同様に、理論値および数値解それぞれのメソッドを実装した:
using System; using MathNet.Numerics; /// <summary> /// シータの理論値を返す。 /// </summary> /// <param name="S">原資産価格</param> /// <param name="K">行使価格</param> /// <param name="r">リスクフリーレート</param> /// <param name="sigma">原資産価格のボラティリティ</param> /// <param name="T">満期までの期間</param> /// <param name="CallPutFlg">コール・プットを表すフラグ。0ならばコール・オプション、1ならばプット・オプションの価格を返す。</param> /// <returns>ヨーロピアン・コール・オプションまたはプット・オプションのシータ</returns> public static double Theta(double S, double K, double r, double sigma, double T, int CallPutFlg) { double d = Math.Log(S / K) + (r + 0.5 * Math.Pow(sigma, 2.0)) * T; d /= (sigma * Math.Sqrt(T)); double theta = -r * K * Math.Exp(-r * T) * MathNet.Numerics.Distributions.Normal.CDF(0.0,1.0,d - sigma * Math.Sqrt(T)); theta -= sigma * S/(2 * Math.Sqrt(T))*MathNet.Numerics.Distributions.Normal.PDF(0.0,1.0,d); if (CallPutFlg == 1.0) { theta += K * r * Math.Exp(-r * T); } return theta; } /// <summary> /// シータの数値微分による値を返す。 /// </summary> /// <param name="S">原資産価格</param> /// <param name="K">行使価格</param> /// <param name="r">リスクフリーレート</param> /// <param name="sigma">原資産価格のボラティリティ</param> /// <param name="T">満期までの期間</param> /// <param name="CallPutFlg">コール・プットを表すフラグ。0ならばコール・オプション、1ならばプット・オプションの価格を返す。</param> /// <returns>コール・オプションまたはプット・オプションのシータ。</returns> public static double ThetaByNumericalDifferential(double S, double K, double r, double sigma, double T, int CallPutFlg) { double Bin = 0.00001; double sign = -2.0 * CallPutFlg + 1.0; double theta = OptionPricing(S, K, r, sigma, T + Bin, CallPutFlg); theta -= OptionPricing(S, K, r, sigma, T - Bin, CallPutFlg); theta /= (2.0 * Bin); return theta; }