股市崩盤前,價格往往越漲越快,且伴隨節奏越來越密的震盪。LPPL 泡沫模型(Log-Periodic Power Law,對數週期冪律模型)把這兩個特徵寫成一條可以擬合的方程式,從價格本身推估崩盤機率最高的時間區間。本文拆解這個模型的原理與公式,再用 finlab 的台股資料對 0050 的 435 個觀測日做 8,265 次 LPPL 擬合,把「泡沫警報」變成可回測的擇時訊號,檢驗它在台股大盤上到底有沒有用。
![]()
回測結論的關鍵數字(2018-01 至 2026-06,數據截至 2026-06-09):
| 指標 | LPPLS 泡沫擇時(門檻 0.2) | 0050 含息買進持有 |
|---|---|---|
| 年化報酬(CAGR) | 23.93% | 25.05% |
| 總報酬 | 510.7% | 558.5% |
| 日夏普比率 | 1.18 | 1.22 |
| 月索提諾比率 | 1.85 | 1.92 |
| 最大回撤(MDD) | -33.96% | -33.96% |
| 持股時間比例 | 99.5% | 100% |
| 進出次數 | 2 筆 | 0 筆 |
這是一個負面結果:在本文的設定下,LPPLS 擇時沒有打敗 0050 買進持有,最大回撤也一分沒少。八年半只觸發一次出場警報(2025-10-13),之後 0050 收盤最低只比訊號日低 2.4%,到資料截止日反而上漲了 72.1%。模型的原理依然漂亮、文獻戰績依然存在,但「對單一台股指數做擇時」這個用法,經過嚴格口徑的檢驗後並不成立。整個檢驗過程與可重現的程式碼,比結論本身更值得留下來。
股市崩盤可以預測嗎?LPPL 模型的歷史紀錄
LPPL 模型出自地球物理學家 Didier Sornette 的研究團隊。Johansen, Ledoit & Sornette (2000) 在〈Crashes as critical points〉中主張:金融崩盤類似物理系統的相變,當市場中交易者的模仿行為累積到臨界點,系統會在某段時間附近以高機率瓦解;崩盤前的價格因此呈現「超指數成長」加上「對數週期震盪」兩個可觀測的特徵。
這個模型最常被引用的應用案例包括:
- 1990 年代末的納斯達克與 2000 年科技泡沫
- 2006 至 2007 年的美國房市相關資產
- 2008 年中的原油價格泡沫
- 2015 年的上海股市泡沫(研究團隊在崩盤前公開發布預警,事後分析發表於 Sornette et al. (2015))
- 2017 年底的比特幣泡沫
要把這份戰績讀得精確:LPPL 推估的臨界時間 是「崩盤機率最高的時間區間」,模型本身允許泡沫在 之前就破裂,也允許價格在 之後平緩消化而不崩盤。把它當成日曆上圈好的崩盤日,是對這個模型最常見的誤用,也是本文回測想量化的問題。
泡沫的成因:從眾者與自主者的群體動力學
LPPL 的數學推導借用了統計物理,但背後的市場直覺很簡單。想像市場由兩類交易者組成:一類是「自主者」,依自己的研究判斷買賣;另一類是「從眾者」,看到別人買就跟著買、看到別人賣就跟著賣。每個人在不同時刻可能扮演不同角色,兩類人的訊息在市場網絡中不斷交換、互相影響。
平時,自主者的分歧意見讓市場保持多樣性,價格漲跌互現。但在泡沫後期,賺錢效應讓越來越多人放棄獨立判斷、加入從眾陣營,整個網絡的「一致性」越來越高。當一致性逼近臨界點,只要一個小擾動,幾乎所有人會在同一瞬間做出相同的賣出決定,價格於是崩跌。這就是「崩盤是內生的」這個觀點:壓垮市場的是結構本身的脆弱,外部利空只是扣下扳機。
這個機制同時對應 LPPL 公式的兩個特徵:模仿網絡的正回饋造成超指數上漲;而群體在「續漲」與「獲利了結」之間的拉鋸,造成節奏越來越快的週期性震盪。
LPPL 公式拆解:三個元素
LPPL 模型把泡沫期的對數價格期望值寫成:
各參數的意義:
| 參數 | 意義 | 合格擬合的常見範圍 |
|---|---|---|
| 臨界時間,崩盤機率最高的時點 | 落在資料窗格結尾附近 | |
| 時的對數價格上限 | 由線性回歸求出 | |
| 趨勢項強度, 代表價格向上加速(正泡沫) | ||
| 冪律指數,控制加速的形狀 | ||
| 震盪幅度相對趨勢的比例 | 遠小於 | |
| 對數週期角頻率,控制震盪節奏加快的速度 | ||
| 相位 | 無限制 |
把公式拆成三個元素看:

- 冪律超指數趨勢 :一般的指數成長在對數座標上是直線,泡沫的對數價格卻向上彎曲,漲速本身在加速,並在 處到達數學上的奇異點。
- 對數週期震盪 :價格圍繞趨勢上下擺動,且因為自變數是 ,離 越近震盪週期越短,視覺上像彈簧被越壓越緊。
- 臨界點 :趨勢與震盪共同指向的時間奇異點,也是模型輸出的核心。
用一組虛構數字算一次 LPPL
以下用一家虛構公司的參數示範公式怎麼算(純屬教學示例,並非任何回測數據)。設 、、、、、,臨界時間 在第 300 個交易日。把不同的 代入公式:
| 交易日 | 距 天數 | 趨勢項 | 震盪項 | 模型價格 | |
|---|---|---|---|---|---|
| 200 | 100 | 10.000 | -1.800 | +0.196 | 40.2 元 |
| 250 | 50 | 7.071 | -1.273 | +0.211 | 69.1 元 |
| 280 | 20 | 4.472 | -0.805 | +0.053 | 94.3 元 |
| 295 | 5 | 2.236 | -0.402 | +0.064 | 142.6 元 |
| 299 | 1 | 1.000 | -0.180 | +0.030 | 172.1 元 |
注意兩件事:第 200 到 250 天花了 50 天從 40.2 元漲到 69.1 元,而第 295 到 299 天只花 4 天就從 142.6 元漲到 172.1 元,這就是「漲速本身在加速」;同時震盪項的正負與大小隨 擺動,造成價格沿途的高低起伏。反過來,當你在真實股價上量到這種結構,模型就能回推出那個共同指向的 。
把公式套到真實股價:校準與線性化
擬合(校準)的目標是找一組參數 ,讓模型曲線與實際對數價格的殘差平方和最小:
困難在於這是 7 個參數的非線性最佳化,目標函數佈滿局部最小值。本文 2020 年的第一版用遺傳演算法暴力搜尋全部 7 個參數,跑一次要數分鐘,而且每次執行結果都不同,這也是早期 LPPL 研究常被批評「同一份資料、兩篇論文、兩個答案」的原因。
Filimonov & Sornette (2013) 提出的線性化解掉了這個問題:把震盪項展開成 之後,模型對 是線性的,給定 就能用最小平方法一步解出:
於是非線性搜尋空間從 7 維降到 3 維,用一般的數值最佳化(本文採多起點 Nelder-Mead 搭配固定亂數種子)就能穩定收斂,單一窗格的擬合時間從分鐘級降到毫秒級,結果也完全可重現。這是把 LPPL 從學術玩具變成每天可以跑的指標的關鍵一步。
LPPLS 信心指標:從單一擬合到機率讀數
單一窗格的擬合仍然脆弱:換一個起始日, 可能差很多。Sornette et al. (2015) 在上海股災的實戰研究中使用的解法,是把「對窗格的敏感度」本身變成指標,稱為 LPPLS 信心指標(LPPLS Confidence Indicator):
具體做法:在每個觀測日,取多個不同長度的回看窗格(本文用 30 到 120 個交易日、間隔 5 天,共 19 個),每個窗格各做一次擬合,再用參數過濾條件判斷該擬合是否描述了一個結構完整的泡沫。本文採用的過濾條件:
- 冪律指數 ,且 (向上加速為正泡沫; 則記為負泡沫,即超跌結構)
- 角頻率
- 落在窗格結尾附近:( 為窗格長度)
- 窗格內至少 2.5 次完整震盪:
- 阻尼比 ,確保趨勢項主導、震盪不至於蓋過趨勢
舉例來說,若某日 19 個窗格中有 6 個通過正泡沫過濾,當日正泡沫信心值就是 ,讀法是「約三分之一的時間尺度都看到同一個泡沫結構」。信心值越高,代表訊號對窗格選擇越不敏感,越值得當一回事。
Python 實作:用 finlab 資料計算 0050 的 LPPLS 信心指標
實作只需要一張還原股價表。用 finlab 套件取得含息還原價,核心的設計矩陣與單窗格擬合:
顯示程式碼
import numpy as np
from scipy.optimize import minimize
from finlab import data
# 取 0050 含息還原價(finlab 會自動引導登入)
adj_close = data.get("etl:adj_close")
price = adj_close["0050"].dropna()
log_price = np.log(price.values)
def lppl_design_matrix(t, tc, m, w):
"""Filimonov-Sornette 線性化:給定 (tc, m, omega),
線性參數 (A, B, C1, C2) 用最小平方法解。"""
dt = np.abs(tc - t) + 1e-8
f = dt ** m
g = f * np.cos(w * np.log(dt))
h = f * np.sin(w * np.log(dt))
return np.column_stack([np.ones_like(t), f, g, h])
def lppl_sse(theta, t, y):
"""殘差平方和:非線性參數只剩 (tc, m, omega) 三個。"""
tc, m, w = theta
X = lppl_design_matrix(t, tc, m, w)
coef, _, _, _ = np.linalg.lstsq(X, y, rcond=None)
residual = y - X @ coef
return float(residual @ residual)
def fit_window(t, y, rng, n_starts=6):
"""多起點 Nelder-Mead 搜尋,rng 固定種子確保可重現。"""
t2 = t[-1]
window_length = t[-1] - t[0] + 1
bounds = [
(t2 - 0.2 * window_length, t2 + 0.2 * window_length), # tc
(0.01, 1.99), # m
(2.0, 25.0), # omega
]
best = None
for _ in range(n_starts):
x0 = np.array([rng.uniform(lo, hi) for lo, hi in bounds])
result = minimize(lppl_sse, x0, args=(t, y),
method="Nelder-Mead", bounds=bounds)
if best is None or result.fun < best.fun:
best = result
return best完整版(含 19 個窗格的滾動計算、過濾條件、信心指標彙總與 finlab 回測)整理成可下載的 strategy.py,在一般筆電上跑一次約幾分鐘;所有亂數都釘了種子,每次執行會得到相同的數字。
回測:LPPLS 擇時能不能打敗 0050 買進持有?
有了每日的正、負泡沫信心值,就能設計一個大盤級的擇時規則。先看 0050 在 2018 到 2026 年的信心指標全景:

整段期間,正泡沫信心值達到 0.1 以上的只有三波:2019 年 11 月初(約 0.105,持續一週後消退;三個多月後發生疫情崩盤,但訊號早已歸零)、2021 年 1 月下旬(約 0.1 到 0.16,首個訊號日為 2021-01-21;訊號出現後六個交易日內 0050 一度下跌 8.4%,反彈後 4 月見波段高點、5 月中再回檔,最低點較首個訊號日低 9.6%。這一波訊號之後確實跟著一段跌勢,但信心值始終沒越過 0.2 的出場門檻,策略並未因此出場)、以及 2025 年 10 月(全期最高 0.32)。負泡沫這一側更冷清:八年半只有 2022 年 10 月出現過一次非零讀數,最高 0.053,落在 2022-10-20,剛好在那輪空頭的底部附近;方向耐人尋味,但強度遠低於任何可操作的門檻。2020 年 3 月的疫情崩盤前後,正、負泡沫讀數都是零,V 型急跌並不符合模型假設的「結構在窗格內慢慢累積」。
下圖是回測期間正泡沫信心值最高的一天,以及當天通過過濾的最佳擬合曲線與 估計區間:

2025-10-13 這天,19 個窗格中有 6 個通過正泡沫過濾(信心值 0.32),合格擬合來自 60 到 100 天的窗格,推估的 集中在觀測日之後 2 到 4 個交易日。事後看,0050 接下來八個月又漲了 72.1%。期間最低收盤價出現在 2025-11-24,僅較訊號日低 2.4%;若以峰谷計算,這八個月內的最大回撤為 -10.8%(2026 年 2 月下旬高點跌至 2026-03-31 低點),但那已是價格遠高於訊號日之後的事。對照模型推估「觀測日後 2 到 4 個交易日」的臨界區間,這次警報是清楚的誤報。
擇時規則用最簡單的狀態機,避免事後挑訊號:
| 項目 | 設定 |
|---|---|
| 標的 | 0050,全倉或空手兩種狀態 |
| 出場 | 正泡沫信心值 |
| 回補 | 正泡沫信心值退回 ,或負泡沫信心值 (超跌反轉) |
| 執行 | 信號以收盤資料計算,部位變更於次一交易日成交(finlab sim() 預設) |
| 成本 | finlab sim() 台股預設:手續費 0.1425%、證交稅 0.3% |
結果(2018-01 至 2026-06):
| 指標 | LPPLS 擇時 | 0050 買進持有 |
|---|---|---|
| CAGR | 23.93% | 25.05% |
| 總報酬 | 510.7% | 558.5% |
| 日夏普 | 1.18 | 1.22 |
| 日索提諾 | 1.60 | 1.67 |
| 月索提諾 | 1.85 | 1.92 |
| 最大回撤 | -33.96% | -33.96% |
| 進出次數 | 2 筆(出場、回補各一次) | 0 筆 |
| 持股時間 | 99.5% | 100% |
分段期間的表現:
| 期間 | LPPLS 擇時 | 0050 買進持有 |
|---|---|---|
| 2018–2020 | 63.8% | 65.5% |
| 2021–2023 | 20.2% | 20.2% |
| 2024–2026 | 206.2% | 226.8% |
三段拆開看,輸的原因一目瞭然。2021 到 2023 兩者數字完全相同:這段期間沒有任何訊號越過門檻,策略全程持有,把 2022 年 -33.96% 的回撤原封不動吃下來,這正是「最大回撤一分沒少」的來源。2018 到 2020 的小差距來自 sim() 的進場成本與次日成交時滯。2024 到 2026 的差距則全部來自 2025 年 10 月那次誤報:出場後 0050 續漲,兩週後以高約 3.9% 的價格買回,加上一來一回的交易成本。一次誤報,八年的擇時努力就輸給了什麼都不做。
互動式回測報告可以拉開看每一筆進出:
穩健性檢查:出場門檻的敏感度
0.2 這個門檻會不會剛好挑到最差的參數?把出場門檻從 0.1 掃到 0.3(回補門檻同步設為出場門檻的一半),各門檻的結果:

| 出場門檻 | CAGR | 日夏普 | 最大回撤 | 持股時間 | 進出次數 |
|---|---|---|---|---|---|
| 0.10 | 24.93% | 1.22 | -33.96% | 99.0% | 6 筆 |
| 0.15 | 24.87% | 1.22 | -33.96% | 99.3% | 4 筆 |
| 0.20 | 23.93% | 1.18 | -33.96% | 99.5% | 2 筆 |
| 0.25 | 23.93% | 1.18 | -33.96% | 99.5% | 2 筆 |
| 0.30 | 23.93% | 1.18 | -33.96% | 99.5% | 2 筆 |
五種門檻全部輸給買進持有,最大回撤一律 -33.96%,等於沒有躲過任何一次大跌。把門檻調低只是讓誤報變多(0.1 時六筆進出),並不會把真正的大跌抓出來。換句話說,結論對參數不敏感:問題出在訊號本身稀疏,而非門檻挑錯。這比「調出一組會贏的參數」更有參考價值,後者在這種訊號結構下只會是過擬合,判斷方法可以參考回測過擬合機率的實測。
回測方法與限制
這些數字是怎麼算出來的,逐項交代:
| 項目 | 本文做法 |
|---|---|
| 交易成本 | 策略經 finlab sim(),預設含手續費 0.1425% 與證交稅 0.3%。0050 為 ETF,實際證交稅率 0.1%,本文未調整,屬偏保守估計 |
| 基準口徑 | 0050 含息買進持有為 etl:adj_close 還原價的純指數算術報酬,不含交易成本 |
| 滑價 | 未假設。0050 流動性極佳,但大額資金的實際衝擊取決於下單方式與規模,本文未估算容量 |
| 股票池 | 單一標的 0050,無選股池定義問題 |
| 流動性過濾 | 不適用(單一 ETF) |
| 排除類別 | 不適用(單一 ETF),無生存者偏誤問題 |
| 前視偏差 | 信心指標只用觀測日當天以前的價格擬合;部位變更於信號日的次一交易日成交 |
| 權重與周轉 | 全倉或空手兩種狀態,主設定八年半共 2 筆交易,周轉率極低 |
| 樣本內外 | 全段 in-sample,未做樣本外驗證。門檻與過濾條件取自學術文獻慣例而非網格搜尋,敏感度分析見上節 |
LPPL 的限制與學術批評
把本文的負面結果放進文獻脈絡,有三件事要知道。
可證偽性的批評。 Brée & Joseph (2013) 系統性檢驗了 LPPL 對歷史崩盤的擬合,指出模型自由度高、結果對擬合區間敏感,部分宣稱的預測成功有事後選擇之嫌。這也是本文堅持固定種子、固定過濾條件、把所有窗格的通過比例攤開成信心指標的原因:與其展示一條挑過的漂亮擬合曲線,把失敗的窗格一起算進分母更接近真相,而真相是訊號很稀疏。
是機率峰值,拿它對日曆會失望。 模型輸出的是「結構最可能瓦解的時間區間」,本文擬合案例的 也只是觀測日後幾天的一個區間估計。2025 年 10 月的案例顯示,即使 6 個時間尺度同時指向同一個 ,市場仍然可以再漲 72%。
個股不適用。 LPPL 只看價格結構,不看財報、月營收、籌碼。本文 2020 年的第一版曾把模型套在個股日馳(1526)上,用遺傳演算法擬合出「約 180 個交易日後崩盤」的推估;事後看,個股受大戶買賣與訂單消息的影響遠大於群體模仿動力學,那次擬合沒有參考價值,本次改版直接把它當成反面教材保留在這段。指數與大型 ETF 的參與者夠多、夠分散,才比較接近模型假設;即使如此,本文在 0050 上的結果仍然是負面的。想對個股做系統化的泡沫應用,請看用全市場統計取代單檔擬合的 LPPLS 選股做法。
比特幣與美股也能測
LPPL 只需要價格序列,任何市場都能套用。我們做了一個免費的 Colab 泡沫檢測器,輸入任何 Yahoo Finance 收錄的代號(美股、台股、比特幣 BTC-USD 都可以)就能跑出擬合結果與 推估。2017 年底的比特幣正是 LPPL 文獻中的經典案例:超指數上漲與越來越密的震盪都很典型,崩盤也確實落在臨界區間附近。但提醒一句:本文在 0050 上得到的負面擇時結論,說明「文獻案例成立」與「在你的市場、你的口徑下可操作」是兩回事,跨資產使用前請各自回測驗證。
那 LPPL 還有什麼用?
回測輸了,模型不必丟掉,但定位要改。
- 不要當大盤擇時開關。 本文已經量化了代價:八年半的等待換來一次誤報,CAGR 少 1.12 個百分點,回撤完全沒降。同樣想做大盤風控,融資維持率的 0050 擇時有更高的訊號密度可以比較。
- 當成全市場掃描的篩選器。 單一指數的合格擬合很稀有,但對兩千檔個股同時掃描,每天都會有分數分佈可以統計。這正是 LPPLS 泡沫選股策略的做法:不問「大盤何時崩」,改問「哪些股票正處於小泡沫」,把稀疏訊號變成可分組回測的因子。
- 負泡沫讀數留做研究線索。 2022 年 10 月那次全期唯一的負泡沫訊號恰好落在空頭底部附近,樣本只有一次、不構成任何結論,但值得在更多市場與更長歷史上驗證。想找超跌反轉的標的,當前可操作的做法仍是大跌後用 Python 篩選強勢股,或用 VIX 恐慌指數的抄底回測從情緒面切入;LPPL 的負泡沫與 VIX 的買進訊號邏輯獨立,未來可以交叉驗證。
想把這類訊號研究納入完整的交易流程,可以從量化交易完整指南入門,了解程式交易如何把規則自動化;上線前建議先讀回測的侷限性,本文就是「先回測、再決定要不要信」的一次示範。
常見問題
LPPL 模型可以算出崩盤的確切日期嗎?
不行。 是崩盤機率最高的時間區間的中心,合格擬合之間的 常相差數天到數週,且模型允許泡沫提早破裂或平緩消化。本文 2025 年 10 月的案例中,6 個窗格的 都指向觀測日後幾天,市場之後卻又漲了 72.1%。
LPPLS 信心值多高才算危險?
在本文 0050 的八年半樣本中,99% 的交易日正泡沫信心值不超過 0.053,唯一一次超過 0.2 的警報事後是誤報,所以「多高算危險」在台股大盤上還沒有可靠答案。比起絕對水位,把它當成眾多風險讀數之一、觀察它從 0 快速爬升的過程,比設定單一門檻務實。
LPPL 適合用在個股嗎?
不建議。個股價格被特定大戶、訂單與事件主導,偏離「大量小交易者互相模仿」的模型假設;本文 2020 年版對日馳的單檔擬合就是反例。個股層級請改用全市場統計的 LPPLS 泡沫選股做法。
LPPL 擇時和 VIX 擇時有什麼不同?
LPPL 從價格時間序列的內生結構(超指數上漲、對數週期震盪)推估泡沫;VIX 是選擇權隱含波動率,反映市場當下的恐慌定價。前者是事前的結構警報,後者是事中的情緒溫度計。本文顯示前者在 0050 上訊號太稀疏,後者的實測見 VIX 美股大跌投資法。
為什麼我的 LPPL 擬合結果每次都不一樣?
因為目標函數有大量局部最小值,隨機起點的最佳化每次會落到不同的解。解法是 Filimonov-Sornette 線性化(線性參數解析求解)加上固定亂數種子的多起點搜尋,本文可下載的程式碼已內建,重跑會得到相同數字。
需要多強的程式背景才能重現本文結果?
會安裝 Python 套件、能執行一個腳本即可。下載 strategy.py 後安裝 finlab、numpy、scipy、pandas、matplotlib 就能重現全部數字與圖表;想先在雲端試玩,用上面的 Colab 檢測器即可。
LPPLS 擇時可以取代買進持有嗎?
以本文回測來看不行。擇時版 CAGR 23.93% 低於買進持有的 25.05%,最大回撤完全相同,唯一一次出場還是誤報。在出現更密集、更可靠的訊號設計之前,它不該取代任何核心持股決策。
這個指標多久更新一次比較合理?
本文每 5 個交易日計算一次(19 個窗格全部重新擬合)。LPPL 描述的是以週到月為尺度的泡沫結構,逐日重算對訊號的改變很小,反而增加運算成本。
延伸閱讀
- 量化交易完整指南:把訊號變成系統化策略的入門路徑
- LPPLS 泡沫選股策略:同一模型的個股應用,全市場近 400 萬次偵測
- VIX 美股大跌投資法:恐慌指數抄底的回測實證
- 融資維持率 0050 擇時:另一個大盤級風控訊號的實測
- 台股選股方法完整指南:從擇時回到選股的全景地圖
- 策略回測完整指南:上線前必讀的回測自我檢查
下載資源
| 檔案 | 說明 |
|---|---|
| strategy.py | 完整 LPPLS 信心指標計算與回測程式碼(固定種子,可重現) |
| data.csv | 每日信心指標、持倉與淨值序列 |
投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。 LPPL 模型對崩盤時點的推估存在高度不確定性,請勿以本文任何訊號作為買賣依據;實際交易前請自行評估風險承受能力、滑價與資金容量。
最後更新:2026-06|回測區間:2018-01 至 2026-06(數據截至 2026-06-09)|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始


