プレーンバニラをモンテカルロ・シミュレーションにより評価
株価モデルを離散化して株価のシミュレーションを行います。シミュレーションされたそれぞれの株価に対してストック・オプションの評価額を算出し、resultなる箱に格納して返します。
library(Rcpp)
cppFunction('
NumericVector MC_plain(double S0, double K, int n_step, int n_path, double r, double q, double sigma) {
NumericVector result(n_path);
for(int path = 0; path < n_path; path++) {
NumericVector sample_path(n_step);
NumericVector normal_rand(n_step);
normal_rand = rnorm(n_step);
sample_path(0) = S0 * exp( (r-q-sigma*sigma/2) + sigma*normal_rand(0) );
for(int i = 1; i < n_step; i++) {
sample_path(i) = sample_path(i-1) * exp( (r-q-sigma*sigma/2) + sigma*normal_rand(i) );
}
result(path) = sample_path(n_step-1) > K ? (sample_path(n_step-1) - K ) * exp(-r*n_step) : 0;
}
return(result);
}
')
使い方
{
S0 <- 1000 # 株価
K <- 1000 # 行使価額
sigma <- 0.5 # ボラティリティ
r <- 2 / 100 # 無リスク金利
q <- 20 # 配当額(年額)
Y <- 10 # 満期
}
{
# インプットの変換
sigma <- sigma / sqrt(252)
r <- log(r + 1) / 252
q <- log((q/S0) + 1) / 252
n_step <- Y * 252
}
n_path <- 1000000 # シミュレーション回数
result <- MC_plain(S0, K, n_step, n_path, r, q, sigma)
mean( result ) # 評価額の出力
MC_plain()の戻り値は、(上の設定では)株価100万パスそれぞれに対する評価額が格納された配列です。それを(わざわざ)mean()で平均値を算出して評価額を出す形としています。後に、これを利用してシミュレーション誤差の分析を行います
時間間隔の調整
上の「使い方」はバリア・オプション等での活用を想定し、日次で株価を発生させるものとなっています。従って、満期時の株価だけが必要なプレーンバニラを評価するうえでは、リソースの壮絶な無駄遣いをしています。
月次でのシミュレーションとする場合は、
{
sgm <- sgm / sqrt(12)
r <- log(r + 1) / 12
q <- log((q/S0) + 1) / 12
Y <- Y * 12
}
としてシミュレーションの時間間隔を調整します。ハードル条件の判定は月末時点での株価による判定を想定することになります。
プレーンバニラの評価にあたっては満期時の株価のみが必要で、日次でシミュレーションをする必要はありません。
下のように調整すれば、現時点の株価から一気に満期時点の株価をシミュレーションして評価額を求めることができます。
{
sgm <- sgm / sqrt(1/Y)
r <- log(r + 1) / (1/Y)
q <- log((q/S0) + 1) / (1/Y)
Y <- Y * (1/Y)
}
この場合、満期\( T \)までを1ステップのみとし、sgm、r、qを10年分に相当するよう変換しています。
これにより、\( \sigma \rightarrow \sigma \sqrt{T} \)、また、\( r \rightarrow T \log{(1+r)} = \log{(1+r)^T} \)と変換され、\( r \)については実際に割引の計算をしてみると、\( e^{-\log{(1+r)^T}} = 1/(1+r)^T \)となり、想定した通りの計算となっています。
早期行使のある場合の評価
いくつかのアプローチがあり、LSM法(最小二乗モンテカルロ法)と呼ばれるものが考え方(理論面)及びコード(実装面)とも比較的容易ですが、ストック・オプションの評価に適用すると誤差が大きくなります(注)。
また、バックワード計算を行うアプローチを採用する場合、100 万個なりのサンプルパスすべてを保存しておく必要があります。よほどハイスペックなコンピュータを使用しているのでない限り、サンプル数を十分に大きくすることができません。
(注)筆者が諸々試行錯誤した結果。筆者の不勉強によるかもしれません。