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

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

MENU

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

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

2. グリークス(続き)

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

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

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

2.4 ロー

 リスクフリーレートrの変化に対するオプション価格の変化をローという。


\begin{aligned}
\rho_{c}&=\displaystyle{\frac{\partial c}{\partial r}}\,\\
\rho_{p}&=\displaystyle{\frac{\partial p}{\partial r}}\
\end{aligned}

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


\begin{aligned}
\rho_{p}&=\displaystyle{\frac{\partial}{\partial r}(c-S+Ke^{-rT})}\,\\
&=\rho_{c}-KTe^{-rT}
\end{aligned}

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


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

である。ここに


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

および


\begin{aligned}
\frac{\partial d-\sigma \sqrt{T}}{\partial r}&=\frac{\sqrt{T}}{\sigma}\\
\end{aligned}

を代入することで


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

さらに


\phi(d-\sigma\sqrt{T})=\phi(d)(\frac{S}{K})e^{rT}

を代入することで


\begin{aligned}
\rho_{c}&=\displaystyle{S\phi(d)\frac{\sqrt{T}}{\sigma} +KTe^{-rT}\Phi(d-\sigma \sqrt{T})-Ke^{-rT}\phi(d)(\frac{S}{K})e^{rT}\frac{\sqrt{T}}{\sigma}}\\\
&=\displaystyle{S\phi(d)\frac{\sqrt{T}}{\sigma} +KTe^{-rT}\Phi(d-\sigma \sqrt{T})-S\phi(d)\frac{\sqrt{T}}{\sigma}}\\\
&=\displaystyle{KTe^{-rT}\Phi(d-\sigma \sqrt{T})}\
\end{aligned}

を得る。
 プット・オプションの場合、


\begin{aligned}
\rho_{p}&=\rho_{c}-KTe^{-rT}\\
&=\displaystyle{KTe^{-rT}\Phi(d-\sigma \sqrt{T})-KTe^{-rT}}\\\
&=-\displaystyle{KTe^{-rT}(1-\Phi(d-\sigma \sqrt{T}))}\\\
&=KTe^{-rT}\Phi(-d+\sigma \sqrt{T})
\end{aligned}

まとめよう:

  • コール・オプションのロー\rho_{c}=KTe^{-rT}\Phi(d-\sigma \sqrt{T})
  • プット・オプションのロー\rho_{p}=KTe^{-rT}\Phi(-d+\sigma \sqrt{T})

2.5 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 Rho(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 sign = -2.0 * CallPutFlg + 1.0;

    double Rho = sign * K * T * Math.Exp(- r * T) * MathNet.Numerics.Distributions.Normal.CDF(0.0, 1.0, sign * (d - sigma * Math.Sqrt(T)));
    return Rho;
}

/// <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 RhoByNumericalDifferential(double S, double K, double r, double sigma, double T, int CallPutFlg)
{
    double Bin = 0.00001;

    double sign = -2.0 * CallPutFlg + 1.0;

    double rho = OptionPricing(S, K, r + Bin, sigma, T, CallPutFlg);
    rho -= OptionPricing(S, K, r - Bin, sigma, T, CallPutFlg);
    rho /= (2.0 * Bin);

    return rho;
}
プライバシーポリシー お問い合わせ