5D Library › 信贷周期、自组织临界性与市场相变的统计物理 · English

第三章 流动性螺旋:保证金、抛售与相关性

两种流动性

布伦纳迈尔与佩德森区分了两种流动性 (Brunnermeier and Pedersen 2009):市场流动性是一项资产能否在不明显压低价格的情况下卖出;融资流动性是交易者能否借到钱维持头寸,它取决于保证金要求,也就是每持有一元资产必须用多少自有资金支撑。两者会互相强化:价格下跌使杠杆交易者的权益减少,他们必须卖出资产来满足保证金要求;卖出压低价格,又使权益进一步减少。布伦纳迈尔与佩德森称之为损失螺旋。如果保证金要求本身随价格波动的上升而提高,还会出现保证金螺旋:越是动荡,可借的钱越少,被迫卖出的越多。

证据

流动性螺旋的理论结论。 在布伦纳迈尔与佩德森的模型中,市场流动性可以突然枯竭;保证金在提供资金的一方对资产基本面不确定时会「失稳」,即随波动上升而提高;不同资产的流动性会同时恶化;资金会「逃向安全」,从高保证金资产流向低保证金资产 (Brunnermeier and Pedersen 2009)。

一次只针对一项资产的坏消息

推导

三只杠杆基金各持有两种彼此无关的资产 A 和 B。每只基金必须保持权益不低于头寸价值的某个比例,否则按比例卖出两种资产直到满足要求;每卖出一个单位,价格下降一定比例。保证金要求要么固定在 10%,要么随最近的价格变动上升。只有资产 A 遇到坏消息。

# 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

这个简单的模型显示了几件事:

  • 阈值与突变。 坏消息较小时,什么都没有发生:基金的权益缓冲吸收了损失。坏消息一旦越过某个阈值,第一只基金被迫卖出,卖出压低价格,触发第二只、第三只基金的卖出,最后几乎所有头寸都被清算。结果不是随冲击大小连续变化的,而是从「几乎没事」突然跳到「全部卖光」。
  • 失稳的保证金降低了阈值。 保证金固定时,资产 A 下跌约 8.9% 才会触发强制卖出;保证金随价格变动上升时,约 5.9% 就够了。
  • 没有坏消息的资产也一起下跌。 资产 B 本身没有任何坏消息,却因为同样被这几只基金持有而下跌约三分之一。资产之间的联系不是来自基本面,而是来自共同的持有者。

最后一行显示,在 250 个平静的交易日里,A 和 B 每日收益率的相关系数接近零;在包含这次螺旋的 10 天里,相关系数接近 1。但这个「接近 1」要谨慎看待:10 天之中有一天的共同暴跌远远大于其他日子的波动,相关系数几乎完全由这一天决定。用很短的危机窗口计算相关性,本身就是一个很不稳定的统计量。

「危机中相关性趋近于 1」

一种常见的说法是:危机来临时,所有资产一起下跌,相关性趋近于 1,分散投资失效。这里有真实的成分,也有统计假象。

推导

福布斯与里戈本的论证 (Forbes and Rigobon 2002):两个市场之间的联系每天都相同,rB=0.4rA+ur_B = 0.4\,r_A + u;只有市场 A 的波动率在动荡的日子里变成平时的三倍。分别计算平静日与动荡日的相关系数,再用他们提出的公式校正。

# 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.

两个市场之间的联系从未改变,但动荡日的相关系数(约 0.77)是平静日(约 0.37)的两倍;只看 A 大幅波动的日子,相关系数高达约 0.85。福布斯与里戈本的校正公式

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

其中 ρh\rho_h 是高波动时期的相关系数,δ\delta 是高波动时期相对于平静时期方差增加的比例,把它校正回约 0.38。他们用这种校正重新检验了 1997 年亚洲金融危机、1994 年墨西哥危机和 1987 年美国股灾,发现大部分「传染」的证据在校正后消失,剩下的是平时就存在的相互依存 (Forbes and Rigobon 2002)。

证据

下跌市场中的相关性不对称。 隆然与索尔尼克用极值理论研究国际股市,发现相关性在大幅下跌的市场中上升,但在大幅上涨的市场中不上升 (Longin and Solnik 2001)。这种不对称很难完全用「选取高波动时段」来解释。

所以较准确的说法是:危机中观察到的相关性上升,一部分是高波动造成的统计假象;但也有证据显示,下跌市场中的共同运动确实更强,而上一节的模型提供了一种机制:共同的杠杆持有者在被迫卖出时,把原本无关的资产绑在一起。

假说 · 尚未验证

共同持有者传染假说(尚未确立)。在强制去杠杆的事件中,两项资产收益率的共同下跌程度,主要取决于它们被同一批杠杆投资者持有的比例,而不是基本面的相关性。可以用基金持仓数据检验:在控制基本面相关性之后,共同持有比例是否能预测去杠杆事件中的共同回撤。如果控制基本面之后共同持有比例没有解释力,这一假说就被削弱。

注

模型能说明什么。 本章两段程序的参数(杠杆、价格冲击、保证金对波动的敏感度)都是示意性的。它们说明的是机制:阈值的存在、失稳保证金降低阈值、共同持有者造成联动、以及相关系数对样本选取的敏感。它们不能告诉我们真实市场的阈值在哪里。

本章小结

市场流动性与融资流动性可以互相放大,形成损失螺旋与保证金螺旋。一个简单的模型显示,强制卖出的结果有明显的阈值:小冲击被吸收,越过阈值后几乎全部头寸被清算;随波动上升的保证金降低了这一阈值,没有坏消息的资产也因为共同持有者而一起下跌。危机中相关性的上升有一部分是统计假象,福布斯与里戈本的校正可以去掉这一部分。下一章讨论波动本身的规律:大波动为什么往往成群出现。

参考文献

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).