銀行エンジニアリング 34:同じ時点の入力(スナップショット)と信用リスク
リスクを比べるには、同じ時点の同じデータで測る必要があります。入力を1つに凍結し、信用リスクを期待損失として計算します。MiniBank v18の式と、欠測の扱いを確かめます。
v8以降に実装した台帳・記帳エンジンなどを実際に動かし、正常時と異常時の両方から銀行システムの構造を学ぶ。
Prerequisite: BANKING SYSTEMLEARNING GOALS
このページで学ぶこと
- 入力を凍結する理由
- 期待損失 = EAD × PD × LGD
- 欠測を 0 とみなさない
PLAIN LANGUAGE
まず、ここだけつかむ
リスクを比べるには、同じ時点の入力(スナップショット)で測る必要があります。
信用リスクは、期待損失 = EAD × PD × LGD で、延滞の区分ごとに計算します。
入力が欠けたときは 0 とみなさず、理由と一緒に『欠測』として示します。
DIFFICULT PARTS, STEP BY STEP
難しいポイントを、順番にほどく
専門用語を覚えることより、「なぜ必要か」「このシステムのどこで使うか」を理解することが目標です。
EAD/PD/LGD
貸出残高/返せなくなる確率/返せなくなったときの損失の割合です。
『返ってこない可能性』を金額で表すためです。
risk.credit_calc。架空の仮定で、区分ごとの確率。
スナップショット
ある時点の入力を凍結した記録です。
あとから同じ結果を再現するためです。
risk.snapshots。追記専用、入力ハッシュつき。
欠測
入力が得られないことです。
0 と区別しないと、リスクを過小に見積もるためです。
sources の MISSING と理由。依存する指標は null。
Level 1 基礎:昼に測ったリスクと、夜に測ったリスクは比べられない
リスクの数字は、その時点の貸出、預金、障害の状況で決まります。測るたびに入力が変わると、数字が変わった理由が『状況が変わったから』なのか『測り方を変えたから』なのか分かりません。そこで、入力を1つの時点に凍結(スナップショット)し、その凍結した入力から、いくつものシナリオを計算します。
| 入力 | 何を凍結するか |
|---|---|
| 信用 | 有効な融資契約ごとの、元金残高、未収利息、延滞の区分 |
| ALM | 資金の位置、満期別のギャップ、方針、市場の基準値 |
| 預金価格 | 営業日に有効な価格と、預金・定期預金の残高 |
| インシデント | 過去90日の障害と、まだ解決していない障害の重大度・所要時間 |
Level 2 銀行業務:期待損失の計算
融資が返ってこない可能性を、金額で表したものが期待損失です。
期待損失 = EAD(貸出残高+未収利息)× PD(返せなくなる確率)× LGD(返せなくなったときの損失の割合)。延滞の区分ごとに確率を変えます。
- ストレスでは、PD を2倍にし、LGD に10ポイントを足します(どちらも上限は100%)。上の表なら合計は209,000円になります。PD と LGD は教育用の架空の仮定で、実在の統計ではありません。
| 区分 | EAD | PD | LGD | 期待損失 |
|---|---|---|---|---|
| 現在(延滞なし) | 1,000,000円 | 1% | 45% | 4,500円 |
| 延滞(1〜29日) | 500,000円 | 10% | 45% | 22,500円 |
| 30日以上の延滞 | 200,000円 | 40% | 45% | 36,000円 |
| デフォルト確定 | 100,000円 | 100% | 45% | 45,000円 |
| 合計 | 1,800,000円 | — | — | 108,000円(損失率 6%) |
Level 3 システム:MiniBankでの実装
- risk.capture が入力を凍結し、md5の入力ハッシュを付けて追記専用に保存する。状態が変わらなければ、2回取っても同じハッシュになる
- 延滞の区分は、融資の画面と同じ規則(lending.aging)で決める。デフォルトを確定した契約は DEFAULT_CONFIRMED
- 未収利息の計上が営業日に追いついていない契約は、入力に含めたうえで『古い未収利息』の注意を記録する。黙って0とみなさない
- 算出は risk.credit_calc のような純粋な関数(読むのは引数だけ)。現在の時刻も、現在のGLも読まないので、あとから同じ結果を再現できる
- 契約が0件でも、入力元は『欠測』ではなく正当な0件。ただし損失率は作らない(0除算を避け、null にする)
異常時:入力元が欠けている
| 段階 | 内容 |
|---|---|
| 症状 | 管理画面に『欠測の入力があります』と出る。市場・流動性の欄が『欠測』 |
| 原因の例 | Treasuryの方針の行が無い |
| MiniBankの動き | その指標は値を出さず、理由を示す。合算からは除き、除いたことを明記する。預金価格が欠けたときだけは、預金金利にv13の市場の仮定を使い、そう置いたことを警告に残す |
| 対応 | 入力元を直してから、新しいスナップショットを取る。過去のスナップショットは変えない |
Level 4 アーキテクチャ:再現できることが信頼の土台
リスクの計算を『いつ、誰が、何に基づいて』再現できないと、説明も監査もできません。入力の凍結、パラメータの版、シナリオ、モデルの版を全部保存し、同じ組み合わせなら同じ結果になるようにします。
どこを確認すればよいか
- 管理画面『リスク管理』:スナップショットの一覧(入力元の状態・注意)、信用リスクの内訳
- Lab:延滞した契約を作り、区分が変わることを確かめる
CHECK YOUR UNDERSTANDING
3問で理解チェック
答えを頭の中で考えてから、各項目を開いて確認してください。
Q1延滞30日以上の契約のPDは?
架空の仮定で 40% です(承認済みの版)。
Q2契約が0件のとき、損失率は?
作りません(null)。0除算を避けます。
Q3スナップショットを後から書き換えられますか?
できません。追記専用で、入力ハッシュが合わなくなります。
完全に暗記する必要はありません。大切な考え方を説明できそうなら押してください。
SOURCE TRAIL
根拠と関連教材
CURRENT IMPLEMENTATIONは確認したrepository内の実装です。HISTORICAL IMPLEMENTATIONは導入・修正の履歴で、後続migrationによる再定義があり得ます。RELATED LESSONは教材への案内で、実装の一次Sourceではありません。ASSUMPTIONは仮定、UNKNOWNは未確認を表します。
確認基点: d02eae8914f39cbf06bfe422dc39c71886f82b3e / 2026-09-11。稼働環境への適用確認: UNKNOWN。パス実在の自動検査と、記述した技術的事実の確認は別です。
Implementation Status: IMPLEMENTED IN MINIBANK(この教材が扱うコードの範囲)
- RELATED LESSON/docs/be-lending-delinquency-default延滞とデフォルトの区分
- RELATED LESSON/docs/be-risk-market-liquidity-operational金利・流動性・オペレーショナル
- CURRENT IMPLEMENTATION
supabase/migrations/20260930140000_v18_risk.sqlrisk.capture融資・ALM・預金価格・インシデントを1つの時点に凍結する(欠測と注意を記録) - CURRENT IMPLEMENTATION
supabase/migrations/20260930140000_v18_risk.sqlrisk.credit_calc信用リスク:EAD × PD × LGD(区分ごと、円未満切り捨て) - CURRENT IMPLEMENTATION
scripts/banking/v18-risk.test.mjs式の手計算、v13との一致、凍結と再現、欠測、元帳を書かないこと、決裁のDBテスト