Skip to content
Finance Lessons

Graph Neural Networks for Financial Networks & Systemic Risk

Systemic Risk and Contagion

The killer application for graph learning: how a single default cascades through an interbank lending network, why DebtRank and feedback loops capture the systemic fragility a per-firm tabular model structurally misses, and how a graph neural network learns a fragility score that embeds the network's topology.

22 min Updated Jun 23, 2026

Picture the night Lehman Brothers filed for bankruptcy in 2008. Lehman was, on its own balance sheet, a single firm — a large one, sure, but one node out of thousands. A tabular risk model staring at Lehman’s own financials might have flagged it as wobbly. What no per-firm model on Earth could see was the web: the money market funds that held Lehman paper, the banks that had lent to those funds, the funds that “broke the buck” and triggered a run, the frozen short-term funding markets that then starved healthy firms of cash. Lehman didn’t fail alone. It pulled.

That pull is systemic risk, and it is the single best argument for treating finance as a graph rather than a spreadsheet. A row in a table describes one bank in isolation. An edge in a network describes who owes whom — and contagion lives entirely in the edges. This lesson is the marquee application of everything you’ve built: node-level prediction (lesson 2), inductive message passing (lesson 3), and the blunt observation that the most dangerous risk in finance is the kind a table literally cannot represent.

What systemic risk is — and why a table can’t see it

Before you read — take a guess

Two banks have identical balance sheets — same capital, same assets, same leverage. A per-firm tabular model scores them. What does it necessarily miss?

Analogy. Systemic risk is the difference between asking “is this domino heavy?” and asking “where does this domino stand in the line?” A heavy domino lying alone topples and nothing happens. A light domino positioned so that twelve others lean on it can flatten the whole row. Or think of a power grid: a single substation’s own specs tell you almost nothing about whether its failure browns out three states. The danger is in the wiring, not the box.

Definition. Systemic risk is the risk that the failure or distress of one node in a financial network propagates through the network’s connections, damaging other nodes that were individually healthy. It is a property of the system, not of any single firm. Formally, if each bank ii has some health HiH_i, systemic risk asks how a shock to one HjH_j flows along the edges to change every other HiH_i — a question about the topology of connections, not about any one node’s column of features.

A per-firm tabular model scores each bank from a feature vector of its own attributes: capital ratio, leverage, asset quality, profitability. It produces a probability of that bank failing on its own terms. By construction it is blind to “who is connected to whom,” because the connection information was never in the table. You can stack a hundred features per firm and still never encode the one fact that matters for contagion: bank A’s fate is wired to bank B’s.

Worked example. Banks A and B both report a capital buffer of $50m, leverage of 10x, and pristine asset quality. A tabular model scores both at, say, a 2 percent one-year default probability — identical, because their rows are identical. But suppose bank A has lent $80m to a shaky hub that the network already knows is fragile, while bank B’s $80m is spread across ten rock-solid counterparties. If the hub defaults with a loss given default of 70 percent, bank A absorbs 0.70×80=560.70 \times 80 = 56 (in $m) in losses — more than its $50m buffer, so A fails. Bank B loses nothing comparable. Same table row, opposite fate. The model that scored them as twins was structurally wrong, and no amount of feature engineering on A’s own columns fixes it.

Warning:

The isolation fallacy

The deepest trap in risk modeling is scoring every firm in a vacuum and then summing the scores to estimate “system risk.” Contagion is not additive. Two banks that each look safe in isolation can be a tinderbox together if they are tightly wired — and the sum of two small per-firm probabilities tells you nothing about the joint cascade. Adding up isolated risks is exactly the calculation that missed 2008.

When to use it

Reach for a systemic-risk lens whenever the failures you care about are correlated through connections rather than independent: interbank lending, supply chains, payment systems, reinsurance webs, or any portfolio where counterparties overlap. If failures are genuinely independent — a diversified book of unrelated consumer loans, say — a per-firm model may be enough. The moment one entity’s collapse can cause another’s, you need the graph.

The interbank lending network

Before you read — take a guess

In an interbank lending network modeled as a directed graph, what does a directed weighted edge from bank X to bank Y most naturally represent?

Analogy. Think of the banking system as a plumbing diagram. Each bank is a tank of water (capital). Pipes connect the tanks, and each pipe carries water one way — from lender to borrower’s obligation. When a tank cracks (a bank defaults), the lenders upstream lose the water they were owed. A big pipe into a small tank is a recipe for flooding the floor.

Definitions. The interbank network is a directed, weighted graph:

  • Nodes are banks (or any financial firms).
  • A directed edge from XX to YY means XX lent to YY — so XX holds an exposure to YY. The edge weight wXYw_{X \to Y} is the size of that exposure (the amount XX stands to lose if YY goes bad).
  • Exposure is the amount a lender has at risk to a given counterparty.
  • A bank’s capital buffer CiC_i is the equity cushion it can burn before it becomes insolvent — losses up to CiC_i are survivable; losses beyond CiC_i mean failure.
  • Loss given default (LGD) is the fraction of an exposure that is actually lost when the borrower defaults. If YY owes $100 and you recover $40 in bankruptcy, the LGD is 60 percent. The realized loss to the lender is LGD×exposure\text{LGD} \times \text{exposure}.

Play with a live one below. Pick a bank to default, set the loss-given-default slider, and watch the loss ripple outward round by round. Notice that the same trigger bank can cause a tiny ripple or a system-wide collapse depending only on the LGD and on who sits downstream — the topology is doing the work.

Default cascade through a lending network
Fail bank:
ABCDEFG
HealthyStressedDefaulted
Rounds elapsed0Banks failed0 / 7

An interbank lending network. Pick a bank to default and watch losses cascade to its lenders round by round; the loss-given-default slider controls how much of each exposure is destroyed. Watch how a single seed default can topple banks several hops away once their cumulative losses exceed their capital buffer.

Worked example. Bank YY defaults owing $100 (in units) to lender XX. The recovery is poor, so LGD=60%\text{LGD} = 60\%. The loss flowing up the edge to XX is

lossX=LGD×exposure=0.60×100=60.\text{loss}_{X} = \text{LGD} \times \text{exposure} = 0.60 \times 100 = 60.

Now check XX‘s buffer. If XX holds a capital buffer CX=50C_X = 50, then its loss of 6060 exceeds its cushion of 5050 by 1010:

lossX=60>CX=50    X becomes insolvent.\text{loss}_X = 60 > C_X = 50 \implies X \text{ becomes insolvent}.

So XX — a bank that did nothing wrong, made one ordinary loan — also fails, in the next round. Had the LGD instead been 40 percent, XX‘s loss would have been 0.40×100=40<500.40 \times 100 = 40 < 50, and XX survives, bruised but standing. One slider, two completely different systems. That is the whole game.

Info:

Direction is not decoration

It is tempting to model lending as an undirected link — “A and B are connected.” Don’t. Exposure is asymmetric: if A lent to B, then A is hurt by B’s default, but B is not hurt by A’s. Collapsing the direction throws away exactly the information that tells you which way the losses flow. The graph must be directed, and the weights must be exposures.

When to use it

Model the interbank graph explicitly whenever you have, or can estimate, the bilateral exposures between firms — regulators with reporting data, a clearinghouse, or a fund-of-funds that knows its underlying counterparties. When exact exposures are hidden (the usual case for outside observers), the network is reconstructed statistically from aggregate balance-sheet items, and the reconstruction’s assumptions matter enormously for the cascade you’ll compute.

The default cascade

Before you read — take a guess

A default cascade propagates in rounds. A solvent bank fails in a given round when…

Analogy. A default cascade is dominoes, but with a twist: each domino only falls if enough weight lands on it. Round 0, you flick the first tile. Round 1, every tile it leans on takes the hit — but only the ones that can’t bear the load actually topple. Round 2, those new fallen tiles deliver their own pushes, and so on, until a round passes where nothing new falls. The line goes quiet, and you count the wreckage.

Definition. A default cascade is the round-by-round propagation of failures through the exposure graph:

  • Round 0. A set of seed banks default (the initial shock).
  • Each subsequent round tt. For every still-solvent bank ii, add up the losses it has taken from all counterparties that defaulted in rounds 0t10 \ldots t-1. Bank ii fails this round if those cumulative losses exceed its capital buffer:

jdefaultedLGD×wij  >  Ci.\sum_{j \,\in\, \text{defaulted}} \text{LGD} \times w_{i \to j} \;>\; C_i.

  • Stop when a full round produces no new defaults. The set of failed banks is the cascade’s footprint; the summed losses are its severity.

Worked example — a chain A → B → C. Read the arrows as exposures: AA lent to BB, and BB lent to CC. Suppose:

Edge (lender → borrower)ExposureLGDLoss to lender
C → B (B lent $120 to C)12050%0.50×120=600.50 \times 120 = 60
B → A (A lent $90 to B)9050%0.50×90=450.50 \times 90 = 45

with capital buffers CCC_C irrelevant (C is the seed), CB=50C_B = 50, and CA=40C_A = 40.

  • Round 0. CC defaults (the seed shock).
  • Round 1. BB had lent $120 to CC. Its loss is 0.50×120=600.50 \times 120 = 60. Compare to BB‘s buffer: 60>5060 > 50, so BB fails. Meanwhile AA has so far lost nothing (its borrower BB has not yet defaulted, only become insolvent this round), so AA holds.
  • Round 2. Now that BB has defaulted, AA‘s loss on its $90 loan to BB is 0.50×90=450.50 \times 90 = 45. Compare to AA‘s buffer: 45>4045 > 40, so AA fails too.
  • Round 3. No solvent banks remain with new losses. The cascade stops. One seed default (CC) flattened the entire chain — three banks down from one shock, two hops deep.

Notice the cascade reached AA even though AA never lent a cent to the original defaulter CC. AA was two hops away and still died. That is contagion: damage travels along paths, not just to immediate neighbours.

Warning:

Cascade depth is not just degree

A seductive shortcut is to rank banks by degree — how many connections they have — and call the high-degree ones “systemic.” Wrong. A low-degree but thinly-capitalised bank sitting on the path between two large clusters can topple and bridge a cascade that a fat, well-capitalised hub would have absorbed. What matters is the loss relative to each node’s buffer along the paths, not the raw count of edges. Degree is a hint, not the answer — exactly the kind of nuance the interactive graph above makes visible when you trigger a small-but-fragile node.

When to use it

Run an explicit cascade simulation when you need a mechanistic, auditable answer to “what happens if bank jj fails?” — stress testing, regulatory what-ifs, setting capital surcharges for systemically important banks. The cascade is transparent and causal: you can point at every domino. Its cost is that it needs the full exposure matrix and a choice of LGD, and it counts each path discretely (a bank is either failed or not), which is exactly the rigidity that motivates the next, smoother measure.

State the cascade rule in one line.

Pick the right option for each blank, then check.

In each round, a still-solvent bank fails when its cumulative losses from defaulted counterparties .

DebtRank — systemic impact without double-counting

Before you read — take a guess

DebtRank measures the fraction of total economic value potentially affected if a node becomes distressed. How does it differ from a naive 'add up losses along every path' count?

Analogy. The default cascade is a binary game of dominoes — a tile is up or down. DebtRank is more like measuring how far a rumor spreads through a town when one person gets nervous: not everyone panics fully, people pass along a fraction of their worry, and crucially, you don’t let the rumor bounce back and forth between the same two gossips forever inflating the count. You let each person spread their unease once, then tally how much of the town is rattled.

Definition. DebtRank is a recursive measure of the fraction of the system’s total economic value that would be affected if a node (or set of nodes) becomes distressed — not necessarily fully defaulted. Each node ii carries a distress level hi[0,1]h_i \in [0, 1] (00 = healthy, 11 = fully defaulted) and an economic value weight viv_i (its share of total system value, with ivi=1\sum_i v_i = 1). Distress propagates along edges with a relative-loss weighting: if borrower jj‘s distress rises by Δhj\Delta h_j, its lender ii absorbs impact proportional to the exposure wijw_{i \to j} relative to ii‘s own capital. The key discipline: each node is allowed to transmit its distress onward only once (it moves to an “inactive” state after passing it along), so feedback loops do not let impact circulate forever.

The DebtRank of an initial shock is then the economic-value-weighted increase in distress across the whole system, minus the seed’s own initial distress:

DebtRank  =  ivihi()    ivihi(0).\text{DebtRank} \;=\; \sum_{i} v_i \, h_i(\infty) \;-\; \sum_{i} v_i \, h_i(0).

Read it as: “of all the economic value in the system, what additional fraction ends up distressed because this node wobbled?” A DebtRank near 11 means this node can rattle essentially the whole system; near 00 means it is systemically peripheral.

Worked example — a stylised 3-node network. Let nodes be {1,2,3}\{1, 2, 3\} with equal economic value weights v1=v2=v3=1/3v_1 = v_2 = v_3 = 1/3. Let the impact passed from a distressed borrower to its lender be governed by relative exposures (already normalised by the lender’s capital):

Distressed nodepasses impact torelative-loss weight
120.8
230.5

Shock node 11 to full distress: h1=1h_1 = 1, others start at h2=h3=0h_2 = h_3 = 0.

  • Step 1. Node 11 (distressed) passes impact to node 22: h2min(1,  0+0.8×1)=0.8h_2 \leftarrow \min(1,\; 0 + 0.8 \times 1) = 0.8. Node 11 now goes inactive (it has spread its distress once and will not transmit again).
  • Step 2. Node 22 (now distressed at 0.80.8) passes impact to node 33: h3min(1,  0+0.5×0.8)=0.4h_3 \leftarrow \min(1,\; 0 + 0.5 \times 0.8) = 0.4. Node 22 goes inactive.
  • Step 3. Node 33 has no outgoing edge to pass along; it goes inactive. No node can transmit further — and critically, node 11 being inactive means node 33‘s distress cannot loop back into 11 and re-inflate the total. The walk terminates.

Final distress: h1=1, h2=0.8, h3=0.4h_1 = 1,\ h_2 = 0.8,\ h_3 = 0.4. The DebtRank (impact beyond the seed’s own value) is the value-weighted distress of everyone else:

DebtRank=13(0.8)+13(0.4)=13(1.2)=0.40.\text{DebtRank} = \tfrac{1}{3}(0.8) + \tfrac{1}{3}(0.4) = \tfrac{1}{3}(1.2) = 0.40.

So distressing node 11 puts an additional 40 percent of the system’s economic value into distress — even though only node 11 ever truly “defaulted.” A naive sum over walks that let distress bounce 123121 \to 2 \to 3 \to \ldots \to 1 \to 2 \ldots would have inflated this past any sensible bound; DebtRank’s walk-once rule keeps it honest.

Warning:

DebtRank is impact, not probability

Do not read a DebtRank of 0.40 as “a 40 percent chance this bank fails.” DebtRank says nothing about how likely the seed is to get into trouble — it is purely a measure of systemic impact given distress: if this node wobbles, how much of the system goes down with it. A bank can have a tiny default probability and a huge DebtRank (a too-big-to-fail hub) or a large default probability and a tiny DebtRank (a fragile but isolated minnow). Conflating the two is how you mis-rank what to bail out.

When to use it

Use DebtRank when you want a smooth, single number ranking nodes by systemic importance — who to capitalise more, who to watch, who to never let fail. Unlike the binary cascade, it captures partial distress and the contribution of weak (not yet failed) links, and it avoids the double-counting that plagues naive path-summing. Pair it with the cascade: the cascade tells you the discrete worst case, DebtRank gives you a continuous ranking for triage.

Pick a term, then click its definition.

Feedback loops and amplification

Before you read — take a guess

Two banks have no direct loan between them but both hold a large position in the same illiquid asset. Why are they still 'connected' for contagion purposes?

Analogy. Imagine two people standing on opposite ends of the same waterbed. They’ve never touched, never spoken — but when one flops down, the other gets launched. The mattress is the shared asset, and mark-to-market is the bounce. Now add a feedback twist: the launched person, scrambling, also flops, which bounces the first one again. That back-and-forth is a fire-sale spiral, and it is why systemic losses are nonlinear.

Definitions.

  • Mark-to-market accounting forces a bank to value assets at current market prices. If the price falls, the bank books a loss immediately, even without selling.
  • A fire sale happens when a distressed bank dumps assets to raise cash; the selling pressure pushes the price down.
  • Common-asset overlap is an indirect edge: two banks holding the same asset are linked even with no loan between them, because one’s fire sale marks down the other’s book. The “edge weight” is the size of their overlapping positions.
  • A fire-sale spiral is the feedback loop: distress → fire sale → price drop → mark-to-market losses at other holders → their distress → more fire sales → further price drops. Each lap feeds the next.

This feedback is why the system is nonlinear. A linear per-firm regression implicitly assumes losses add up independently: shock bank A, get loss A; shock bank B, get loss B; total loss = A + B. But with feedback, shocking A and B together produces losses larger than A + B, because A’s fire sale worsens B’s position, which worsens A’s, and so on. The linear model has no term for “your loss depends on the loss you caused in someone else,” so it systematically underestimates tail losses — precisely the losses you most need to size correctly.

Worked / illustrative example — an amplification multiplier. Suppose a shock would cause $100m of direct losses if the system were static. But each $1 of forced selling depresses the common asset’s price enough to create an additional $0.40 of mark-to-market losses across all holders, which triggers further selling, and so on. The total loss is a geometric series:

total loss=100×(1+0.4+0.42+0.43+)=100×110.4.\text{total loss} = 100 \times \left(1 + 0.4 + 0.4^2 + 0.4^3 + \cdots\right) = 100 \times \frac{1}{1 - 0.4}.

Compute the multiplier: 110.4=10.61.67\frac{1}{1 - 0.4} = \frac{1}{0.6} \approx 1.67. So the total loss is

100×1.67167,100 \times 1.67 \approx 167,

a 67 percent amplification over the $100m of direct damage. A linear model that booked only the first-round $100m would have understated the true loss by $67m. And the multiplier explodes as the per-lap feedback approaches 11: at a feedback of 0.80.8 the multiplier is 110.8=5×\frac{1}{1-0.8} = 5\times. Tail risk lives in that denominator.

Warning:

Why the linear model always under-reserves the tail

The dangerous failure mode is calibrating a loss model on calm periods, where feedback is near zero and losses really do look additive, then trusting it in a crisis, where feedback spikes and the multiplier blows up. The model isn’t “a bit off” in the tail — it is qualitatively wrong, because it has no representation of the loop at all. This is the mathematical fingerprint of every “nobody could have predicted” crisis: the loop term was missing from the model.

When to use it

Model feedback and indirect (common-asset) edges whenever leverage is high, assets are illiquid, and mark-to-market or margin rules can force selling — i.e., whenever a price drop can mechanically compel more selling. In those regimes the multiplier dominates the tail and ignoring it is malpractice. In genuinely liquid, low-leverage, hold-to-maturity settings the feedback is weak and a first-round (linear) estimate may suffice — but verify that assumption rather than assuming it.

Sort each item by whether it is a DIRECT contagion channel (a loan between two banks) or an INDIRECT channel (no loan, but still linked).

Place each item in the right group.

  • Common collateral whose price collapses in a fire sale
  • Bank X lent 100 to Bank Y and Y defaults
  • A interbank deposit that B fails to repay to A
  • Mark-to-market losses spreading through a shared asset price
  • A revolving credit line X extended to Y
  • Two banks both hold the same illiquid bond; one fire-sells it

Where the GNN comes in

Before you read — take a guess

A graph neural network's message passing has each node update its representation from its neighbours' representations, repeatedly. Why is that a natural fit for systemic risk?

Analogy. DebtRank and the cascade are like a recipe a human chef wrote out by hand: “to find a node’s distress, take its neighbours’ distress, weight by exposures, repeat.” A GNN is a chef who tastes thousands of finished dishes (simulated cascades) and learns to predict the outcome directly — same underlying logic of “the dish depends on its ingredients’ interactions,” but learned from examples rather than hand-coded, and fast enough to taste a new menu instantly.

The reframing — this is a node-level prediction task. Recall from lesson 2 that GNNs do node-level regression or classification. Systemic risk slots in perfectly:

  • Each node (bank) gets a fragility / systemic-importance score as its label.
  • The label can come from simulation (run thousands of cascades with random shocks and record each bank’s expected cascade loss or its DebtRank) or from history (realised losses in past stress episodes).
  • The features are the per-firm columns the tabular model used — capital, leverage, asset quality — but now the message passing adds the topology the table lacked.

The mechanism is the point. A GNN layer updates each bank’s hidden state hih_i from its neighbours’ states:

hi(+1)=σ ⁣(Whi()  +  jN(i)wij(normaliser)hj()).h_i^{(\ell+1)} = \sigma\!\left( W \, h_i^{(\ell)} \;+\; \sum_{j \in \mathcal{N}(i)} \frac{w_{i \to j}}{\,\text{(normaliser)}\,}\, h_j^{(\ell)} \right).

Read it next to the DebtRank update hij(relative loss)hjh_i \leftarrow \sum_j (\text{relative loss}) \, h_j. They are the same shape: a node’s new state is a weighted combination of its neighbours’ states, stacked over rounds/layers. The cascade hand-codes the weights and the threshold; the GNN learns them from data. Stack LL layers and a node “feels” everything within LL hops — exactly the multi-round reach of a cascade. And because lesson 3 gave you inductive GraphSAGE, the trained GNN can score a new bank that wasn’t in the training graph, by aggregating its neighbours — no retraining required.

Worked intuition. Train on simulated labels: for each of the 3,000 banks, run 10,000 random shock scenarios, record the bank’s average cascade loss, and use that as its target. The GNN learns a function from (own features + neighbourhood structure) to expected systemic loss. At inference it produces that score in milliseconds per bank, versus the minutes-to-hours a fresh 10,000-scenario simulation would take — a fast, differentiable surrogate for the simulator. Differentiable matters: you can now ask “which exposure, if trimmed, most reduces system fragility?” by reading gradients, something a discrete simulation can’t hand you directly.

Warning:

The GNN does not replace the structural model

A trained GNN is a surrogate and a feature-enricher, not a substitute for the mechanistic cascade. The cascade is causal and auditable; the GNN is fast and topology-aware but is only as good as the simulated/historical labels it learned from. Use the GNN to add the network features a linear model structurally lacks, and to approximate the simulator at speed — then validate it against the real simulation, especially in the tail, where the training labels are sparsest. A surrogate that was never checked against the thing it surrogates is just a faster way to be wrong.

Here is the comparison the whole lesson has been building toward:

Per-firm tabular modelNetwork / GNN model
What each node seesOnly its own features (capital, leverage, asset quality)Its own features plus its neighbours’, aggregated over multiple hops
Direct contagion (X lent to Y)Invisible — no edges in the dataCaptured by message passing along exposure edges
Multi-hop cascadesInvisible — scores each firm in isolationCaptured by stacking layers (each layer = one more hop)
Feedback / fire-sale amplificationUnderestimated — assumes losses add linearlyCan learn the nonlinear amplification from simulated labels
Indirect common-asset linksInvisible — no edge without a loanCaptured by adding common-asset edges to the graph
New, unseen bankScores it from its row like any otherInductively scores it from its neighbours (GraphSAGE)
Auditability / causalityTransparent but structurally blindLess transparent; must be validated against the structural simulation
Tip:

Coming next: don't let the topology leak

Because a GNN learns from who is connected to whom, naively splitting nodes at random into train and test leaks the answer: a test node’s neighbours (and their labels) sit in the training set, so the model ‘cheats’ by peeking across the edge. Topology-aware splits — holding out whole connected regions, or whole time periods — matter enormously here, far more than in tabular finance. The next lesson is entirely about this leakage trap.

When to use it

Bring in a GNN when (1) you have a usable graph (estimated exposures and/or common-asset overlaps), (2) you can generate labels from simulation or history, and (3) you need either speed (a real-time fragility score across thousands of banks) or features (topology signals to feed a downstream model). Stick with the bare structural cascade when you need a one-off, fully-auditable answer and have time to simulate. And never deploy the GNN’s score without checking it against the simulator it learned from.

If the cascade simulation is causal and auditable, why bother learning a GNN surrogate at all?

Answer. Three reasons. Speed: scoring thousands of banks in real time, or inside an optimisation loop, is infeasible if every evaluation re-runs ten thousand cascade scenarios; the GNN approximates the simulator in milliseconds. Differentiability: the GNN gives you gradients, so you can ask “which exposure should I cut to most reduce system fragility?” — a question the discrete simulation answers only by brute-force re-running. Generalisation / features: the learned representation captures topology signals you can feed into other models, and inductive GraphSAGE scores brand-new banks without re-simulating the whole system. The simulation remains the ground truth you validate against — the GNN is the fast, smooth, differentiable stand-in, not a replacement.

Recap

You came in knowing that a per-firm model scores each bank from its own row. You leave knowing why that is structurally fatal for the most important risk in finance: contagion lives in the edges, and a table has no edges. You traced a default cascade round by round, watched a bank two hops from the shock die anyway, and saw that depth is about loss-versus-buffer along paths, not raw degree. You met DebtRank — a smooth, walk-once measure of systemic impact (not probability) — and the fire-sale feedback loops whose amplification multiplier makes the system nonlinear and humbles every linear model in the tail. And you saw the punchline: a GNN’s message passing is the neighbour-depends-on-neighbour recursion that DebtRank hand-codes, so it can learn a fast, topology-aware fragility score — a surrogate for the simulator, validated against it, not a replacement.

Big picture

Systemic risk and contagion

  • Systemic risk
    • Why a table cant see it
      • Scores each firm in isolation
      • No edges = no who-owes-whom
      • Contagion is not additive
    • Interbank network
      • Nodes = banks
      • Directed edge X to Y = X lent to Y
      • Weight = exposure; loss = LGD x exposure
      • Capital buffer absorbs losses
    • Default cascade
      • Round 0 seed defaults
      • Fail if cumulative loss > buffer
      • Reaches nodes many hops away
      • Depth is not just degree
    • DebtRank
      • Walk-once, no double-count
      • Continuous distress h in 0..1
      • Impact, not default probability
    • Feedback amplification
      • Fire sales + mark-to-market
      • Common-asset = indirect edge
      • Multiplier 1/(1-feedback)
      • Linear model under-reserves tail
    • Where the GNN comes in
      • Node-level fragility score
      • Message passing = the recursion
      • Inductive GraphSAGE for new banks
      • Surrogate, validate vs simulation
Build the map: why tables fail, the cascade machinery, the smooth measure, the nonlinear loop, and where the GNN slots in.

Mixed check: did the contagion reach you?

Question 1 of 50 correct

Banks A and B have identical balance sheets. A per-firm tabular model scores them identically. Why can this be dangerously wrong?

Check your answer to continue.

Mark lesson as complete