業務でC#を用いることになったので、最近勉強していなくて朧気になってきた知識をReviseする意味でも、以下の書籍を読みながらC#で実装してみる。今回はP.202-204まで。
7. Monte Carloシミュレーション
7.3 オプションの評価
Black-ScholesモデルをMonte Carlo法にて評価する。
株価が幾何ブラウン運動に従うと仮定しよう:
ここでは無リスク金利、
はボラティリティ、
はブラウン運動とする。
本モデルにおいて
とおき、伊藤の公式を適用すべくとおけば
が得られる。伊藤の公式から
が導かれる。この両辺をについて
で積分することで
すなわち
である。以上から
ここでとする。
リスク中立化法により、ペイオフ関数をもつ満期が
のヨーロピアン・オプション価格は
である。ただしはリスク中立確率に関する期待値、
とする。
たとえば、ペイオフ関数がに従うパワー・オプションの価格をMonte Carlo法にて評価しよう。ここでは満期
における株価の分布が既知(
)であるから、
- 正規乱数
を
個生成する。
- 満期
における株価を
とおく。
- デリバティブ価格を以下で与える:
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 シミュレーション結果
実際にシミュレーション結果を掲げる。それに当たり、改めて実装対象となる評価式を確認しておこう。
である。ここでである。
このように複数のパラメータが関わることから、各パラメータを動かしつつ前掲したコードでシミュレーションした。なお動かさないパラメータ値は以下の通りである:
パラメータ値 |
刻み |
|
| 初期時点の株価 |
||
| 行使価格 |
||
| 無リスク金利 |
||
| 満期までの年数 |
||
| ボラティリティ |
||
| シミュレーション数 |
図表1 原資産価格

図表3 満期

図表5 シミュレーション回数



