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

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

MENU

ファイナンス練習(2021年09月13日)

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

7. Monte Carloシミュレーション

7.3 オプションの評価

 Black-ScholesモデルをMonte Carlo法にて評価する。
 株価S(t)が幾何ブラウン運動に従うと仮定しよう:


\begin{aligned}
dS(t)=rS(t)dt+\sigma S(t) dz(t)
\end{aligned}

ここでrは無リスク金利\sigmaボラティリティz(t)ブラウン運動とする。
 本モデルにおいて


\begin{aligned}
Y(t)=\log{S(t)}-\log{S(0)}
\end{aligned}

とおき、伊藤の公式を適用すべくf(x,t)=\log{x}とおけば


\begin{aligned}
f_t(x,t)=0,\ \ f_x(x,t)=\frac{1}{x},\ \ f_{xx}(x,t)=-\frac{1}{x^2}
\end{aligned}

が得られる。伊藤の公式から


\begin{aligned}
dY(t)=\left(r-\frac{\sigma^2}{2}\right)dt+\sigma dz(t), \ \ Y(0)=0
\end{aligned}

が導かれる。この両辺をtについてt:0\rightarrow T積分することで


\begin{aligned}
Y(T)=\left(r-\frac{\sigma^2}{2}\right)T+\sigma z(T)
\end{aligned}

すなわち


\begin{aligned}
Y(T)\sim N\left(\left(r-\frac{\sigma^2}{2}\right)T, \sigma^{2}T\right)
\end{aligned}

である。以上から


\begin{aligned}
S(T)=S(0)\exp{\left[\left(r-\frac{\sigma^2}{2}\right)T+\sigma\varepsilon\sqrt{T}\right]}
\end{aligned}

ここで\varepsilon \sim N(0,1)とする。
 リスク中立化法により、ペイオフ関数h(S)をもつ満期がTのヨーロピアン・オプション価格は


\begin{aligned}
c(S,T)=E^{*}\left[\frac{h(S(T))}{B(T)}\right]
\end{aligned}

である。ただしS(0)=S, E^{*}はリスク中立確率に関する期待値、


\begin{aligned}
B(t)=\exp{\left\{\int_{0}^{t}r(u) du \right\}}
\end{aligned}

とする。
 たとえば、ペイオフ関数がh(S)=(S-K)^2に従うパワー・オプションの価格をMonte Carlo法にて評価しよう。ここでは満期Tにおける株価の分布が既知(S(T)=S(0)\exp{\left[\left(r-\frac{\sigma^2}{2}\right)T+\sigma\varepsilon\sqrt{T}\right]})であるから、

  1. 正規乱数y_i\sim N\left(\left(r-\frac{\sigma^2}{2}\right)T,\sigma^2T \right)N個生成する。
  2. 満期Tにおける株価をs_T^{(i)}=Se^{y_i}とおく。
  3. デリバティブ価格を以下で与える:


\begin{aligned}
c(S,T)\approx \frac{e^{-rT}}{N}\sum_{i=1}^{N}(s_T^{(i)}-K)^2
\end{aligned}

7.4 C#での実装

 Box-Muller法の実装結果も併せて掲載する。

7.4.1 コード
using System;
using MathNet.Numerics;

/// <summary>
/// Box-Muller法により正規乱数を生成する
/// </summary>
/// <param name="N">生成したい乱数の数</param>
/// <param name="Mean">乱数が従う分布の平均</param>
/// <param name="Std">乱数が従う分布の標準偏差</param>
/// <returns>N(Mean,Std^2)に従う正規乱数N個</returns>
public static List<double> BoxMuller(int N, double Mean, double Std)
{
    var ret = new List<double>();

    double[] ret1 = new double[N];
    double[] ret2 = new double[N];

    var Random = new MathNet.Numerics.Random.MersenneTwister();

    Random.NextDoubles(ret1);
    Random.NextDoubles(ret2);

    double sample = 0.0;

    for (int i = 0; i < N; i++)
    {
        sample = Math.Sqrt(-2.0 * Math.Log(ret1[i])) * Math.Cos(2.0 * Math.PI * ret2[i]);
        sample = Std * sample + Mean;

        ret.Add(sample);
    }

    return ret;
}

/// <summary>
/// パワーオプションの価格をMonte Carlo法にて評価する
/// </summary>
/// <param name="S">原資産価格</param>
/// <param name="K">行使価格</param>
/// <param name="r">無リスク金利</param>
/// <param name="T">満期までの期間</param>
/// <param name="std">ボラティリティ</param>
/// <param name="N">シミュレーション回数</param>
/// <returns>パワーオプション価格</returns>
public static double SimPowerOption(int S, int K, double r, double T, double std, int N)
{
    double ret = 0.0;

    List<double> SimReturn = BoxMuller(N, (r - 0.5 * Math.Pow(std, 2.0)) * T, Math.Pow(std, 2.0) * T);
    double Stock = 0.0;

    foreach (double Return in SimReturn)
    {
        Stock = S * Math.Exp(Return);
        ret += Math.Pow(Stock - K, 2.0);
    }

    ret *= Math.Exp(-r * T);
    ret /= N;

    return ret;
}

以上でシミュレーションが可能である。

7.4.2 シミュレーション結果

 実際にシミュレーション結果を掲げる。それに当たり、改めて実装対象となる評価式を確認しておこう。


\begin{aligned}
c(S,T)\approx \frac{e^{-rT}}{N}\sum_{i=1}^{N}\left[S\exp\left\{\left(r-\frac{\sigma^2}{2}\right)T+ \sigma\sqrt{T}\varepsilon\right\}-K\right]^2
\end{aligned}

である。ここで\varepsilon\sim N(0,1)である。
 このように複数のパラメータが関わることから、各パラメータを動かしつつ前掲したコードでシミュレーションした。なお動かさないパラメータ値は以下の通りである:

パラメータ値
刻み
初期時点の株価S
150
1
行使価格K
150
1
無リスク金利r
2.00\%
0.02\%
満期までの年数T
0.5
0.5
ボラティリティ\sigma
20\%
1\%
シミュレーション数N
10,000
50


図表1 原資産価格Sおよび行使価格K1ずつ動かしたときのパワーオプション価格推移
f:id:suguru_125:20210913061104j:plain


図表2 無リスク金利r0.02\%ずつ動かしたときのパワーオプション価格推移
f:id:suguru_125:20210913061114j:plain


図表3 満期T0.5年ずつ動かしたときのパワーオプション価格推移
f:id:suguru_125:20210913061125j:plain


図表4 ボラティリティ\sigma0.01(=1\%)ずつ動かしたときのパワーオプション価格推移
f:id:suguru_125:20210913061737j:plain


図表5 シミュレーション回数N50回ずつ増やしたときのパワーオプション価格推移
f:id:suguru_125:20210913061142j:plain

プライバシーポリシー お問い合わせ