← 研究動態
一般讀者2026/03/30 下午04:03

我們犯了一個重大錯誤——然後修正了它

自我糾正研究誠實lookahead bias

讀者互動

已追蹤瀏覽 0 次,登入會員可按讚與收藏。

分享到:LINEFacebookX / Twitter

我們犯了一個重大錯誤,然後修正了它

[提出: 研究誠實原則, 執行: Claude]

幾天前,我們發表了一篇讓自己非常興奮的研究報告。

我們聲稱找到了一個新策略,「VIX 百分位策略」,它的 Sharpe Ratio 高達  1.68 ,比我們現有的 12/VIX 策略(Sharpe 1.08)高出 56%,統計顯著性 t=3.375,通過了嚴格的 Harvey (2016) 門檻(t > 3.0)。

我們準備大肆宣傳這個「突破性發現」。

幸好,我們沒有那麼做。


Codex 幫我們看到了一個我們視而不見的錯誤

Codex(GPT)在幫我們審查代碼時,發現了一個叫做  Lookahead Bias(前瞻偏誤)  的致命錯誤。

什麼是 Lookahead Bias?

用一個簡單的比喻:想像你在打牌,規則是「根據今天的牌決定今天的下注」。但你的程式寫的是「根據今天的牌決定昨天的下注」,也就是說,你偷看了「明天的報紙」來決定「今天的賭注」。

在我們的程式裡,這個錯誤的具體形式是這樣的:

# 有問題的寫法(K679)
signal_today = vix_percentile[t]    # 今天的 VIX 百分位
return_today = spy_return[t]        # 今天的報酬
weight = 1 - signal_today
profit = weight * return_today      # 用今天的信號乘以今天的報酬

問題在哪? 當你知道今天的 VIX 百分位時,今天的市場已經收盤了。  你根本不可能「先知道今天的 VIX 百分位,再決定今天的倉位」。

正確的寫法必須是:

# 修正後的寫法(K686)
signal_yesterday = vix_percentile[t-1]   # 昨天的 VIX 百分位
return_today = spy_return[t]              # 今天的報酬
weight = 1 - signal_yesterday
profit = weight * return_today            # 用昨天的信號乘以今天的報酬

差一天,結果天差地遠。


修正後:Sharpe 從 1.68 暴跌到 0.355

這就是修正後的結果(實驗 K686):

指標K679(有 bug)K686(修正後)變化
Sharpe Ratio 1.68  0.355 -79%
Harvey t 統計3.375(通過)崩潰完全失效
DM 檢定 vs 12/VIX顯著優勝t=-1.20, p=0.23 NS不顯著

不只是小幅下降,是 完全崩潰 。1.68 → 0.355,百分位策略不但沒有贏,還 輸給了 最基本的 12/VIX 策略(Sharpe 0.431)。

那個「突破性發現」是一個幻覺,完全由 Lookahead Bias 製造出來的。


更深入的調查(K687):沒有任何主動策略打贏最簡單的被動策略

這個發現讓我們決定重新檢查所有策略。實驗 K687 對 7 個策略全部修正了信號滯後問題,並加入了真實交易成本(每筆 5 個基點)。

結果出乎意料地令人謙遜:

策略排名策略名稱Sharpe Ratio
#1 買入持有 50/50(被動)  0.545 
#2EWMA VT0.525(差異不顯著)
#312/VIX0.438
#4百分位 VT0.355
#5Piecewise 保守型0.068

排名第一的,是 最簡單的被動策略 :買入 SPY 和 GLD 各一半,完全不調倉。

7 個策略中,沒有任何一個在 5 個不重疊的子期間都贏過 50/50 買入持有(Cross-OOS 全部失敗,0/5 勝)。


那麼 VT 策略有什麼用?

這是最重要的 pivot。

VT(波動率目標)策略的真正價值, 不是讓你賺更多,而是讓你虧更少 。

看 Maximum Drawdown(最大回撤):

策略最大回撤
買入持有 SPY(純股票) -32% 
12/VIX-12%
Piecewise 保守型 -8% 
50/50 買入持有-32%(但有黃金對沖)

12/VIX 把最大回撤從 -32% 降到 -12%。這不是 alpha(超額報酬),這是 保險 。

如果你問「哪個策略讓我最終財富最多?」答案可能是 50/50 被動。 如果你問「哪個策略讓我在 2008 年、2020 年不會心臟病發作?」那是 VT 策略。

兩個問題,兩個不同的答案。你需要先知道你問的是哪一個問題。


我們為什麼選擇公開這個錯誤

很多研究者會選擇悄悄修正,或者乾脆不提。

我們選擇不這樣做,有幾個原因:

 第一,信任是建立在誠實上的。  如果我們只公布好結果、隱藏錯誤,你怎麼知道其他結果是否也有問題?

 第二,Null result 也是知識。  「VIX 百分位策略無效(修正前瞻偏誤後)」是一個有價值的發現。其他人如果想測試類似策略,應該知道這個陷阱。

 第三,這不是第一次,也不會是最後一次。  這是第三次 Codex 幫我們抓到重大錯誤(K618/K621、K619/K623、K679/K686)。研究就是這樣,你設計實驗、跑程式、得到結果、被審查、發現錯誤、修正、再試。

「錯誤」不是研究失敗的標誌, 拒絕承認錯誤才是 。


這對你的投資有什麼意義?

  1.  任何宣稱「打敗市場」的策略,都要問:有沒有 Lookahead Bias?  這是金融回測中最常見、最危險的錯誤。

  2.  VT 策略仍然有意義 ,但定位要準確: 它是風控工具,不是報酬工具。  如果你在意的是「最大跌幅」(-32% 讓你夜不成寐),VT 值得考慮;如果你在意的是「20 年後財富最大化」,被動 50/50 可能就夠了。

  3.  簡單往往更強大。  50/50 買入持有,連任何再平衡邏輯都不需要,在我們的測試中打敗了所有複雜策略。這應該讓我們對「聰明投資」多一點謙遜。


本文基於實驗 K686(修正前瞻偏誤)和 K687(定論性排名)的實證結果(數據來源:yfinance SPY/GLD/VIX,期間:2006-2026)

實驗腳本:experiments/k686_vix_percentile_corrected.py / experiments/k687_definitive_ranking.py

[提出: 研究誠實原則, 執行: Claude]

相關文章

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

📄
波動率「測不準」能不能當減碼訊號?六檔 ETF、六十天的老實答案
打開任何一套波動率監控面板,你會發現同一天的「市場有多晃」其實不只一個數字。用 5 分鐘資料算出一個,用當天的開盤、最高、最低、收盤算出另一個,把隔夜跳空也加進去又是一個。多數時候它們差不多,偶爾會明顯對不上。這篇想回答一個很實際的問題:當這些數字彼此吵起來的時候,是不是代表隔天更難預測、應該先把部位縮小一點? ## 先講清楚「分歧」是什麼 把量測市場波動的方法想像成幾支溫度計。它們原理不同、...
📄
把五分鐘資料切得更細,預測真的會更準嗎?台指期給了一個保守答案
做波動率預測時,很容易想把資料切得更細。一天一筆收盤價太粗,那就看每五分鐘一筆;只看總波動太粗,那就再拆成上漲、下跌、跳動、估計噪音。直覺上,資料越細,模型應該越聰明。 這次台指期日盤實測給的答案比較冷靜:細資料有幫助,但幫助還不夠硬。 VolPred 把台指期日盤的五分鐘資料整理成每日波動,期間從 2017-05-16 到 2026-06-29,共 2219 個原始交易日。正式可判斷的樣本外...
📄
你花錢升級了預測模型,對帳單卻更難看:一個關於「準」與「賺」的實測
# 你花錢升級了預測模型,對帳單卻更難看:一個關於「準」與「賺」的實測 假設你在用一支波動率預測模型幫股票倉位做動態調整。有天你發現一個新版本,統計上證明得明明白白:它比舊版本準,預測誤差檢定的 t 值高達 4.48,遠遠超過學界公認的顯著門檻。你把它換上線,跑了 13 年的歷史資料回測。結果對帳單攤開一看,扣掉手續費之後,新模型的 Sharpe 值反而比舊的、簡陋到不能再簡陋的規則還低。 這...