技術とか戦略とか

証券レガシーシステムを8年いじってから転職した普通の文系SEによるブログ。技術のみではなく趣味の戦略考察についても。

Excelでモンテカルロシミュレーションを試してみた

Excelでごく簡単なモンテカルロシミュレーションを試してみる記事です。
 
モンテカルロシミュレーションとは、ランダムな試行を繰り返すことで解に近い結果を導き出すもので、複雑で解を出すのが困難な問題に対して適用すると比較的短時間で解に近い結果を得ることができます。
簡単な問題に対してはExcelで十分対応できます。
 
例題として、以下の問題をモンテカルロシミュレーションで解いてみます。
妥当性を確認するため、あえて容易に解を出せる問題にしています。
 
【例題】
ドラゴンに対する勇者の攻撃は80%の確率で命中し、ダメージは90~99の間の整数値を取り、ドラゴンのHPが95である場合、ドラゴンを倒せる確率(HPを0以下にできる確率)は何%か?
 
【正解】
攻撃によるダメージが95~99の時にドラゴンを倒すことができる。攻撃が命中すると仮定した場合、95~99のダメージが出る確率は50%である。
よって、80%×50%=40%(0.4)の確率でドラゴンを倒すことができる。
 
モンテカルロシミュレーションの実装】
rand関数により乱数を発生させ、1000回シミュレーションを行う。

https://cdn-ak.f.st-hatena.com/images/fotolife/a/akira2kun/20180809/20180809233936.jpg?1533825594

A3の式…=IF(INT(RAND()*10)<8,"命中","外れ")
B3の式…=IF(A3="命中",90+INT(RAND()*10),0)
C3の式…=IF(B3>94,"倒せる","倒せない")
A3~C3はA1002~C1002までコピペ
D3の式…=COUNTIF(C3:C1002,"倒せる")/COUNTA(C3:C1002)
 
D3に出力される値がモンテカルロシミュレーションの結果となる。
 
モンテカルロシミュレーションの結果】
上記の画像では0.411であり、回答の0.4に近い結果を得られたが誤差があることがわかる。
なお、F9キーを押して何度も再計算すると0.4より小さい値になることもあることが確認できる。
今回は1000回の試行のため誤差が大きくなっているが、試行回数を増やせば精度が高まることが予想される。
-----------------------
なお、再帰的な計算が必要になる、DBにアクセスする必要がある等、複雑なケースの場合はスクリプト言語やプログラム言語を用いる必要があります。
私は趣味でモンテカルロシミュレーションを3回適用したことがありますが、Excelで済んだのは1回だけでした。