Pythonでモンテカルロ法、コールオプションの価格計算

本記事の目的と対象

本記事の目的は、プレーンバニラ・コールオプションの価格を、Pythonを用いたモンテカルロ法により計算する方法を提供することである。

対象者は以下の条件を満たす読者である。
  • Pythonを使う環境が整っている人
  • オプションとは何かを理解している人
  • Pythonを用いてオプションのモンテカルロ・シミュレーションを実施したい人
また、以下の記事の内容を前提とする。

なお、本記事の内容は下記書籍の内容を参考にしているため、合わせて参照してほしい。

目次

モンテカルロ法によるオプション評価の概要

モンテカルロ法によって、将来の株価を乱数を用いてシミュレーションすることが出来る。

したがって、将来の株価に依存してキャッシュフローが変化する金融派生商品の価格もまた、モンテカルロ法により計算することが出来る。

オプションの権利行使日を\( T\)、権利行使価格を\( K\)とし、時点\( t\)における株価を\( S_t\)とすれば、
\[ \begin{split} Call~Value&=Max(S_T-K,0)\\ Put~Value&=Max(K-S_T,0) \end{split} \] と表現できるから、将来株価\(S_T \)がシミュレーションできれば、オプション価格もまた、計算できることになる。

ブラック・ショールズモデルにおける株価過程
\[ \begin{split} dS_t=\mu S_tdt+\sigma S_tdW_t\end{split} \] に「伊藤の公式」を適用することにより、時点\( T\)における株価は
\[ \begin{split}S_T=S_0e^{(\mu-\frac{1}{2}\sigma^2)T+\sigma W_T} \end{split} \] とかける。

離散形で表せば
\[ \begin{split}S_T=S_0e^{(\mu-\frac{1}{2}\sigma^2)T+\sigma \epsilon\sqrt{T}} \end{split} \] である。

この式における\( \epsilon\)に対応する乱数を多数発生させ、将来株価\( S_T\)を何通りも計算させることで、各\( S_T\)に対応したオプション価格を求め、その平均を計算することがモンテカルロ法によるオプション計算の手順である。

なお、実際にはリスク中立過程と呼ばれる修正した株価過程が用いられ、将来価格を現在価格に割り引く作業が必要である。

詳細は参考文献[1], [2]を参照のこと。

実際のプログラムに使用するコ-ルオプションの計算式は次のとおりである([2](2.4)式)。
\[ \begin{split} Call~Value\approx\frac{1}{N}\sum_{j=1}^{N}Max(S_{T,j}-K,0)\end{split} \]

ブラック・ショールズモデルにおけるオプション価格のPythonでのシミュレーションコード例

まず必要なモジュールのインポートを行う。

import numpy as np
from math import exp,sqrt
import random

次に必要なパラメタを入力する。

sigma=0.3
r=5/100
S_t=100
K=100
T=1

そして株価シミュレーションのための、幾何ブラウン運動の関数を定義する。

def gBM(S,sigma,mu,t,z):
    gBM= S*exp((mu- sigma**2/2)*t + sigma * sqrt(t) * z)
    return gBM

最後にモンテカルロ・シミュレーションのコアとなる計算を行う。

サンプル数(発生させる乱数の数、シミュレーション回数)を入力するとコールオプション価格を戻すような関数として記述する。

def BSMC_Call(n):               #n回のシミュレーション結果を返す関数
    S_T=np.zeros(n)             #権利行使日の株価を格納する配列
    Call_T=np.zeros(n)          #各株価に対応するオプション価格の配列
    Sum_Call_T=0                #Σmax(S_T-K,0)を計算するための変数
    for j in range(0,n-1):     
        S_T[j]=gBM(S_t,sigma,r,T,random.gauss(0,1))
        Call_T[j]= max(S_T[j]- K, 0)
        Sum_Call_T=Sum_Call_T+Call_T[j]
    Expected_Call_Value=Sum_Call_T / n
    Call_Value=exp(-r*T)*Expected_Call_Value #現在価値に割り引く
    return Call_Value

\( N=100,000\)で実際に計算させた結果は、以下の通りである。

>>>BSMC_Call(100000)

14.182652696218945

乱数を用いたシミュレーションであるから、計算結果は毎回違うことに注意してほしい。



まとめ

本記事では、株価が対数正規分布に従うブラック・ショールズモデルのもと、プレーンバニラオプションの価格をモンテカルロ・シミュレーションによって求めた。

幾何ブラウン運動を時点でシミュレーションする関数を明示しており、これにより株価のランダムな動きを再現できる。

この株価過程に様々なペイオフ条件を付加することで、多くの金融派生商品の価格を求めることが出来る。

参考文献

[1]大野 薫, 2012, モンテカルロ法によるリアル・オプション分析―事業計画の戦略的評価, きんざい
[2]森平 爽一郎, モンテカルロ法によるオプション価格決定, オペレーションズ・リサーチ学会