{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Liquidation Cascades\n",
        "\n",
        "*Last modified: November 11, 2026*\n",
        "\n",
        "This notebook simulates a lending protocol in a falling market. Two\n",
        "thousand borrowers have deposited ETH and borrowed dollar stablecoins\n",
        "against it. When the price of ETH falls, the loans whose health factor\n",
        "drops below one are liquidated, the liquidators sell the ETH they\n",
        "receive, and the sales push the price down further, which can trigger\n",
        "more liquidations. We measure how much a first price drop is amplified,\n",
        "and how that depends on how deep the market is and on how large the\n",
        "first drop is. The notes on [lending protocols and\n",
        "liquidations](../notes/defi-lending.qmd) explain the background.\n",
        "\n",
        "## Packages"
      ],
      "id": "9370acff-34e8-4273-9819-ba971a03eb45"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "\n",
        "rng = np.random.default_rng(0)"
      ],
      "id": "13fb3285"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## The loans\n",
        "\n",
        "Each borrower deposits some ETH, with amounts that vary a lot from\n",
        "borrower to borrower, and borrows USDC up to a chosen health factor\n",
        "between 1.05 and 2: some borrow cautiously, others close to the limit.\n",
        "ETH has a liquidation threshold of 0.80."
      ],
      "id": "26e7ad1c-f6ba-4dfb-b0c3-003706fa17be"
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collateral: 26,782 ETH, worth $80 million\n",
            "Debt: $44 million"
          ]
        }
      ],
      "source": [
        "P0 = 3_000          # price of ETH at the start\n",
        "THRESHOLD = 0.80    # liquidation threshold of ETH\n",
        "CLOSE_FACTOR = 0.5  # share of the debt a liquidator can repay at once\n",
        "BONUS = 0.05        # liquidation bonus\n",
        "\n",
        "n = 2_000\n",
        "collateral = rng.lognormal(np.log(10), 0.8, n)       # ETH deposited\n",
        "health = rng.uniform(1.05, 2.0, n)                   # health factor chosen at the start\n",
        "debt = collateral * P0 * THRESHOLD / health          # USDC borrowed\n",
        "liq_price = debt / (collateral * THRESHOLD)          # price at which the loan becomes liquidatable\n",
        "\n",
        "print(f\"Collateral: {collateral.sum():,.0f} ETH, worth ${collateral.sum() * P0 / 1e6:,.0f} million\")\n",
        "print(f\"Debt: ${debt.sum() / 1e6:,.0f} million\")"
      ],
      "id": "96117d8d"
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "image/png": "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\nQmCC\n"
          }
        }
      ],
      "source": [
        "fig, ax = plt.subplots(figsize=(7, 3.2))\n",
        "ax.hist(liq_price, bins=np.linspace(1500, 3000, 61), color=\"0.6\")\n",
        "ax.axvline(P0, color=\"0.2\", lw=1)\n",
        "ax.set_xlabel(\"Liquidation price of each loan\")\n",
        "ax.set_ylabel(\"Number of loans\")\n",
        "plt.show()"
      ],
      "id": "5ecfd9fa"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## The market\n",
        "\n",
        "Liquidators sell the ETH they receive. We represent everywhere they can\n",
        "sell it within minutes by a single constant-product pool, like the one\n",
        "in the [notebook on automated market makers](amm.qmd), whose price the\n",
        "protocol also uses as its oracle. The pool’s *depth*, the dollar value\n",
        "of its reserves, stands for how much selling the market can absorb: the\n",
        "deeper it is, the less each sale moves the price."
      ],
      "id": "43b03d94-8871-484a-a2e8-f4a9b88249e9"
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {},
      "outputs": [],
      "source": [
        "class Pool:\n",
        "    def __init__(self, depth):\n",
        "        self.eth = depth / 2 / P0\n",
        "        self.usdc = depth / 2\n",
        "        self.k = self.eth * self.usdc\n",
        "\n",
        "    @property\n",
        "    def price(self):\n",
        "        return self.usdc / self.eth\n",
        "\n",
        "    def sell_eth(self, amount):\n",
        "        self.eth += amount\n",
        "        self.usdc = self.k / self.eth\n",
        "\n",
        "    def drop_price(self, fraction):\n",
        "        \"\"\"An outside seller pushes the price down by the given fraction.\"\"\"\n",
        "        self.eth = np.sqrt(self.k / (self.price * (1 - fraction)))\n",
        "        self.usdc = self.k / self.eth"
      ],
      "id": "65971292"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## A cascade\n",
        "\n",
        "Starting from a first drop in the price, we repeat the same round until\n",
        "no loan is left to liquidate. In each round, every loan with a health\n",
        "factor below one is liquidated: the liquidator repays half its debt,\n",
        "receives ETH worth the repaid debt plus the 5% bonus, and sells that ETH\n",
        "into the pool."
      ],
      "id": "ef57976b-c4a2-409b-8bbc-d7f2638258c3"
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {},
      "outputs": [],
      "source": [
        "def cascade(depth, first_drop, max_rounds=500):\n",
        "    pool = Pool(depth)\n",
        "    pool.drop_price(first_drop)\n",
        "    coll, dbt = collateral.copy(), debt.copy()\n",
        "    prices, liquidated = [pool.price], 0.0\n",
        "    for _ in range(max_rounds):\n",
        "        p = pool.price\n",
        "        hf = np.full(n, np.inf)\n",
        "        open_loans = dbt > 1e-6\n",
        "        hf[open_loans] = coll[open_loans] * p * THRESHOLD / dbt[open_loans]\n",
        "        hit = (hf < 1) & (coll > 1e-9)\n",
        "        if not hit.any():\n",
        "            break\n",
        "        seized = np.minimum(CLOSE_FACTOR * dbt[hit] * (1 + BONUS) / p, coll[hit])\n",
        "        dbt[hit] -= seized * p / (1 + BONUS)\n",
        "        coll[hit] -= seized\n",
        "        liquidated += seized.sum() * p\n",
        "        pool.sell_eth(seized.sum())\n",
        "        prices.append(pool.price)\n",
        "    bad_debt = dbt[(coll <= 1e-9) & (dbt > 1e-6)].sum()\n",
        "    return {\"prices\": prices, \"final_price\": prices[-1], \"rounds\": len(prices) - 1,\n",
        "            \"liquidated\": liquidated, \"bad_debt\": bad_debt}"
      ],
      "id": "ad5346f1"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## How market depth changes the cascade\n",
        "\n",
        "A first drop of 10%, in markets of different depths:"
      ],
      "id": "9ba94baa-c4df-4bfc-83a8-dccc3ed1685b"
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<style type=\"text/css\">\n",
              "</style>\n"
            ]
          }
        }
      ],
      "source": [
        "rows = []\n",
        "for depth in [200e6, 250e6, 300e6, 500e6, 1_000e6]:\n",
        "    r = cascade(depth, 0.10)\n",
        "    rows.append({\"depth ($ millions)\": depth / 1e6,\n",
        "                 \"final change in price\": r[\"final_price\"] / P0 - 1,\n",
        "                 \"rounds\": r[\"rounds\"],\n",
        "                 \"liquidated ($ millions)\": r[\"liquidated\"] / 1e6,\n",
        "                 \"bad debt ($ millions)\": r[\"bad_debt\"] / 1e6})\n",
        "pd.DataFrame(rows).set_index(\"depth ($ millions)\").style.format(\n",
        "    {\"final change in price\": \"{:+.1%}\", \"liquidated ($ millions)\": \"{:.1f}\",\n",
        "     \"bad debt ($ millions)\": \"{:.1f}\"}).format_index(\"{:,.0f}\")"
      ],
      "id": "b5442516"
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "image/png": "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\nCRW5b1rK60amJ20XmRzJ7sDdqB7+p4+75YuD9GAJnTIyMpIBm0II8YxsTG3o7t6dqpZVtaboWdxp\nMe6V3EnMSCQpPUn9ykgiMV29nJiRSHJ6sno5e31GkmbbnJ/LyMrgQeoDHqQ+yLMGBfXv8L/v/F2S\np46CgoHKgFMRp8pFwCosCVhCCCFECSmuKXoURT0bvVYQexi8rkRd4Zv/vtFsO7L+SKpbV1d/jtz/\ncM7rH9N5bZdfHdlCE0L5+erPmvXNqzR/qnMq6+QSYR7kEqEQQojyRMZg6U5hM4IErDxIwBJCCCFE\nXgqbEWQeLCGEEEIIHZOAJYQQQgihYxKwhBBCCCF0TAKWEEIIIYSOScASQgghhNAxCVhCCCGEEDom\nAUsIIYQQQsdkJvc8ZE8NlpycrOdKhBBCCFGaZGeDgqYRlYCVh5SUFAAcHBz0XIkQQgghSqOUlBQs\nLCzybZeZ3POQlZVFbGwsZmZmeT49vKiSk5NxcHAgKiqq3M8UX5HOFSrW+cq5lk9yruVTRTpXKN7z\nVRSFlJQUbG1tMTDIf6SV9GDlwcDAAHt7+2I/jrm5eYX4gw4V61yhYp2vnGv5JOdaPlWkc4XiO98n\n9Vxlk0HuQgghhBA6JgFLCCGEEELHJGDpgZGRETNmzMDIqPxfoa1I5woV63zlXMsnOdfyqSKdK5SO\n85VB7kIIIYQQOiY9WEIIIYQQOiYBSwghhBBCxyRgCSGEEELoWMUY7VaKZGZmcuzYMSIjI/Hx8cHF\nxUXfJRWblJQUTp8+TWJiIt7e3lSpUkXfJRW7jIwMNm/eTLVq1Wjbtq2+yyk2iqJw9uxZwsLC8PX1\nxcnJSd8lFZv79+9z9uxZAJo2bYqzs7OeK9KNCxcucOXKFc3yoEGDck2amJ6ezpEjR4iPj8fX17fM\nnvudO3f4999/NctdunTJ9aSOxMRETp06RUZGBk2bNi2zT/KIj4/nr7/+0iw3b94cT0/PPLdNSkpi\n27ZteHp60rx585IqUac2bNhAVlYWALVr16ZZs2a5tsnMzOTUqVNER0fTunVrbG1tS6Y4RZSYuLg4\nxdfXV3F3d1c6d+6sWFpaKj/88IO+yyoWGzZsUDw8PJQ2bdoozz33nGJubq7Mnz9f32UVu08//VQx\nNjZW+vbtq+9Sik14eLjSsmVLpUaNGkrv3r2VunXrKjt37tR3WcVi3bp1iqWlpdKpUyelU6dOiqWl\n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\nQiFEvk6ePImPjw9paWncvHmTCRMmMHLkSEB9t1uDBg345ptvAOjYsSNXrlxhwYIFrF27tlD7z8rK\nYv369Tg7OwNw5swZDh48yIQJE/juu+9o2bIlX3zxhWb/p06dyndfBdXj4+MDQIMGDWjYsOEzfT+e\ntqai7s/ExERTN0D79u1xdXXl9OnTNG/enLp162JgYKC1TXaYy3mMgn5OT/o5hIWF0bZtW3r27AlA\nt27dSE1NfeZzFqKikB4sIUS+6tWrx/Lly/nmm2/o3LkzR44cITMzE4AbN27QvHlzre19fHy4ceNG\nofdvY2Oj+UsdwNbWlgcPHgBw8+ZN/ve//2lt//hyTrqopyBPW1NR96coCitXrqRfv374+vrSokUL\nYmNjCQoKKvQxCvN9edLP4ZNPPsHf358WLVrw7rvvsm/fPkxNTZ/qPIWoiKQHSwiRr+wxWAAtWrSg\nTp06LF68mEmTJuHg4EBkZKTW9pGRkTg4OABgbGysNZ4K1JejCsve3j7XOKnHj5dTQfXoQkE1Pe05\nF7S/ZcuW8dVXXzF37lxcXV0xNTVl4MCBpKSkAKBSqQqsuajfFzc3N3bv3k1SUhL//vsv77//PsOH\nD2fSpEmF+rwQFZX0YAkhCsXCwoKpU6fy5ZdfkpCQQK9evfjjjz80Y44CAwNZs2YNvXv3BsDT05M7\nd+5w8+ZNAO7cucOWLVsKfbxevXqxadMmzeevX7/+xM8XVI8uFFTT055zQfu7evUqPj4+DBkyhDZt\n2hAZGcmdO3c07XZ2diQnJ5OYmPjEYxTl+7J06VLu3LmDhYUFzz33HM2aNeP8+fOF+qwQFZn0YAkh\nCm306NHMnTuXJUuW8PHHHzNp0iRatmyJq6srd+7c4ZVXXuG1114DoG7durz22ms0adIENzc3FEWh\nadOmhT7W888/z2uvvUajRo1wd3cnLS0tz8lBs/Xs2fOJ9ehCQTU97TkXtL+xY8fSrVs33NzcMDEx\nwcnJCQ8PD017rVq1aN++PV5eXlSvXp3Zs2fnmt+rqN8Xd3d3OnbsiEqlIi0tDRMTE37//ffCfsuE\nqLBUiqIo+i5CCFH6hISEkJSURO3atbXWBwUFkZycTN26dQFITk4mMDAQV1dXrKyscu0nIiKCpKQk\natasSVhYGGlpadSsWZOEhAT8/f1p0qSJZtu7d+8SFxdHrVq1NOtiY2OJjIzEw8ODiIgIUlJStELG\n455Uz+nTp2nYsCFmZmZ5fjYpKYlr165p5pF6fDmvmqZPn46/vz/r168v8JwLs7/HzzEtLQ1/f38s\nLCxwd3fn6tWrVK5cGXt7e0A9TiswMJDo6Ghq1qyJmZlZnsfI7/tSmJ+DoigEBARgYGCAu7t7oS5N\nClHRScASQogimDp1aq6AJYQQMgZLCCGEEELHpAdLCCGKICwsrMDLlkKIikcClhBCCCGEjsklQiGE\nEEIIHZOAJYQQQgihYxKwhBBCCCF0TAKWEEIIIYSOScASQgghhNAxCVhCCCGEEDomAUsIIYQQQsck\nYAkhhBBC6Nj/A+EImhC5962uAAAAAElFTkSuQmCC\n"
          }
        }
      ],
      "source": [
        "fig, ax = plt.subplots(figsize=(7, 3.5))\n",
        "for depth in [1_000e6, 250e6, 200e6]:\n",
        "    r = cascade(depth, 0.10)\n",
        "    ax.plot(r[\"prices\"], marker=\"o\", ms=2, label=f\"Depth ${depth / 1e6:,.0f} million\")\n",
        "ax.set_xlabel(\"Round of liquidations\")\n",
        "ax.set_ylabel(\"Price of ETH\")\n",
        "ax.legend(frameon=False)\n",
        "plt.show()"
      ],
      "id": "856d8728"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "In a deep market, the first drop triggers a few liquidations, their\n",
        "sales barely move the price, and the cascade stops after a handful of\n",
        "rounds. As the market gets thinner, each round of sales pushes the price\n",
        "into the next group of liquidation prices, and the final fall is a\n",
        "multiple of the first. Below some depth the cascade runs away. In the\n",
        "thinnest market here, a first drop of 10% ends as a fall of about 70%:\n",
        "each round’s sales push the price into a denser part of the distribution\n",
        "of liquidation prices, the same loans are liquidated again and again,\n",
        "and some end with debt but no collateral, which is bad debt for the\n",
        "lenders.\n",
        "\n",
        "The thinnest case also shows a feature of the rules. A liquidation\n",
        "repays debt and takes collateral worth 5% more. Repaying one dollar of\n",
        "debt removes 1.05 dollars of collateral, which counted 0.80 × 1.05 =\n",
        "0.84 dollars toward the health factor. So for a loan whose health factor\n",
        "is already below 0.84, a liquidation leaves it less healthy than before,\n",
        "and it is liquidated again in the next round.\n",
        "\n",
        "## How the size of the first drop matters\n",
        "\n",
        "In a market of 500 million dollars, first drops of different sizes:"
      ],
      "id": "7f846cbc-b870-462d-ae6c-ce4208c8e361"
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<style type=\"text/css\">\n",
              "</style>\n"
            ]
          }
        }
      ],
      "source": [
        "rows = []\n",
        "for drop in [0.05, 0.10, 0.15, 0.20]:\n",
        "    r = cascade(500e6, drop)\n",
        "    rows.append({\"first drop\": -drop, \"final change in price\": r[\"final_price\"] / P0 - 1,\n",
        "                 \"rounds\": r[\"rounds\"], \"liquidated ($ millions)\": r[\"liquidated\"] / 1e6,\n",
        "                 \"bad debt ($ millions)\": r[\"bad_debt\"] / 1e6})\n",
        "pd.DataFrame(rows).set_index(\"first drop\").style.format(\n",
        "    {\"final change in price\": \"{:+.1%}\", \"liquidated ($ millions)\": \"{:.1f}\",\n",
        "     \"bad debt ($ millions)\": \"{:.1f}\"}).format_index(\"{:+.0%}\")"
      ],
      "id": "d31352a8"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "A small drop triggers almost nothing, because in our simulation no\n",
        "borrower started with a health factor below 1.05, so no loan becomes\n",
        "liquidatable until the price has fallen by about 5%. With more borrowers\n",
        "close to the limit, even a small drop would set off liquidations. Larger\n",
        "drops reach the dense part of the distribution, and the amplification\n",
        "grows: the cascade adds more to a large drop than to a small one.\n",
        "\n",
        "## What the simulation leaves out\n",
        "\n",
        "Real markets are not a single pool. When liquidations push the price\n",
        "down on one exchange, arbitrageurs buy there and sell elsewhere,\n",
        "bringing in liquidity from the whole market, so the depth that matters\n",
        "is everything that can be traded within minutes. But that depth is not\n",
        "fixed: in a crash, market makers pull back and depth shrinks exactly\n",
        "when it is needed. Borrowers also react, adding collateral or repaying\n",
        "debt when the price falls, and protocols set thresholds, bonuses and\n",
        "borrowing caps with cascades like these in mind.\n",
        "\n",
        "## Try it\n",
        "\n",
        "1.  Raise the liquidation bonus to 10%, or let liquidators repay the\n",
        "    whole debt at once (a close factor of 1). How do the cascades\n",
        "    change?\n",
        "2.  Make borrowers more cautious: draw the starting health factors\n",
        "    between 1.3 and 2.5. At what depth does the cascade in a 10% drop\n",
        "    stop being much larger than the first drop?\n",
        "3.  Suppose the protocol’s oracle used the average price over the last\n",
        "    few rounds instead of the current pool price. Modify `cascade` to do\n",
        "    this. Does a delayed oracle make cascades smaller, and what new risk\n",
        "    does it create?"
      ],
      "id": "169503b6-c72b-4647-b755-24c1f14dd48e"
    }
  ],
  "nbformat": 4,
  "nbformat_minor": 5,
  "metadata": {
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3 (ipykernel)",
      "language": "python",
      "path": "/home/lnaranjo/.pyenv/versions/global/share/jupyter/kernels/python3"
    },
    "language_info": {
      "name": "python",
      "codemirror_mode": {
        "name": "ipython",
        "version": "3"
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.15.2"
    }
  }
}