「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。

MENU

ファイナンス練習(2021年08月21日)

 業務でC#を用いることになったので、最近勉強していなくて朧気になってきた知識をReviseする意味でも、以下の書籍を読みながらC#で実装してみる。今日はP.8まで。

1. オプションとは?

 オプションは、「事前に定めた将来時点(まで)に予め定められた価格である金融資産を買う(売る)権利」を指す。売買対象となる金融資産を原資産(underlying asset)、あらかじめ定めた売買価格を行使価格(strike price)という。原資産を「買う」権利を扱うオプションをコール・オプション、「売る」権利を扱うものをプット・オプションという。権利行使を行うタイミングは、オプションごとに定められている。事前に決めた将来時点ちょうどにのみ売買の権利を行使できるタイプをヨーロピアン(European)、任意のタイミングで行使できるタイプをアメリカン(American)、満期までの複数の事前に定められたタイミングで行使できるものをバミューダン(Bamudan)という。
 オプションの価格を取り扱うには、以下の入力値が必要となる:

  • 原資産価格:S
  • 行使価格:K
  • (初期時点を0としたときの)将来時点(ここでは単位:年):T
  • リスクフリーレート:r
  • 原資産価格のボラティリティ(リスク・標準偏差):\sigma

1. Black-Scholes方程式に基づくオプション価格

1.1 コール(プット)・オプションの価格

 配当のない株式を原資産とするヨーロピアン・コール・オプションの価格

cは、Black-Scholes方程式から解析的に書ける:


c=S\Phi (d)-Ke^{-rT}\Phi(d-\sigma \sqrt{T}),\\
\displaystyle{d=\frac{\log⁡{(\frac{S}{K})}+(r+\frac{1}{2}\sigma^{2})T)}{\sigma\sqrt{T}}}\

ここで、\Phi(x)は標準正規分布の分布関数を表す。すなわち


\displaystyle{\Phi(x) =\int_{-\infty}^{x} \frac{1}{\sqrt{2\pi}}e^{-\frac{y^2}{2}}dy}\
である。
 プット・オプションの価格pの場合はこうなる:


p=-S\Phi (-d)+Ke^{-rT}\Phi(-d+\sigma \sqrt{T})

1.2 プット・コール・パリティ

 1.1.で求めた価格式から、同条件のヨーロピアン・コール・オプションとヨーロピアン・プット・オプションの価格には

p=c-S+Ke^{-rT}
が成り立つ。この関係式をプット・コール・パリティという。コール・オプションの性質が分かればプット・オプションの性質もこの式から簡単に求めることができるため、重要な式である。

 この式が本当に成り立つか確認しておこう。プット・コール・パリティの右辺式にコール・オプションの価格式を代入すると


\begin{aligned}
(右辺)&=c-S+Ke^{-rT},\\
&=S\Phi(d)-Ke^{-rT}\Phi(d-\sigma\sqrt{T})-S+Ke^{-rT},\\
&=S(\Phi(d)-1)+Ke^{-rT} (1-\Phi(d-\sigma\sqrt{T}))
\end{aligned}
が得られる。

 ここで標準正規分布の分布関数\Phi(x)について


\begin{aligned}
1-\Phi(x)&=1-\displaystyle{\int_{-\infty}^{x} \frac{1}{\sqrt{2\pi}}e^{-\frac{y^2}{2}}dy}\,\\
&=\displaystyle{\int_{-\infty}^{\infty} \frac{1}{\sqrt{2\pi}}e^{-\frac{y^2}{2}}dy-\int_{-\infty}^{x} \frac{1}{\sqrt{2\pi}}e^{-\frac{y^2}{2}}dy}\,\\
&=\displaystyle{\int_{x}^{\infty} \frac{1}{\sqrt{2\pi}}e^{-\frac{y^2}{2}}dy.}\
\end{aligned}

 変数変換z=-yを考えると、 y:x\rightarrow\inftyに対し z:-\infty\rightarrow -xであり、またdy=-dzであるから


\begin{aligned}
1-\Phi(x)&=\displaystyle{\int_{x}^{\infty} \frac{1}{\sqrt{2\pi}}e^{-\frac{y^2}{2}}dy}\,\\
&=-\displaystyle{\int_{-\infty}^{-x} \frac{1}{\sqrt{2\pi}}e^{-\frac{z^2}{2}}dz}\,\\
&=-\Phi(-x).
\end{aligned}

 この性質を用いれば、


\begin{aligned}
(右辺)&=S(\Phi(d)-1)+Ke^{-rT} (1-\Phi(d-\sigma\sqrt{T})),\\
&=-S\Phi(-d)+Ke^{-rT}\Phi(-d+\sigma\sqrt{T})
\end{aligned}

となるが、これはヨーロピアン・プットオプションの価格式pに等しい。

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;
    }
}
プライバシーポリシー お問い合わせ