業務でC#を用いることになったので、最近勉強していなくて朧気になってきた知識をReviseする意味でも、以下の書籍を読みながらC#で実装してみる。今日はP.8まで。
1. オプションとは?
オプションは、「事前に定めた将来時点(まで)に予め定められた価格である金融資産を買う(売る)権利」を指す。売買対象となる金融資産を原資産(underlying asset)、あらかじめ定めた売買価格を行使価格(strike price)という。原資産を「買う」権利を扱うオプションをコール・オプション、「売る」権利を扱うものをプット・オプションという。権利行使を行うタイミングは、オプションごとに定められている。事前に決めた将来時点ちょうどにのみ売買の権利を行使できるタイプをヨーロピアン(European)、任意のタイミングで行使できるタイプをアメリカン(American)、満期までの複数の事前に定められたタイミングで行使できるものをバミューダン(Bamudan)という。
オプションの価格を取り扱うには、以下の入力値が必要となる:
1. Black-Scholes方程式に基づくオプション価格
1.1 コール(プット)・オプションの価格
配当のない株式を原資産とするヨーロピアン・コール・オプションの価格
1.2 プット・コール・パリティ
1.1.で求めた価格式から、同条件のヨーロピアン・コール・オプションとヨーロピアン・プット・オプションの価格には
この式が本当に成り立つか確認しておこう。プット・コール・パリティの右辺式にコール・オプションの価格式を代入すると
ここで標準正規分布の分布関数について
変数変換を考えると、
に対し
であり、また
であるから
この性質を用いれば、
1.3 C#での実装
コール・プット・オプションの価格を実装した。
using System; using MathNet.Numerics; /// <summary> /// Black-Scholes方程式に基づくオプション価格を返す /// </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 OptionPricing(double S, double K, double r, double sigma, double T, int CallPutFlg) { if (CallPutFlg == 0 | CallPutFlg == 1) { double flg = -2.0 * CallPutFlg + 1.0; double d = Math.Log(S / K) + (r + 0.5 * Math.Pow(sigma, 2.0)) * T; d /= sigma * Math.Sqrt(T); double Price = S * MathNet.Numerics.Distributions.Normal.CDF(0.0, 1.0, flg * d); Price = flg * Price - flg * K * Math.Exp(-r * T) * MathNet.Numerics.Distributions.Normal.CDF(0.0, 1.0, flg * (d - sigma * Math.Sqrt(T))); return Price; } else { Console.WriteLine("CallPutFlg must be either 0 or 1."); return -99999; } }