halo 的技术博客

返回

「这次不一样」——泡沫顶部最常听到的一句话,往往也是崩盘前最后一笔买单的注脚。但泡沫真的「不可预测」吗?Sornette 等人的研究显示,很多大崩盘(1987 黑色星期一、2000 互联网泡沫、2008 次贷、乃至 2015 A 股股灾)在崩盘前都呈现出可量化的共同指纹:价格以超指数速度加速赶顶,加速途中还叠加着等对数间隔的回调振荡。LPPL(Log-Periodic Power Law,对数周期幂律)模型把这两件事同时写进一个方程,并外推出一个「临界时间」t_c——事后看,崩盘往往就发生在 t_c 附近。

结论先放这:在一条带 LPPL 指纹的合成泡沫数据上(500 个交易日、真实 t_c=1.04),用非线性最小二乘拟合六参数模型,估计出 t_c≈1.0404,与真实值误差 <0.5%;对数周期振荡项相对纯幂律对照的 F 统计量高达 3.4 万,说明「等间隔回调」不是噪声、是真实存在的相变指纹;在不同随机子窗口上重复拟合,t_c 估计的均值 1.048、93% 落在真实值 ±0.04 区间内——模型既能还原结构,又有稳定的早期预警能力。 但它落到真实市场要过的陷阱,比想象中更硬(文末单列六类)。

LPPL 临界泡沫模型:超指数加速 + 外推崩盘时刻

一、为什么泡沫可以被建模:临界相变视角#

随机游走假设下,价格无法预测。但泡沫不是随机游走——它是一群投资者互相模仿、正反馈加仓的结果:涨了→更多人相信会涨→再加仓→进一步涨。这类「模仿集群」在数学上等价于一个临界相变(critical phase transition),和磁铁在居里点附近的自发磁化、沙堆在临界坡度的崩塌同属一类。临界现象有两个可量化的标志:

  1. 幂律加速:越接近临界时刻,变化越快,量值随时间按 (tct)β(t_c - t)^\betaβ<1\beta<1)发散。
  2. 对数周期振荡:相变前的涨落不是平滑的,而是以 ln(tct)\ln(t_c - t) 为等间隔的周期振荡——这是有限尺度系统在临界点附近「试探性」来回摆动的指纹。

把这两点合起来,就得到 LPPL 对(对数)价格的刻画:

lnP(t)=a+(tct)β[b+ccos(ωln(tct)+ϕ)]\ln P(t) = a + (t_c - t)^\beta \cdot \big[\, b + c \cdot \cos(\omega \ln(t_c - t) + \phi) \,\big]

  • tct_c:临界时间,泡沫应该在此时附近到达顶点并崩塌;
  • β(0,1)\beta \in (0,1):幂律指数,越大加速越晚但越剧烈;
  • b<0b<0:价格向 tct_c 加速冲顶(「bb 越负,赶顶越陡」);
  • ccos()c \cdot \cos(\cdot):对数周期振荡,把「等对数间隔回调」写成可估项;
  • ω\omega:对数频率(每「个数量级」几个振荡),ϕ\phi:相位。

注意:模型外推的是 t_c(什么时候崩),不是崩到多少点。它不预测跌幅,只预测「加速-相变」的临界时刻。

二、从零构造一条带 LPPL 指纹的泡沫#

我们合成 500 个交易日的对数价格,让它严格服从上面的方程,再加一点观测噪声:

画出来就是一条「先缓后陡、途中一波三折往上窜」的曲线——这正是 2015 年 A 股创业板、2000 年纳指顶部让人又怕又追的形态。beta=0.5 意味着接近 tct_c 时价格按 1/tct1/\sqrt{t_c-t} 发散,视觉上就是「最后一段几乎垂直」。

三、拟合 LPPL:非线性最小二乘 + 多起点#

六个参数 (a,tc,b,c,ω,ϕ)(a, t_c, b, c, \omega, \phi) 都非线性、且对初值敏感(尤其 ω\omegaϕ\phi 周期性强,单一起点极易落到局部极小)。实务做法是固定 β\beta(按文献取 0.5 左右)、多起点扫描 + 边界约束

跑出来:tc1.0404t_c≈1.0404b1.502b≈−1.502c0.400c≈0.400ω6.003\omega≈6.003——几乎逐项还原真值(真实 tc=1.04t_c=1.04b=1.5b=-1.5c=0.4c=0.4ω=6.0\omega=6.0)。这不是巧合:在噪声足够小、结构对齐时,NLS 能稳定还原生成参数。

对数周期振荡:加速途中等间隔回调,是临界相变的指纹

四、对数周期是不是「硬凑」?F 检验#

最常被质疑的一点:「那串余弦振荡,是不是随便加个周期就能让拟合更好?」我们用一个干净的对照回答:纯幂律(cos\cos 项置零)vs 完整 LPPL

# 纯幂律对照(只估 a, tc, b)
def resid_nc(p, tt, yy):
    a, tc, b = p
    return (a + np.clip(tc-tt,1e-6,None)**beta * b) - yy
sol_nc = least_squares(resid_nc, [np.log(100),1.05,-1.5], args=(tau, lnP_obs),
    bounds=([np.log(50),1.01,-3.0],[np.log(200),1.20,0.0]))
rss_nc = float(sol_nc.cost * 2)
rss_full = float(best.cost * 2)
F_cos = ((rss_nc - rss_full) / 3) / (rss_full / (N - 6))   # 振荡项带来 3 个自由度
python

结果:RSS(纯幂律)=16.23、RSS(LPPL)=0.078,F(振荡|幂律)=34080。F 远大于 1 意味着——去掉对数周期振荡,残差平方和暴增 200 多倍,余弦项不是装饰,而是模型必须的骨架。这正是文献里「泡沫顶部确实存在对数周期振荡」经验结论的量化背书。

五、早期预警的收敛性:窗口越长,t_c 越准#

真实场景里我们站在「泡沫途中」,只有一段历史、还不知道 t_c。LPPL 的卖点就是边涨边估、提前报点。我们用扩张窗口重复拟合(从 80 个交易日开始,每 10 天扩一次),看估计的 t_c 怎么收敛:

tc_series = []
for w in range(80, N, 10):
    sub_t, sub_y = tau[:w], lnP_obs[:w]
    bst = min((least_squares(resid, p0, args=(sub_t, sub_y),
                  bounds=([np.log(50),1.01,-3.0,0.05,2.0,0.0],
                          [np.log(200),1.20,0.0,0.8,12.0,6.28])) for p0 in inits),
              key=lambda s: s.cost)
    tc_series.append((w, bst.x[1]))
python

早期预警的收敛性:窗口越长,t_c 估计越稳、越接近真实

图里那条蓝线:早期窗口短、t_c 估计上蹿下跳;等样本过了中段、加速形态成形,估计值迅速贴近真实 tc=1.04t_c=1.04。这说明LPPL 预警需要「足够的加速段」才可靠——在泡沫刚冒头、还没有明显超指数形态时硬估 t_c,结果会很飘。

再用 60 个随机子窗口独立拟合,看 t_c 估计的整体系征:

t_c 估计分布:集中在真实值附近(F(振荡|幂律)=34080)

t_c 估计均值 1.048、标准差 0.033,93% 落在真实值 ±0.04 内。分布集中、且中心不偏,这是「模型给出的预警可信」的统计基础——如果估计值满屏乱飞,那预警就只是另一个噪声源。

六、实战怎么用:从「外推 t_c」到「风控信号」#

LPPL 在真实组合里通常不是「做空触发器」(太早做空会被挤死),而是风险温度计

  1. 监测清单:对持仓里涨得最猛、形态最像泡沫的标的,滚动拟合 LPPL,记录 tct_c 与「距当前还有多少交易日」。
  2. 双确认:只有当 (a) 估计 tct_c 在近期且多窗口一致、(b) 对数周期 F 检验显著、(c) b<0b<0β\beta 处于典型区间(0.3~0.7),才把该标的标记为「泡沫高危」。
  3. 动作:不裸空,而是降敞口 / 上保护 / 收紧止损。泡沫破灭的时点不可精确押注,但「危险在累积」是可量化的。
  4. 分仓纪律:单一标的的 LPPL 信号噪声大,应横向看「多少个指数/板块同时亮红灯」——系统性泡沫(2000、2008、2015)才最值得警惕,单只票的伪信号多。

Sornette 团队对 1987、2000、2008 等多次崩盘的复盘都显示:t_c 往往落在崩盘前几周到几天,且对数周期振荡在崩前最后一个顶最为清晰。模型的价值正是把「这次不一样」翻译成「这次其实和历史上每次都一样」。

七、真实陷阱:比想象中更硬的六类#

陷阱一:多解/局部极小(最致命)。 ω\omegaϕ\phi 是周期参数,目标函数坑极多。单次拟合几乎必陷局部极小,得到「拟合 R² 很高但 t_c 完全错」的漂亮假解。必须用多起点 + 边界 + 最优子集,并交叉验证不同起点是否收敛到同一 (tc,ω)(t_c, \omega)。本文用 4 组不同起点 + 60 个随机窗口,正是为了压住这条。

陷阱二:t_c 是「外推点」不是「崩盘点」。 LPPL 给出的 tct_c 是相变临界时刻的数学外推,真实崩盘可在 tct_c 前(政策打压、黑天鹅)或后(流动性还能撑)发生。把 tct_c 当「精确逃顶价」一定会反复被打脸。t_c 是风险窗口的起点,不是精确的卖出价

陷阱三:对数周期可能只是数据窥探(data snooping)。 熊市反弹、普通趋势里也可能「拟合出一个像样的余弦」。单看一条拟合曲线就喊泡沫,是典型过拟合。必须要求 (a) 样本内确有超指数加速(不只是噪声上的余弦)、(b) F 检验显著、(c) 跨多段子样本一致。本文 F=3.4 万 + 93% 窗口命中,才敢说信号可信。

陷阱四:噪声与采样频率。 日频噪声大,会让 ω\omega 估偏;用不同频率(日/周/60 分钟)拟合可能给出不同 tct_c。实务上应对多频率结果取交集,且对 ω\omega 设合理先验(文献常见 ω\omega 落在 6~13)。本文合成噪声小、结构干净,真实数据要更保守。

陷阱五:非泡沫也会被拟合成泡沫。 强趋势、庄股拉抬、指数成分调整带来的阶梯上涨,都可能在 LPPL 上「看起来像泡沫」。模型不区分「真内生相变」和「外力驱动上涨」——必须结合成交量、融资余额、估值分位等独立证据确认是自我强化的正反馈,而非基本面/政策驱动。

陷阱六:幸存者视角的回测幻象。 大部分 LPPL 文献只展示「成功预警的几次大崩盘」,对「亮红灯但没崩」「没亮灯却崩了」的案例系统性沉默。真实落地要统计命中率与误报率(ROC 式评估),而不是挑漂亮案例讲。本文合成数据可控、命中率可算,真实市场的误报成本必须单独计量。

八、诚实结论#

LPPL 不是水晶球,而是把「泡沫是临界相变」这个物理直觉翻译成了可估计、可检验的模型:超指数加速 + 对数周期振荡 → 外推临界时间 t_c。在结构对齐的合成数据上,它既能逐项还原真值(t_c 误差 <0.5%),又有统计硬证据(振荡项 F=3.4 万)、且多窗口估计稳定收敛(93% 命中)。

但落到自己账户上,先过了多解、t_c 语义、数据窥探、频率噪声、非泡沫误判、幸存者幻象这六关。模型最有用的姿势,不是「精确逃顶」,而是作为系统性泡沫的风险温度计——当多个指数同时亮起 LPPL 红灯、且对数周期清晰时,那才是「这次真的和历史上每次都一样」的时刻。

注:全文数据为自洽合成(严格按 LPPL 方程生成、含观测噪声),仅用于演示模型拟合、对数周期显著性检验与 t_c 预警的统计性质。真实复现请替换为实际价格序列,并对多解、频率、数据窥探与误报率逐一做稳健性检验。

LPPL 对数周期幂律:用临界泡沫模型给崩盘点位预警
https://blog.halo26812.eu.org/blog/lppl-bubble-prediction
Author halo
Published at 2026年7月15日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨