用 VIX 切三段看訂單流預測跳動:一次方法論的誠實失敗
讀者互動
已追蹤瀏覽 0 次,登入會員可按讚與收藏。
用 VIX 切三段看訂單流預測跳動:一次方法論的誠實失敗
研究上有一句話常被忽略:「失敗的實驗也是結果。」在 K1128 這次嘗試裡,我們本來想證明一個聽起來很合理的故事—— 當市場恐慌(VIX 高)的時候,訂單流的不平衡(OFI)對台指期下一根 K 棒是否「跳動」更有預測力 。結果是:原始的、能拿來實盤交易的設計 沒有過關 ;而退而求其次的描述性分析雖然出現耐人尋味的訊號,卻也讓我們看清,2020 年的疫情把「歷史能教未來什麼」這個假設撕裂得多徹底。
這篇文章把 K1128 的設計、為什麼失敗、以及我們從失敗裡學到什麼,都用一般讀者能跟上的方式說清楚。
故事的開頭:K1125 的尾巴
K1125 用台指期 5 分鐘 K 棒做了一件事:用「 訂單流不平衡 」(Order Flow Imbalance, OFI) 與它的絕對值,加上當下這根 K 棒是不是跳動,來預測 下一根 K 棒是不是會跳動 。所謂「跳動」是用 Lee-Mykland (2008) 的非參數方法偵測的,大致的概念是:把同期的「正常波動」估出來後,看當下這根 K 棒的報酬有沒有超出一個門檻,超出就標為「跳」。
K1125 的結果有個很尷尬的形狀:
- 2020 年(疫情高波動) :整體 OOS(樣本外)AUC 約 0.580,看起來訂單流真的能預測跳動。
- 2021 年(市場相對冷靜) :OOS AUC 掉到 0.547,幾乎沒什麼預測力。
K1125 也試過把 VIX 直接乘上 |OFI| 當成連續互動項(M4 模型),結果是 災難級失敗 ——樣本外比對連 baseline 都打不過。
於是 K1128 的問題很自然: 與其用一條連續曲線去描述「VIX 越高、訊號越強」,不如直接把資料切成三段(低 VIX、中 VIX、高 VIX),分開估三個模型 。這樣每段可以有自己的截距、自己的斜率,不用假設效果是線性的。
怎麼切?兩種方式都有問題
主設計:用 IS(樣本內)資料訂三段門檻
正派的做法是這樣:
- 用 2017-2019(IS 資料)算出 VIX 的 33% 與 67% 分位數當作切點
- 把這兩個切點 搬到 2020-2021(OOS 樣本外)資料上分組
- 在每一段裡,用 IS 子樣本去訓練 K1125 的 M3 模型,然後到對應 OOS 子樣本去驗證
這個設計的優點是:完全沒有偷看 OOS 資料,是真的能套到實盤的「明天用」。
訂出來的切點 :
- 低 VIX:≤ 12.07
- 中 VIX:12.07 - 14.99
- 高 VIX:> 14.99
問題立刻來了。
為什麼主設計會「退化」
我們把這些切點套到 2020-2021 OOS 資料上,發現:
| 段別 | IS 樣本數 | OOS 樣本數 | OOS 跳動數 | 狀態 |
|---|---|---|---|---|
| 低 VIX (≤12.07) | 10,585 | 0 | 0 | 沒辦法估 |
| 中 VIX (12.07-14.99) | 10,451 | 854 | 1 | 跳動數不足 |
| 高 VIX (>14.99) | 10,462 | 20,060 | 32 | 唯一能估 |
讀懂這張表: 疫情把整段 OOS 的 VIX 推高到完全跳出 IS 的歷史分布 。IS 期間(2017-2019)的 VIX 範圍只有 9.14 到 37.32;OOS 期間(2020-2021)的 VIX 範圍是 15.01 到 82.69。 OOS 完全沒有「低 VIX」的觀察,中 VIX 也只剩 854 筆、僅 1 個跳動事件 。
也就是說,當你拿「歷史的尺」去量「危機後的世界」,刻度根本對不上。
只剩高 VIX 段能跑模型。結果如下:
- M1(只用「當下是不是跳」當特徵)OOS AUC = 0.5148
- M3(加上 |OFI| 與 OFI)OOS AUC = 0.5926
- M3 vs M1 的比較統計強度 = +1.31
讀法:高 VIX 段下 M3 的 AUC 確實比 baseline 高,但「兩模型比較」的統計強度只有 +1.31, 沒到嚴格統計檢驗門檻(要求 ≥ 2.0) 。
而最關鍵的「H1 假說:低/中/高三段 AUC 是否單調遞增」根本 沒辦法測 ——因為低與中段都退化了。
主設計的最終裁定 :FAIL(沒有達到預先設下的三重門檻)。
次要設計:用 OOS 自己的資料切(只能做描述)
為了至少看一眼「是不是真的高 VIX 段比較有訊號」,我們 退一步 用 OOS 自己的 VIX 分布算切點:
- 低 VIX:12.3 - 18.84
- 中 VIX:18.86 - 25.34
- 高 VIX:25.35 - 82.69
並且 用整個 IS 訓練好的同一個 M1 / M3 模型 ,分別去三段 OOS 子樣本上看表現。注意這個設計 用了 OOS 的資訊 去切段,所以 不能拿來宣稱實盤可用 ——它只是一個描述性的視角。
| OOS 段別 | VIX 範圍 | 樣本數 | 跳動數 | M1 AUC | M3 AUC | 比較統計強度 |
|---|---|---|---|---|---|---|
| 低 | 12.3-18.8 | 7,074 | 16 | 0.530 | 0.562 | +0.53 |
| 中 | 18.9-25.3 | 6,894 | 11 | 0.499 | 0.496 | +1.85 |
| 高 | 25.4-82.7 | 6,946 | 6 | 0.499 | 0.626 | +3.59 |
兩個觀察:
- 高 VIX 段確實達到嚴格統計檢驗門檻 :M3 vs M1 的比較統計強度 +3.59,超過嚴謹研究所要求的 ≥ 3.0。M3 的 AUC 從 0.499 跳到 0.626,是這次研究裡最像樣的訊號。
- 但完全不是單調遞增 :低 0.562 → 中 0.496 → 高 0.626,是個 U 型 而不是樓梯狀。中 VIX 段甚至比低 VIX 段還差。
為什麼會這樣?三個可能的解釋
解釋一:中段樣本太小 。中 VIX 段只有 11 個跳動事件,AUC 估計的不確定區間很寬,0.496 可能是抽樣噪音。
解釋二:高 VIX 段樣本也很小 。整個高 VIX 段只觀察到 6 個跳動事件 。AUC = 0.626 與比較統計強度 +3.59 看起來漂亮,但這是建立在 6 個事件上的。如果這 6 個事件的時點稍微挪一下,數字可能完全不同。
解釋三:訊號真的只在極端市況浮現 。台指期的訂單簿在平常市況下流動性夠厚,大筆 OFI 不會立刻造成跳動;但在 VIX > 25 的恐慌期,流動性被抽走,同樣強度的 OFI 就會把價格直接推穿,這個機制聽起來合理,但 目前的證據強度遠遠還不能下定論 。
真正的教訓不是統計,是研究設計
這次實驗最值得寫下來的, 不是那個 +3.59 的數字 ,而是「 用 IS 切點到 OOS 的設計在危機資料上會退化」這件事。
寫得直白一點:
當 OOS 期間發生了 IS 從沒見過的市況(疫情、戰爭、政策大轉彎),用「歷史分位數」當作未來分組的標準會崩壞。歷史的低 VIX 分位數,在危機後變成「永遠到不了」的水位。
這不是台指期專屬的問題,是 所有用市場狀態切資料的研究 都要面對的陷阱。它意味著:
- 如果你的研究設計仰賴 IS-based 切點(regime split, percentile threshold, quantile-based grouping), OOS 包含結構性大事件時極可能整段塌陷 。
- 解法之一: 把 IS 拉長到包含先前的危機 (例如 2008 GFC、2011 美債上限、2015 中國貶值),讓 IS 的 VIX 分布更廣。
- 解法之二: 用展開窗口(expanding window)動態更新切點 ,而不是釘在 2017-2019 那個樣本。
- 解法之三: 乾脆放棄離散切段,改用連續函數 (樣條函數、B-spline)去描述 VIX 對訊號強度的調節作用。
這三條路就是 K1129、K1130 的設計方向。
圖:三段 OOS 表現一覽

四面板分別是:(1) 三段 AUC 對比;(2) 比較統計強度;(3) 高 VIX 段 M3 模型的係數;(4) 次要設計(OOS 內部切點)下三段的對比。
結論
K1128 沒有給我們一個能上線的策略,但它讓我們看清三件事:
- 訂單流對跳動的預測能力,可能真的集中在高波動期間 ——這個機制假說沒有被推翻,反而在描述性分析裡看到一點支持。
- 嚴格的「樣本內訂切點 → 樣本外驗證」設計在危機資料上會自爆 ,不是策略沒效,是設計工具不夠用。
- 研究誠實比看起來漂亮的數字重要 。如果只 cherry-pick 那個 +3.59 的高 VIX 統計強度,會誤導讀者忽略:那是 6 個事件、用了 OOS 切點、且 H1 沒過。
我們選擇把這次的失敗如實寫下來,而不是把它包裝成「成功的描述性發現」。後續的 K1129、K1130 會帶著這次的教訓往前推:用更長的 IS 期、用展開窗口、用連續函數,看訂單流到底在什麼條件下,真的能領先告訴我們「下一根會跳」。
資料來源
- 台指期 5 分鐘 K 棒 :TAIFEX TX 期貨,2017-2021,沿用 K1124 的快取,共 73,203 根 K 棒,有效預測樣本 52,412。
- VIX :yfinance
^VIX日收盤,套用 T-1 落後(前一個美國收盤對應隔天台指開盤)。 - 跳動偵測 :Lee-Mykland (2008) 非參數方法,K=16 滾動雙冪變異數,多重檢定 Gumbel 門檻 α=0.01,全期共 115 個跳動(佔有效樣本 0.21%)。
- 實驗檔案 :
experiments/k1128/k1128.py、experiments/k1128/k1128_results.json、experiments/k1128/README.md。 - 參考文獻 :
- Lee, S.S., & Mykland, P.A. (2008). Jumps in Financial Markets: A New Nonparametric Test and Jump Dynamics. Review of Financial Studies 21(6), 2535-2563.
- Cont, R., Kukanov, A., & Stoikov, S. (2014). The Price Impact of Order Book Events. Journal of Financial Econometrics 12(1), 47-88.
- Ang, A., & Timmermann, A. (2012). Regime Changes and Financial Markets. Annual Review of Financial Economics 4, 313-337.
本文是 K1128 實驗的一般讀者解說。完整的方法論、數值結果、Codex 程式審查紀錄與後續延伸方向(K1129、K1130、K1131)見實驗目錄的 README 與 results.json。
相關文章
先讀正式關聯,若無則使用標籤與主題相似度補齊