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

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

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

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

2. グリークス(続き)

 オプションは、理論価格があるために、入力パラメータが明示的にわかっている。あらためて挙げるとこのとおり:

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

このため、この5つの変化がオプション価格に影響を与える。そこでリスク(価格変化)を管理するには、それらが変化したときにオプション価格がどの程度動くかを評価する。各パラメータに対する価格変化の指標をまとめてグリークス(Greeks)という。
 なお行使価格Kは契約で決まっている(定数である)ため、リスク管理には用いない。

2. 6 シータ

 満期までの時間Tの変化に対するオプション価格の変化をシータ\Thetaという。


\begin{aligned}
\theta_{c}&=-\displaystyle{\frac{\partial c}{\partial T}}\,\\
\theta_{p}&=-\displaystyle{\frac{\partial p}{\partial T}}\
\end{aligned}

プット・オプションのシータは、プット・コール・パリティを用いれば*1


\begin{aligned}
\theta_{p}&=-\displaystyle{\frac{\partial}{\partial T}(c-S+Ke^{-rT})}\,\\
&=\theta_{c}+rKe^{-rT}
\end{aligned}

と同値である。
 さらに展開してみよう。


\begin{aligned}
\theta_{c}&=-\displaystyle{\frac{\partial c}{\partial T}}\,\\
&=-\displaystyle{\frac{\partial}{\partial T}(S\Phi (d)-Ke^{-rT}\Phi(d-\sigma \sqrt{T}))}\,\\
&=-\displaystyle{S\phi(d)\frac{\partial d}{\partial T}-rKe^{-rT}\Phi(d-\sigma \sqrt{T})+Ke^{-rT}\phi(d-\sigma \sqrt{T})\frac{\partial (d-\sigma \sqrt{T})}{\partial T}}
\end{aligned}

である。ここに


\begin{aligned}
\frac{\partial d}{\partial T}&=\displaystyle{\frac{\partial}{\partial T}(\frac{\log{(\frac{S}{K})}+(r+\frac{1}{2}\sigma^{2})T}{\sigma\sqrt{T}})}\\
&=\displaystyle{\frac{1}{\sigma}\frac{\partial}{\partial T}\{\log{\frac{S}{K}}T^{-\frac{1}{2}}+(r+\frac{1}{2}\sigma^{2})T^{\frac{1}{2}}}\}\\
&=\displaystyle{\frac{1}{2\sigma}\{-\log{\frac{S}{K}}T^{-\frac{3}{2}}+(r+\frac{1}{2}\sigma^{2})T^{-\frac{1}{2}}}\}
\end{aligned}

および


\begin{aligned}
\frac{\partial (d-\sigma \sqrt{T})}{\partial T}&=\frac{\partial d}{\partial T}-\frac{\sigma}{2}T^{-\frac{1}{2}}\\
&=\displaystyle{\frac{1}{2\sigma}\{-\log{\frac{S}{K}}T^{-\frac{3}{2}}+rT^{-\frac{1}{2}}}\}
\end{aligned}

を代入することで


\begin{aligned}
\theta_{c}&=-\displaystyle{S\phi(d)\frac{\partial d}{\partial T}-rKe^{-rT}\Phi(d-\sigma \sqrt{T})+Ke^{-rT}\phi(d-\sigma \sqrt{T})\frac{\partial (d-\sigma \sqrt{T})}{\partial T}}\\
&=-\displaystyle{S\phi(d)\{\frac{1}{2\sigma}(-\log{\frac{S}{K}}T^{-\frac{3}{2}}-rT^{-\frac{1}{2}})\}+rKe^{-rT}\Phi(d-\sigma \sqrt{T})}\\
&\ \ \ \ \ +Ke^{-rT}\phi(d-\sigma \sqrt{T})\{\frac{1}{2\sigma}(-\log{\frac{S}{K}}T^{-\frac{3}{2}}+rT^{-\frac{1}{2}})\}\\
&=-rKe^{-rT}\Phi(d-\sigma\sqrt{T})-\frac{\sigma S}{2\sqrt{T}}\phi(d)
\end{aligned}

 プット・オプションの場合、


\begin{aligned}
\theta_{p}&=\theta_{c}+rKe^{-rT}
\end{aligned}

まとめよう:

  • コール・オプションのシータ\displaystyle{\theta_{c}=-rKe^{-rT}\Phi(d-\sigma\sqrt{T})-\frac{\sigma S}{2\sqrt{T}}\phi(d)}\
  • プット・オプションのシータ\theta_{p}=\theta_{c}+rKe^{-rT}

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