43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
|
|
"""
|
||
|
|
Sheet 2: Commercial Bank Model.
|
||
|
|
|
||
|
|
Part II — 2.2. Loan creation: dLoans = dDeposits.
|
||
|
|
Capital constraint: CR = Equity / RWA >= k. Loans_max = Equity / k.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from dataclasses import dataclass
|
||
|
|
from typing import Optional
|
||
|
|
|
||
|
|
from fqbm.state import FQBMState
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class CommercialBankParams:
|
||
|
|
"""Parameters for commercial bank credit."""
|
||
|
|
k: float = 0.08 # minimum capital ratio (e.g. 8%)
|
||
|
|
d_deposits: float = 0.0 # exogenous deposit change → dLoans = dDeposits
|
||
|
|
|
||
|
|
|
||
|
|
def commercial_bank_step(
|
||
|
|
state: FQBMState,
|
||
|
|
params: Optional[CommercialBankParams] = None,
|
||
|
|
) -> FQBMState:
|
||
|
|
"""
|
||
|
|
Apply one period: dLoans = dDeposits (endogenous money). Equity unchanged unless losses.
|
||
|
|
"""
|
||
|
|
params = params or CommercialBankParams()
|
||
|
|
out = state.copy()
|
||
|
|
out.Loans += params.d_deposits
|
||
|
|
out.Deposits += params.d_deposits
|
||
|
|
return out
|
||
|
|
|
||
|
|
|
||
|
|
def loans_max(equity: float, k: float) -> float:
|
||
|
|
"""Maximum credit capacity: Loans_max = Equity / k (Part II — 2.2)."""
|
||
|
|
return equity / k if k > 0 else 0.0
|
||
|
|
|
||
|
|
|
||
|
|
def capital_ratio(equity: float, rwa: float) -> float:
|
||
|
|
"""CR = Equity / RWA."""
|
||
|
|
return equity / rwa if rwa > 0 else 0.0
|