← 研究動態
研究2026/09/03 上午03:00

先鎖死規則,再讓台股 29 年週資料說話:三個崩跌早期預警訊號只剩一個站得住(K1732)

event-studypre-registrationblock-bootstrapkurtosishigher-momentscrash-early-warningTAIEX

讀者互動

登入會員可按讚與收藏。

分享到:LINEFacebookX / Twitter

持續追蹤這項研究

收藏、追蹤與明日提醒只保存必要識別資料,可在會員中心檢視或刪除。

研究資訊不構成個人投資建議;提醒僅代表研究更新,不代表交易訊號。

訂閱研究摘要

研究摘要與新文章,不轉售、不寄廣告,隨時可退訂。

K1732:先把規則鎖死,再讓台股 29 年週資料說話

三個候選的崩跌早期預警訊號,走完同一套預先註冊流程之後,只剩一個站得住。這篇要講的是那套流程本身,以及它砍掉了什麼。

先鎖死,再開資料

預先註冊(pre-registration)的意思很土:在看結果之前,把事件怎麼算、訊號怎麼定義、用哪個視窗、拿什麼當對照,全部寫死。寫死之後,回測只剩下按執行鍵這一個動作。

K1732 鎖死的規格是這樣。資料取 Yahoo Finance 的 ^TWII(auto_adjust),頻率是週五收盤的週 log 報酬,區間 1997-07-11 到 2026-07-17,共 1,494 週,約 29.0 年。動差用 26 週滾動視窗估計,偏態與超額峰態走 pandas 的樣本估計式(bias-corrected)。訊號狀態一律用 MA20 與 MA30 的死亡交叉判定,短均線壓到長均線之下就算警戒中。

崩跌事件定義為單週 log 報酬 ≤ −5%。同一波下跌會連著出現好幾週的大跌,所以再加一條 13 週的 episode gap:一次崩跌起點認列之後,13 週內的後續大跌都算同一段,不重複計數。整段樣本因此得到 30 個崩跌起點,第一個在 1997-09-05,最後一個在 2026-07-17。平均下來大約每 49.8 週出現一次。

這些自由度,在跑第一行回測程式之前就已經被拿走了。門檻不能事後從 −5% 調成 −4%(−4% 的版本有 26 個起點,當作穩健性檢查另外報,不當主結果)。MA 參數不能掃描。訊號清單不能事後追加。

三個訊號,一個對照

候選訊號有三個:β_s(報酬對偏態的敏感度)、β_k(報酬對峰態的敏感度)、IS_k(峰態的影響份額,influence share)。另外放一個刻意平庸的對照組:σ 的上升趨勢,也就是純波動率變高。

評估口徑是「關聯」,不是「預測」。對每一週問一個問題:這一週訊號在警戒中的話,未來 13 週內出現崩跌起點的機率是多少;不在警戒中又是多少。兩者相減,就是這個訊號帶來的機率抬升。

30 個起點裡有 28 個可評估,少掉的 2 個落在 MA30 的暖機期,訊號那時還沒有值。這 2 個直接記為不可評估,不做插補、不做寬容處理。

訊號警戒中 P(13 週內起點)非警戒 P差值95% 區塊自助 CI單尾 p
IS_k(峰態影響份額)32.29%17.22%+15.07 pp[+4.72, +25.01]0.0138
β_s(偏態敏感度)22.12%26.80%−4.68 pp[−16.36, +7.91]0.738
β_k(峰態敏感度)22.19%26.74%−4.55 pp[−16.36, +6.24]0.714
σ 上升趨勢(對照)22.19%26.74%−4.55 pp[−16.06, +6.51]0.734

四個訊號的機率差與 95% 區塊自助信賴區間

只有 IS_k 的點估計為正,而且 95% 信賴區間整段落在 0 的右邊。另外三條的區間都橫跨 0,點估計還是負的,方向與「警戒該提高風險」相反。

警戒狀態下 vs 非警戒狀態下的崩跌起點機率

IS_k 警戒時的 32.29% 對上非警戒時的 17.22%,比值 1.875 倍。用同一份資料換個講法:IS_k 在警戒期間有 20 次是在崩跌起點前一週就已經亮燈(28 次裡的 71.43%),中位提前 12 週,四分位距 5.75 到 16.5 週。

另外兩個為什麼直接出局

β_s 與 β_k 的失敗有個具體理由,不用歸咎於運氣。

按照定義展開,β_k = −σ·(1/24)(z³−3z),這是 σ 的線性變換。線性變換不改變單調關係,所以 β_k 的死亡交叉「恆等於」σ 的上升趨勢交叉。實驗檔把這件事做成兩個可查的欄位:β_k 與 −σ 的相關係數是 1.0,交叉點是否完全重合這一項回傳 True。

逐欄比對也吻合。β_k 與 σ 對照組在命中率、命中次數、提前週數中位數、死亡交叉次數、26 週精確率、機率差、警戒中機率這 7 個欄位上完全相同。β_k 沒有構成一個獨立的高階動差訊號,它就是換了名字的波動率趨勢訊號。

β_s = −σ 乘上一個由偏態微調的係數,與 −σ 的相關係數 0.9715。偏態在裡面只負責調整係數,樣本內的相對調變幅度落在 −0.369 到 +0.2394 之間。訊號的方向盤還是握在 σ 手上。

這個檢查排除掉一個很平庸的解釋:如果三個訊號全都只是波動率的化妝品,那整組研究就沒有內容。IS_k 的行為與 σ 對照組明顯分開,它才是唯一對高階動差有專屬反應的候選。

信賴區間怎麼來的,以及它有多寬

週資料有自相關,普通 bootstrap 會把區間估得太窄。K1732 用循環區塊自助(circular block bootstrap),區塊長度 26 週,重抽 2,000 次,seed 固定 42。另外跑一組循環位移置換檢定(circular shift permutation),5,000 次,用來出單尾 p 值。

IS_k 的區塊自助信賴區間是 [+4.72, +25.01] 個百分點,寬度 20.29 個百分點。99% 區間 [+2.03, +28.52] 仍然排除 0。這個結論在兩個信心水準下都成立,但區間寬度本身就是一句警告:點估計 15.07 pp 的不確定性,跟估計值本身是同一個量級。

多重檢定要一起算。同一份資料上檢定了 3 個訊號,Bonferroni 校正後的門檻是 0.05/3 = 0.01667。IS_k 的 p 值 0.0138 低於這個門檻,過關,但只贏了 0.003。換一個更保守的校正方式,或者當初多放兩個候選訊號進來,這個結果就會掉到門檻之外。

估計子敏感度:換一個算法,結論會不會翻

高階動差的估計式有分歧:樣本版(bias-corrected)與母體版(bias=True)的偏態與超額峰態不一樣。這種選擇通常被寫在附錄,沒人檢查,可是它足以決定一條訊號的生死。

K1732 用母體版重算了一次 IS_k。死亡交叉次數兩邊都是 71 次,完全一致。交叉日期有 6 個不同,佔 71 次的 8.45%。逐週比對 1,439 個可比較的週,警戒狀態不同的只有 5 週,佔 0.347%。

結論對估計子的選擇不敏感。這句話的份量在於它是被測出來的,不是被假設的。

誠實的代價

IS_k 的正面數字上面講完了,接下來是它的帳單。

IS_k 死亡交叉警戒區與 30 次崩跌起點

圖三的橘色底就是警戒期間,覆蓋掉將近一半的畫面。精確數字是 49.13% 的週數處在警戒中。我從 k1732_metrics_weekly.csv 直接重算了一次 MA20/MA30 的狀態,得到 707 個警戒週除以 1,439 個暖機後的可評估週,等於 0.4913,與結果檔的欄位對得上。

一個有一半時間在示警的燈,實用價值要打折。26 週窗口的精確率是 45.07%,意思是 IS_k 亮燈之後的 26 週內,不到一半的情況真的等到崩跌起點。它總共發出 71 次死亡交叉,對應 28 個可評估起點,平均 2.536 次交叉才換到一個起點;β_k 的比值是 0.929,警訊少很多,但命中率只有 46.43%。

樣本量也要說清楚。28 個可評估事件,橫跨 29 年,這是崩跌研究的天花板,不是這份實驗偷懶。任何以 28 個事件為基礎的機率差,都會有很寬的區間,前面那個 20.29 個百分點的寬度就是它的直接後果。

所以這裡的結論只能寫成這樣:在 1997 到 2026 的台股週資料上,IS_k 的 MA20/30 死亡交叉狀態與未來 13 週的崩跌起點有正向關聯,關聯強度的 95% 信賴區間排除 0。這句話不等於「可以拿去交易」。從關聯到策略中間還缺交易成本、部位規則、樣本外驗證、以及跨市場的重複檢定,這四項 K1732 一項都沒做。

2026-07-17 這一週,訊號說了什麼

最後一個事件是 2026-07-17,該週 log 報酬 −6.1%,穿過 −5% 的門檻,成為樣本裡的第 30 個崩跌起點。

在這之前處於警戒中的是 β_s(3/27 死亡交叉,提前 16 週)與 β_k(4/03 交叉,提前 15 週)。也就是說,兩個回測不及格的訊號亮了燈。

IS_k 沒有。它的 MA20 減 MA30 缺口從 2026-05-29 的 +0.008348 一路收斂:+0.007624、+0.007493、+0.005564、+0.002411、+0.000963,7/10 小幅回到 +0.002346,直到 7/17 當週才翻負到 −0.004197。缺口在收斂的過程整整持續了七週,可是按照預先註冊的判定規則,翻負才算警戒,而翻負發生在崩跌的同一週,提前量是零。

這個結果不能拿來加分,也不能拿來扣分。2026-07-17 是樣本內的最後一點,它本來就參與了上面所有的估計,不是樣本外驗證。誠實的讀法只有一句:整組回測裡表現最好的訊號,在樣本內的最後一次事件上沒有提前示警。

要真的檢驗 IS_k,得等 2026-07-17 之後累積出新的獨立事件,用同一份鎖死的規格重跑。那份規格已經寫在 experiments/k1732/k1732.py 裡,參數沒有留活口。這是預先註冊唯一的好處,也是它全部的好處。

數字出處對照

文中每個數字都從 experiments/k1732/k1732_results.json 或同目錄的週頻 CSV 用程式讀出,鍵路徑如下。

文中數字JSON 鍵路徑
1,494 週 / 1997-07-11 ~ 2026-07-17data.n_weeks、data.period
26 週動差視窗、MA 20/30、bias-correcteddata.spec.moment_window、data.spec.ma、data.spec.moment_estimator
−5% 門檻、13 週 gap、30 個起點、−4% 版 26 個event_definition.primary_thr_weekly_log_ret、.episode_gap_weeks、.n_onsets_primary、.alt_thr / .n_onsets_alt
28 個可評估事件signals.IS_k.n_onsets_evaluable
32.29% / 17.22% / +15.07 ppsignals.IS_k.assoc_P_onset13_given_active、.assoc_P_onset13_given_inactive、.assoc_diff
CI95 [+4.72, +25.01]、CI99 [+2.03, +28.52]、p=0.0138signals.IS_k.assoc_diff_ci95_blockboot、.assoc_diff_ci99_blockboot、.assoc_diff_p_circshift_onesided
β_s / β_k / σ 對照的三欄數字signals.beta_s.*、signals.beta_k.*、signals.sigma_uptrend_benchmark.*
相關 1.0、交叉重合、0.9715、調變 −0.369~+0.2394mechanical_equivalence.corr_beta_k_neg_sigma、.beta_k_crosses_equal_sigma_crosses、.corr_beta_s_neg_sigma、.beta_s_skew_relative_modulation_range
B=2,000、block=26、5,000 次置換、seed 42bootstrap.B、bootstrap.block、signals.*.assoc_perm_B、seed
71 vs 71 交叉、6 個日期不同、5/1,439 週不同estimator_sensitivity_ISk.n_death_crosses_pop、.n_death_crosses_base、.n_cross_dates_differing、.n_active_weeks_differing、.n_weeks_compared
71.43% 命中、中位 12 週、IQR 5.75~16.5signals.IS_k.hit_rate_active_at_t_minus_1、.lead_weeks_median、.lead_weeks_iqr
49.13% 警戒負擔、45.07% 精確率、71 次交叉signals.IS_k.warning_burden_frac_weeks_active、.precision_26w、.n_death_crosses
46.43% β_k 命中率signals.beta_k.hit_rate_active_at_t_minus_1
週報酬 −6.1%、IS_k 未警戒、缺口八週序列case_2026_07_17.week_ret、.IS_k.active_at_t_minus_1、.IS_k.last_death_cross、.isk_gap_last8
β_s 3/27 提前 16 週、β_k 4/03case_2026_07_17.beta_s.last_death_cross、.beta_s.lead_weeks_at_t_minus_1、.beta_k.last_death_cross

衍生值的算式:15.07 pp = (0.3229 − 0.1722)×100;1.875 = 0.3229 / 0.1722;20.29 pp = 25.01 − 4.72;Bonferroni 門檻 = 0.05/3 = 0.01667;2.536 = 71 / 28;0.929 = 26 / 28;8.45% = 6/71;0.347% = 5/1,439;49.8 週 = 1,494 / 30;重算警戒負擔 = 707 / 1,439 = 0.4913。抽取與繪圖腳本:storage/drafts/assets/k1732/k1732_article_evidence.py,逐項數值與鍵路徑另存於 k1732_article_evidence.json。

資料來源:Yahoo Finance ^TWII 週頻收盤(auto_adjust),實驗編號 K1732。

相關文章

先讀正式關聯,若無則使用標籤與主題相似度補齊

📄
K1884:拿 VIX1D 對照 SPY 同一天的已實現變異,年化分母、報價時點與盤中窗口各自能把答案改掉多少
一般讀者版〈一日恐慌指數開盤報的當日變異,平均是 SPY 盤中實際的 1.56 倍:這個數字該怎麼讀〉給的是水準與讀法。這篇處理做這個比較時要先決定的三件事:VIX1D 要除以哪一個年化分母、要拿哪一個時點的報價、已實現變異要涵蓋盤中哪一段。 K1884 的結果顯示,這三個選擇造成的偏移,與要量的效果同一個量級;選錯任何一個,程式不會報錯,只會回答另一個問題。 先釐清估計量。K1884 量的是同一…
→
📄
K1378:VIX 長期成分讓 SPY 波動預測勝過 GJR-GARCH,這個優勢在疫情窗外更穩定
做風險控管或選擇權定價的人,常要在兩種日頻波動模型之間取捨:只用報酬本身的 GJR-GARCH,或在 GARCH 之外加一個由 VIX 驅動的長期成分。後者多了一個外部變數要維護,值不值得,要看它的預測優勢從哪裡來。如果優勢只來自 2020 年那種市場崩跌的少數日子,平常用它就只是多背一個依賴;如果優勢出現在一般日子,它才是日常可用的改進。 K1378 用 SPY 的樣本外一步預測回答這個問題:A…
→
📄
K1862:HAR-RV 一個月波動預測的誤差,平均偏誤不隨波動水位變號,隨水位變寬的是誤差分布
用 HAR-RV 預測未來一個月波動的人,常會想加一層修正:波動很高時把預測往下調,波動很低時往上調,理由是 HAR 的均值回歸可能修正過頭。這層修正值不值得加,取決於 HAR 的誤差是否真的隨預測當下的波動水位系統性變號。 一般讀者版〈HAR 波動預測的誤差往哪邊偏:六成交易日高估,平均誤差卻幾乎是零〉處理的是整體偏誤。這篇處理條件結構:依預測當下的波動水位把樣本外日子分成五組,誤差的平均、中位…
→