5D Library › Credit Cycles, Self-Organised Criticality and the Statistical Physics of Market Phase Transitions · 中文

Chapter 3 Liquidity Spirals: Margins, Fire Sales and Correlation

Two kinds of liquidity

Brunnermeier and Pedersen distinguish two kinds of liquidity (Brunnermeier and Pedersen 2009). Market liquidity is whether an asset can be sold without noticeably depressing its price; funding liquidity is whether traders can borrow to keep their positions, which depends on margin requirements, that is, how much of their own money must back each unit of assets held. The two reinforce each other: falling prices reduce the equity of leveraged traders, who must sell assets to meet their margins; the selling depresses prices, which reduces equity further. Brunnermeier and Pedersen call this a loss spiral. If margin requirements themselves rise when prices become more volatile, there is also a margin spiral: the more turbulent the market, the less can be borrowed and the more must be sold.

Evidence

What the liquidity-spiral theory concludes. In Brunnermeier and Pedersen’s model market liquidity can dry up suddenly; margins can be “destabilising”, rising with volatility, when financiers are uncertain about fundamentals; the liquidity of different assets deteriorates together; and there is a “flight to quality”, from high-margin to low-margin assets (Brunnermeier and Pedersen 2009).

Bad news about only one asset

Calculation

Three leveraged funds each hold two unrelated assets, A and B. Each fund must keep its equity at no less than a given share of the value of its positions; otherwise it sells both assets in proportion until it complies, and each unit sold lowers the price by a fixed fraction. Margins are either fixed at 10 % or rise with the latest price move. Only asset A receives bad news.

# A margin (funding-liquidity) spiral in the spirit of Brunnermeier & Pedersen (2009).
# Three leveraged funds each hold 5 units of two unrelated risky assets A and B (price 1), financed
# with debt; equity starts at 1.4, 1.5 and 1.6 (leverage about 6-7). A fund must keep equity of at
# least m times its positions; below that it sells both assets in proportion until it complies.
# Sales move prices: each unit sold lowers the price by 1/DEPTH of its value.
# Margins either stay at m0 = 10 % or rise with the latest price move ("destabilising margins"):
# m = m0 + C * |move|. Only asset A receives bad news. All parameters are illustrative.
import random, statistics as st
DEPTH, M0, C = 40.0, 0.10, 0.5

def spiral(shock, destab, rounds=50):
    p = {"A": 1.0 - shock, "B": 1.0}
    funds = [{"A": 5.0, "B": 5.0, "debt": 10.0 - e} for e in (1.4, 1.5, 1.6)]
    sold = 0.0
    for k in range(rounds):
        m = {a: M0 + (C * abs(p[a] - 1.0) if destab else 0.0) for a in p}
        sales = {"A": 0.0, "B": 0.0}
        for f in funds:
            pos = f["A"] * p["A"] + f["B"] * p["B"]
            eq = pos - f["debt"]
            req = m["A"] * f["A"] * p["A"] + m["B"] * f["B"] * p["B"]
            if eq <= 0:                                          # insolvent: everything is sold
                for a in p: sales[a] += f[a]; f["debt"] -= f[a] * p[a]; f[a] = 0.0
            elif eq < req - 1e-12:
                x = (req - eq) / (req / pos)                     # value to sell: frees margin req/pos per unit value
                frac = min(1.0, x / pos)
                for a in p:
                    q = f[a] * frac; f[a] -= q; f["debt"] -= q * p[a]; sales[a] += q
        if sum(sales.values()) < 1e-9: break
        sold += sum(sales.values())
        for a in p: p[a] *= max(0.0, 1 - sales[a] / DEPTH)
    eq = [f["A"] * p["A"] + f["B"] * p["B"] - f["debt"] for f in funds]
    return p, k, sold, eq

print("bad news on A only     margins        price A   price B   rounds   units sold   fund equity left")
for shock in (0.04, 0.06, 0.08, 0.10):
    for destab in (False, True):
        p, k, sold, eq = spiral(shock, destab)
        print(f"   A falls {shock:3.0%}     {'rising  ' if destab else 'constant'}      {p['A']:.3f}     {p['B']:.3f}"
              f"     {k:3d}      {sold:6.2f}      {', '.join(f'{e:.2f}' for e in eq)}")

for destab in (False, True):
    t = next(x / 1000 for x in range(1, 300) if spiral(x / 1000, destab)[2] > 0)
    print(f"smallest news on A that starts forced selling, {'rising' if destab else 'constant'} margins: {t:.1%}")

# Correlation: 250 calm days of independent news (sd 1 %) with no forced selling, then the
# 12 % shock with rising margins; the forced sales hit A and B together.
rnd = random.Random(5)
a = [rnd.gauss(0, 0.01) for _ in range(250)]; b = [rnd.gauss(0, 0.01) for _ in range(250)]
p, *_ = spiral(0.12, True)
ca, cb = [rnd.gauss(0, 0.01) for _ in range(9)], [rnd.gauss(0, 0.01) for _ in range(9)]
ca.insert(0, p["A"] - 1); cb.insert(0, p["B"] - 1)
print(f"correlation of A and B daily returns: 250 calm days {st.correlation(a, b):+.2f};"
      f" the 10 days starting with the spiral {st.correlation(ca, cb):+.2f}")
# bad news on A only     margins        price A   price B   rounds   units sold   fund equity left
#    A falls  4%     constant      0.960     1.000       0        0.00      1.20, 1.30, 1.40
#    A falls  4%     rising        0.960     1.000       0        0.00      1.20, 1.30, 1.40
#    A falls  6%     constant      0.940     1.000       0        0.00      1.10, 1.20, 1.30
#    A falls  6%     rising        0.632     0.672      13       29.88      0.01, 0.01, 0.01
#    A falls  8%     constant      0.920     1.000       0        0.00      1.00, 1.10, 1.20
#    A falls  8%     rising        0.616     0.669       4       30.00      -0.03, -0.03, -0.04
#    A falls 10%     constant      0.603     0.670       6       30.00      -0.12, -0.14, -0.15
#    A falls 10%     rising        0.600     0.667       3       30.00      -0.05, -0.06, -0.07
# smallest news on A that starts forced selling, constant margins: 8.9%
# smallest news on A that starts forced selling, rising margins: 5.9%
# correlation of A and B daily returns: 250 calm days +0.07; the 10 days starting with the spiral +1.00

This simple model shows several things:

  • Thresholds and sudden change. When the bad news is small, nothing happens: the funds’ equity buffers absorb the loss. Once the bad news crosses a threshold, the first fund is forced to sell, its selling depresses prices and forces the second and third funds to sell, and in the end almost all positions are liquidated. The outcome does not change smoothly with the size of the shock; it jumps from “almost nothing” to “everything sold”.
  • Destabilising margins lower the threshold. With fixed margins, asset A has to fall by about 8.9 % before forced selling starts; with margins that rise with price moves, about 5.9 % is enough.
  • The asset without bad news falls too. Asset B has no bad news of its own, yet it falls by about a third because the same funds hold it. The link between the assets comes not from fundamentals but from common holders.

The last line shows that over 250 calm trading days the correlation of the daily returns of A and B is close to zero, and over the 10 days including the spiral it is close to 1. But that “close to 1” needs care: one day of joint collapse in those 10 days is far larger than every other day’s move, and it almost entirely determines the correlation. A correlation computed over a very short crisis window is itself a very unstable statistic.

“In a crisis, correlations go to one”

A common claim is that when a crisis comes all assets fall together, correlations approach 1 and diversification fails. There is something real in this, and also a statistical artefact.

Calculation

The argument of Forbes and Rigobon (Forbes and Rigobon 2002): the link between two markets is the same every day, rB=0.4rA+ur_B = 0.4\,r_A + u; only market A’s volatility triples on turbulent days. Compute the correlation on calm days and on turbulent days, then apply their correction.

# Does correlation really "go to 1" in a crisis? Forbes & Rigobon (2002): when the source market
# becomes more volatile, the measured correlation rises even if the link between markets is unchanged.
# Model with a FIXED link: r_B = 0.4 * r_A + u, u ~ N(0, 1 %). Market A has calm days (sd 1 %) and
# turbulent days (sd 3 %, 10 % of days). Only A's volatility changes.
import math, random, statistics as st
rnd = random.Random(11)
calm, turb = [], []
for _ in range(60000):
    hi = rnd.random() < 0.10
    a = rnd.gauss(0, 0.03 if hi else 0.01)
    b = 0.4 * a + rnd.gauss(0, 0.01)
    (turb if hi else calm).append((a, b))
corr = lambda xy: st.correlation([x for x, _ in xy], [y for _, y in xy])
rc, rt = corr(calm), corr(turb)
delta = st.variance([x for x, _ in turb]) / st.variance([x for x, _ in calm]) - 1
adj = rt / math.sqrt(1 + delta * (1 - rt ** 2))
print(f"link r_B = 0.4 r_A + noise is the same on every day")
print(f"  correlation on calm days       {rc:.2f}")
print(f"  correlation on turbulent days  {rt:.2f}   (variance of A up by a factor {1 + delta:.1f})")
print(f"  Forbes-Rigobon adjusted        {adj:.2f}")
# Selecting days by large moves has the same effect:
allp = calm + turb
big = [p for p in allp if abs(p[0]) > 0.025]
print(f"  correlation on days when |r_A| > 2.5 % ({len(big)} days): {corr(big):.2f}; all days: {corr(allp):.2f}")
print("  A higher crisis correlation is therefore not, by itself, evidence that the link has changed.")
# link r_B = 0.4 r_A + noise is the same on every day
#   correlation on calm days       0.37
#   correlation on turbulent days  0.77   (variance of A up by a factor 8.7)
#   Forbes-Rigobon adjusted        0.38
#   correlation on days when |r_A| > 2.5 % (3153 days): 0.85; all days: 0.48
#   A higher crisis correlation is therefore not, by itself, evidence that the link has changed.

The link between the two markets never changes, yet the correlation on turbulent days (about 0.77) is twice that on calm days (about 0.37); looking only at days when A moves a lot, it reaches about 0.85. Forbes and Rigobon’s correction

ρ*=ρh1+δ(1−ρh2)\rho^{*} = \frac{\rho_h}{\sqrt{1 + \delta\,(1 – \rho_h^2)}}

where ρh\rho_h is the correlation in the high-volatility period and δ\delta the proportional increase in variance relative to the calm period, brings it back to about 0.38. Using this correction they re-examined the 1997 Asian crisis, the 1994 Mexican crisis and the 1987 US stock-market crash and found that most of the evidence of “contagion” disappeared, leaving the interdependence that exists at all times (Forbes and Rigobon 2002).

Evidence

Asymmetric correlation in falling markets. Using extreme-value theory on international equity markets, Longin and Solnik found that correlation rises in strongly falling markets but not in strongly rising ones (Longin and Solnik 2001). That asymmetry is hard to explain entirely as an effect of selecting volatile periods.

A more accurate statement is therefore this: part of the observed rise in correlation during crises is a statistical artefact of high volatility; but there is also evidence that co-movement really is stronger in falling markets, and the model in the previous section supplies one mechanism: when common leveraged holders are forced to sell, they tie together assets that were otherwise unrelated.

Hypothesis · not established

Common-holder contagion hypothesis (not yet established). In episodes of forced deleveraging, the joint fall of two assets depends mainly on the share of each held by the same leveraged investors rather than on the correlation of their fundamentals. This can be tested with fund holdings data: after controlling for fundamental correlation, does the share of common ownership predict joint drawdowns in deleveraging episodes? If common ownership has no explanatory power once fundamentals are controlled for, the hypothesis is weakened.

Note

What the models can show. The parameters of the two programs in this chapter (leverage, price impact, the sensitivity of margins to volatility) are illustrative. They show mechanisms: the existence of thresholds, destabilising margins lowering the threshold, common holders creating co-movement, and the sensitivity of correlation to the choice of sample. They cannot tell us where the thresholds lie in real markets.

Summary

Market liquidity and funding liquidity can amplify each other, producing loss spirals and margin spirals. A simple model shows that forced selling has a sharp threshold: small shocks are absorbed, and beyond the threshold almost all positions are liquidated; margins that rise with volatility lower the threshold, and an asset without bad news falls too because of common holders. Part of the rise in correlation during crises is a statistical artefact, which Forbes and Rigobon’s correction removes. The next chapter turns to the regularities of volatility itself: why large moves come in clusters.

References

Brunnermeier, Markus K., and Lasse Heje Pedersen. 2009. “Market Liquidity and Funding Liquidity.” Review of Financial Studies 22 (6): 2201–38.
Forbes, Kristin J., and Roberto Rigobon. 2002. “No Contagion, Only Interdependence: Measuring Stock Market Comovements.” Journal of Finance 57 (5): 2223–61.
Longin, François, and Bruno Solnik. 2001. “Extreme Correlation of International Equity Markets.” Journal of Finance 56 (2): 649–76.

Fan, Y. (2026). Credit Cycles, Self-Organised Criticality and the Statistical Physics of Market Phase Transitions: From Minsky's Financial Instability Hypothesis and Sandpile Power-Law Avalanches to Implied-Volatility Skew, Read Beside Classical Chinese Thought on Rise and Decline [信贷周期、自组织临界性与市场相变的统计物理] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23754711 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).