Mímisbrunnr知恵の泉

← 意思決定分析 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:経営の意思決定とシナリオ分析VaR(バリュー・アット・リスク) | 関連:CVaR(期待ショートフォール)・ベイズ統計(サンプリング)

要点(BLUF)

1. なぜモンテカルロか

経営の意思決定とシナリオ分析は、悲観・基準・楽観の数シナリオで結論の幅を見ました。しかし現実の不確実性は連続的で、要因も複数。「悲観と楽観の間」がどんな分布になるか、複数要因が同時にブレたら結果はどう散らばるか——離散シナリオでは捉えきれません。

モンテカルロは、各入力に確率分布(三角分布・正規分布など)を与え、そこから何万通りもの組み合わせをランダムに引いて、そのたびに結果を計算します。結果を集めると、出力の分布が得られる。これがリスクプロファイル——「結果がどんな確率でどの値になるか」の全体像です。点推定が「平均は2876」と1点を言うのに対し、モンテカルロは「平均2876だが、48%の確率で赤字、最悪は−10万」と分布を語ります。

2. NPVのリスクプロファイルを作る

設備投資のNPVを、単価・原価・数量に三角分布(最小・最頻・最大)を与えてシミュレートします。

import numpy as np

rng = np.random.default_rng(7)
N = 100_000
r = 0.10
pv_factor = np.sum(1 / (1+r)**np.arange(1, 5))   # 4年の年金現価係数

# 不確実な入力(三角分布:最小・最頻・最大)
price     = rng.triangular(80, 100, 115, N)      # 単価(万円)
unit_cost = rng.triangular(50, 60, 75, N)        # 単位原価(万円)
volume    = rng.triangular(700, 1000, 1300, N)   # 数量
fixed     = 20000                                # 固定費(万円/年)

annual_profit = (price - unit_cost) * volume - fixed
npv = annual_profit * pv_factor - 50000          # 初期投資 50000 万円

print(f"NPV 平均       = {npv.mean():,.0f} 万円")
print(f"NPV 標準偏差   = {npv.std():,.0f} 万円")
print(f"P(NPV < 0)(損失確率) = {np.mean(npv < 0):.3f}")

loss = -npv
var95 = np.quantile(loss, 0.95)
cvar95 = loss[loss >= var95].mean()
print(f"損失の95% VaR  = {var95:,.0f} 万円")
print(f"損失の95% CVaR = {cvar95:,.0f} 万円")

出力:

NPV 平均       = 2,876 万円
NPV 標準偏差   = 31,537 万円
P(NPV < 0)(損失確率) = 0.478
損失の95% VaR  = 47,380 万円
損失の95% CVaR = 57,831 万円

出力の意味:期待NPVは+2,876万——点推定だけ見れば「わずかにプラス、やる価値あり」。ところがリスクプロファイルを見ると、損失確率は47.8%(ほぼコイン投げ)、標準偏差は3万超で平均をはるかに上回るブレ。95% VaRは約4.7万、CVaR(裾の平均)は約5.8万の損失。**「平均はプラスだが、半分近い確率で赤字、最悪は数万の損失」**という実像が見えます。点推定の「平均+2876」だけで投資を決めると、この大きな下方リスクを見落とす——モンテカルロは期待値の裏にある分布を暴きます。

3. リスクプロファイルの可視化と意思決定

得られたNPV分布をヒストグラムにすると、意思決定者が直感的に理解できるリスクプロファイルになります。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib

rng = np.random.default_rng(7); N = 100_000; r = 0.10
pv_factor = np.sum(1/(1+r)**np.arange(1, 5))
price = rng.triangular(80, 100, 115, N)
unit_cost = rng.triangular(50, 60, 75, N)
volume = rng.triangular(700, 1000, 1300, N)
npv = ((price - unit_cost)*volume - 20000)*pv_factor - 50000

plt.figure(figsize=(7.5, 4.5))
plt.hist(npv, bins=120, density=True, alpha=0.6, color="seagreen")
plt.axvline(0, color="black", lw=1)
plt.axvline(npv.mean(), color="red", lw=2, label=f"平均NPV={npv.mean():,.0f}")
plt.axvline(np.quantile(npv, 0.05), color="orange", lw=2,
            label=f"5%点={np.quantile(npv,0.05):,.0f}")
plt.xlabel("NPV(万円)"); plt.ylabel("確率密度")
plt.title(f"NPVのリスクプロファイル(損失確率={np.mean(npv<0):.0%})")
plt.legend(); plt.grid(alpha=0.3); plt.tight_layout(); plt.show()

図の意味:NPV分布が0(黒線)をまたいで広がり、左側(赤字)に相当の面積があります。赤線の平均はわずかにプラスですが、オレンジの5%点(下側5%の境界)は大きくマイナス——稀ではない悪いシナリオで深い損失。この図を経営層に見せれば、「期待値はプラスだが、これだけの下方リスクを許容できるか」というリスク選好の議論リスク選好と効用の凹凸)に持ち込めます。点推定の1つの数字では決して起きない対話です。モンテカルロの出力分布に効用(期待効用と効用関数)を適用すれば期待効用での判断に、VaR/CVaR(第5章)を適用すればリスク量での判断に繋がります。

数式の直観的意味:大数の法則で分布を「描く」

モンテカルロが機能する根拠は大数の法則です。出力 Y=g(X1,,Xk)Y = g(X_1, \dots, X_k) の分布を解析的に求めるのは、gg が非線形・多変数だとほぼ不可能。しかし、入力 XiX_i から NN 組サンプリングして YY を計算すれば、その経験分布は NN\to\infty で真の分布に収束します。期待値や確率は標本平均で推定でき、誤差は O(1/N)O(1/\sqrt{N}) で縮む——次元 kk によらない収束率が、高次元(多数の入力)で効きます(経営の意思決定とシナリオ分析の「連続の同時変動」)。

P(Y<0)1Nn=1N1[g(X(n))<0],E[Y]1Nn=1Ng(X(n))P(Y < 0) \approx \frac{1}{N}\sum_{n=1}^{N} \mathbf{1}[\,g(X^{(n)}) < 0\,], \qquad \mathbb{E}[Y] \approx \frac{1}{N}\sum_{n=1}^{N} g(X^{(n)})

決定的に重要なのは、XiX_i同時に引くので、要因間の相互作用や相関が自動で織り込まれること。一方向感度(偏微分)が見落とす「価格と数量が同時に悪化する」ような複合効果も、サンプリングなら自然に現れます。さらに入力分布に相関を入れたり(多変量サンプリング)、ベイズの事後分布から引いたり(ベイズ更新と意思決定の不確実性の伝播)と拡張も容易。モンテカルロは、感度分析を「偏微分 → 数シナリオ → 全要因の連続同時変動」と高解像度化した到達点であり、意思決定分析の理論(期待値・効用・リスク測度)を実務の数値に変換する万能の橋です。サンプリング法の数理(収束の加速・分散低減・MCMC)はベイズ統計・計算統計のturfへ繋ぎます。

⚠️ よくある誤解

対応シミュレーション

本文のコードで、入力分布の幅(不確実性)を変えると損失確率やVaR/CVaRが動きます。入力に相関を入れる、初期投資や割引率を変える、出力に効用を適用して期待効用で評価する、といった拡張も同じ枠組みで可能です。

関連ノート