Mímisbrunnr知恵の泉

← 意思決定分析 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:VaR(バリュー・アット・リスク)CVaR(期待ショートフォール) | 関連:数理最適化(凸リスク最小化)

要点(BLUF)

1. 4つの公理

リスク測度 ρ(L)\rho(L)(損失 LL に対し必要資本のような実数を返す)が整合的であるとは、次の4条件を満たすことです。

このうち劣加法性が最も本質的です。これが破れると、「2つの部門を別会社にした方が、合算より必要資本が小さい」といった、分散投資の効果を否定する不合理が生じます。

2. VaR は劣加法性を破る

VaR が整合的でないことを、具体例で示します。独立な2つの社債 A・B。各々:確率0.97で生存し損失 −2(クーポン益)、確率0.03でデフォルトし損失 +100。

import numpy as np

p_def = 0.03
alpha = 0.95

def var_discrete(values, probs, alpha):
    order = np.argsort(values)
    v, p = values[order], probs[order]
    cum = np.cumsum(p)
    idx = min(np.searchsorted(cum, alpha), len(v)-1)
    return v[idx]

# 単独社債 A:損失 -2(0.97)、+100(0.03)
loss_A = np.array([-2.0, 100.0]); prob_A = np.array([1-p_def, p_def])
# ポートフォリオ A+B(独立):両生存 / 片方デフォルト / 両デフォルト
loss_AB = np.array([-4.0, 98.0, 200.0])
prob_AB = np.array([(1-p_def)**2, 2*(1-p_def)*p_def, p_def**2])

var_A = var_discrete(loss_A, prob_A, alpha)
var_AB = var_discrete(loss_AB, prob_AB, alpha)
print(f"VaR_0.95(A) = {var_A:.1f}  ->  VaR(A)+VaR(B) = {2*var_A:.1f}")
print(f"ポートフォリオ損失分布: {loss_AB} 確率 {np.round(prob_AB,4)}")
print(f"VaR_0.95(A+B) = {var_AB:.1f}")
print("劣加法性 VaR(A+B) <= VaR(A)+VaR(B):",
      "成立" if var_AB <= 2*var_A else "違反!(分散投資が罰される)")

出力:

VaR_0.95(A) = -2.0  ->  VaR(A)+VaR(B) = -4.0
ポートフォリオ損失分布: [ -4.  98. 200.] 確率 [0.9409 0.0582 0.0009]
VaR_0.95(A+B) = 98.0
劣加法性 VaR(A+B) <= VaR(A)+VaR(B): 違反!(分散投資が罰される)

出力の意味:単独の社債は、デフォルト確率3% < 5% なので 95% VaR は「生存時の損失 −2」(むしろ利益)。和は −4 です。ところがポートフォリオでは、少なくとも片方がデフォルトする確率が 10.972=7.84%>5%1-0.97^2 = 7.84\% > 5\% になり、95%水準でデフォルト損失98が顔を出す——VaR(A+B)=98。つまり 98>498 > -4 で、分散投資した方がVaRが激増。「分けて持てばリスクが減る」という直観に真っ向から反します。VaR が劣加法性を破る教科書的な例です。

3. CVaR は4公理を満たす

同じ例で、CVaR(期待ショートフォール)を正しい定義(最悪 1α1-\alpha の確率質量の平均、VaRバケットは部分的に取り込む)で計算すると、劣加法性が回復します。

import numpy as np

def es_discrete(values, probs, alpha):
    """期待ショートフォール:最悪 (1-alpha) の確率質量の平均損失"""
    order = np.argsort(values)[::-1]            # 損失の大きい順
    v, p = values[order], probs[order]
    tail = 1 - alpha
    acc_p, acc_val = 0.0, 0.0
    for vi, pi in zip(v, p):
        take = min(pi, tail - acc_p)            # 残りの裾質量だけ取り込む
        if take <= 0: break
        acc_val += vi * take; acc_p += take
    return acc_val / tail

p_def = 0.03
loss_A = np.array([-2.0, 100.0]); prob_A = np.array([0.97, 0.03])
loss_AB = np.array([-4.0, 98.0, 200.0])
prob_AB = np.array([0.97**2, 2*0.97*0.03, 0.03**2])

es_A = es_discrete(loss_A, prob_A, 0.95)
es_AB = es_discrete(loss_AB, prob_AB, 0.95)
print(f"CVaR_0.95(A) = {es_A:.2f}  ->  CVaR(A)+CVaR(B) = {2*es_A:.2f}")
print(f"CVaR_0.95(A+B) = {es_AB:.2f}")
print("劣加法性 CVaR(A+B) <= CVaR(A)+CVaR(B):",
      "成立(分散効果を正しく評価)" if es_AB <= 2*es_A + 1e-9 else "違反")

出力:

CVaR_0.95(A) = 59.20  ->  CVaR(A)+CVaR(B) = 118.40
CVaR_0.95(A+B) = 99.84
劣加法性 CVaR(A+B) <= CVaR(A)+CVaR(B): 成立(分散効果を正しく評価)

出力の意味:同じ社債でも CVaR で見ると、CVaR(A+B)=99.84 が個別の和 118.40 を下回り、劣加法性が成立します。つまり CVaR は「分散投資でリスクが減った(118→100)」と正しく評価する。VaR が −4 vs 98 で破綻したのと対照的です。CVaR は裾の平均を取るため、デフォルトの「深さ」を VaR のように見落とさず、合算の効果も整合的に扱えます。CVaR は単調性・正斉次性・移動不変性も満たし、整合的リスク測度です。

数式の直観的意味:公理は「測度の憲法」

4公理は天下りではなく、リスク測度が必要資本(バッファ)として機能するための最小要件です。

整合性の理論は「どんな測度が許されるか」を表現定理で特徴づけます——整合的リスク測度は、ある確率分布の集合(シナリオ集合)上での最悪期待損失 ρ(L)=supQQEQ[L]\rho(L) = \sup_{Q\in\mathcal{Q}} \mathbb{E}_Q[L] として書ける。これは確実性・リスク・不確実性の曖昧性回避(複数の確率を考え最悪を取る)と同じ構造で、リスク測度と不確実性下の意思決定が公理レベルで繋がっていることを示します。なお正斉次性を緩めた凸リスク測度へ拡張すると、流動性リスク(大きいポジションは比例以上に危険)も扱えます。

⚠️ よくある誤解

対応シミュレーション

本文の2つのコードが、VaRの劣加法性違反とCVaRの成立を同じ社債例で対比します。デフォルト確率 pp を動かすと、2(1p)(1p)22(1-p) - (1-p)^2… ではなく 1(1p)21-(1-p)^2 が5%を跨ぐ付近でVaRの違反が顕在化することを確認できます。

関連ノート