實驗室

M/09 · 預先註冊的曲面穩定性檢定

樣本內平滑度能否預測樣本外技巧?

對語料庫中一項文字主張的預先註冊經驗檢定,該主張稱平滑、寬廣的樣本內 Sharpe 山脊能在樣本外通用,而尖銳的峰刺則否。SOL 試行:在彙總層級保留 H₀,且家族層級具強烈異質性。DOGE + BTC 複製進行中。

假設

Daru Finance 的 語料庫頁面 含有以下這項文字主張: “平滑、寬廣的山脊意味著該家族在其參數受擾動下擁有一個穩定的績效盆地;被塌縮兩側夾擊的尖銳峰刺則意味著該家族脆弱,其樣本內峰值很可能是過度擬合而非真實。” 這句話已在語料庫頁面印行了一段時間,卻不附帶任何經驗檢定。本專案就是那項檢定。它經過預先註冊,超參數在複製資料載入之前便已鎖定,且其書面報告承諾無論結果落在哪一邊都會發表。

在運作上:選定一個策略家族 F、一個資產 a、與一個滾動前推視窗 w。對 (F, a, w) 樣本內前 K 名中的每個策略 θ,量測當回測在一組固定的五擾動套件,入場確認、手續費、滑價、入場+指標,下重新執行時,其樣本內 Sharpe 抖動了多少。那五個 Sharpe 的標準差即為 σmicro(θ)。透過對樣本內前 K 名取 σmicro 的平均,彙總至單元層級。OOS 穩健性指標 RK 為同一組 K=5 策略在視窗 w+1 的平均基準擾動 OOS Sharpe。兩個正式定義為:

H0:在控制了家族/資產/視窗固定效應之後,RK ~ σmicro 中的 βsmooth 為零或為正。H1(單側):βsmooth < 0,樣本內穩定的策略在樣本外通用得更好,正如那句文字主張所預測。K = 5 與本機構既有的投組慣例(CheckerWFO)一致。

預先註冊

有兩個提交至關重要。第一個,8e62171552f284b6dbbe6a5d450d41618935fd76,是 analysis-plan.md 的初始提交,鎖定了假設、四個敏感度指標(σmicro、σmicro,z、σparam、σcombined)、四個穩健性指標(RK、RPT、Rρ、Rlift)、納入/排除規則、估計量族、置換虛無協定、橫跨次要 15 組 (σ, R) 配對的 BH 多重性規則,以及升格為文章的閾值。它在任何 parquet 生成之前便已提交。

第二個,1badde4,是 analysis-plan-locked.md:試行後的超參數鎖定。它凍結了 σparam 鄰域定義、針對數值假象的 |Sharpe| 上限、取代 MixedLM 的「OLS 搭配家族叢集化 SE」估計量,以及取代 R 之 lme4 的 within-transform 交叉檢核。它在 SOL 試行結束之後、且在任何 DOGE 或 BTC parquet 存在之前提交;對 data/ 的目錄 mtime 檢查可驗證這點。

本設計為試行–複製分割。SOL_1h_7W 分割是試行,純粹用以鎖定預先註冊留待開放的超參數(例如 σparam 之確切「1 步」規則,以及叢集穩健 SE 的叢集化選擇)。試行的檢力不足以確認任何事(n_cells = 42,在 f² = 0.05 時檢力約 0.55)。確認來自彙總的 DOGE_30m_21W + BTC_30m_27W 複製,n_cells ≈ 322,在 f² = 0.05 時檢力 > 0.95。複製以鎖定的超參數執行,不再進一步調校。

方法論

語料庫以 Rust 解析: src/parse_corpus.rs 走訪每一棵 <asset>/<family>/<strat>/<strat>.txt 樹,以正規表示式將每一行 Wxx 萃取成一筆以 (asset, family, strategy, base_param, transformation, confluence, sl_regime, window, sample, perturbation) 為鍵的長格式列,並為每個資產輸出一個 parquet。解析器的正確性透過對每個資產隨機抽取的五個文字檔,逐一手動比對 parquet 列以做抽查。

單元層級的 dataframe 每 (家族, 資產, 視窗) 一列。對每個單元,σmicro 先在策略層級計算,再對樣本內前 K 名取平均;而 RK 為同一組 K=5 策略在一個視窗之後的平均基準 OOS Sharpe:

納入條件:一個單元被保留,若且唯若 (i) 視窗 w+1 存在、(ii) (F, a) 中有 ≥ 30 個策略在視窗 w 具備全部五種擾動變體、且 (iii) 其中至少有 K=5 個具有非空的樣本內 Sharpe。SOL 上的 RSI_LEVEL 家族僅有 12 個策略,因 n ≥ 30 的下限而被排除於主要的單元層級模型之外;改於策略層級的敏感度中回報。

估計量與推論

預先註冊的模型是一個在家族、資產與視窗上具隨機截距的線性混合效應擬合。實務上,在 SOL 試行的 n_windows = 7 時,視窗的隨機效應共變異數是奇異的,而 MixedLM 的 REML 最佳化器無法收斂。鎖定的替代方案是 OLS,搭配家族叢集化的穩健標準誤,並在家族、視窗與資產上具明確固定效應:

其中 為家族層級的叢集穩健三明治估計量。推論使用一個 M = 1000 的置換虛無:在 (a, w+1) 單元內,打亂 OOS-Sharpe → 策略的指派,重新計算 RK,重新擬合,並記錄 βsmooth,null。經驗單側 p 值為

預先註冊要求一個 R/lme4 的跨語言驗證。環境中未安裝 R,而引入它會破壞本機構的三語言標準(Rust + Python + R 僅在主機上三者皆已支援時才維持可用)。鎖定的替代品是一個在 Python 中從頭實作的 within-transform OLS:對 F / a / w 減去組均值,在殘差上擬合 OLS,並計算解析 SE。兩個實作在 βsmooth 上必須吻合至三位小數。在 SOL 試行上,它們吻合至 1.1 × 10⁻¹³

對預先註冊已記錄的偏離

三項偏離在結果中誠實回報,就在預先註冊所述的同一處:

  • |Sharpe| > 100 上限。預先註冊的哨兵規則僅排除 nan±inf。在解析器執行之後,數量級約 1.4 × 10¹⁶ 的 Sharpe 值出現在 trades = 2 的列上:回測器在那些交易上以一個近乎零的已實現波動率去除年化報酬,因而產生數值假象。鎖定的規則丟棄 |Sharpe| > 100 的列。這是一項已記錄的探索性偏離。
  • 以 OLS + 家族叢集化 SE 取代 MixedLM。在 n_windows = 7 時奇異的隨機效應共變異數破壞了 REML。鎖定的估計量保留了叢集穩健的意圖(在家族上叢集化),並重現與預先註冊模型相同的固定效應結構。
  • 以 within-transform OLS 取代 R / lme4 交叉檢核。R 不可用;改以 Python 實作解析減均值。SOL 試行上的 Δβ < 1e-13 吻合即為驗證。

SOL 試行結果

試行在 SOL_1h_7W 上執行,即本機構在 SOL/USDT 1h K 棒上的 7 視窗滾動前推分割。在每單元 n ≥ 30 策略的下限之後,n_cells = 42,橫跨 7 個家族 × 6 個轉移(RSI_LEVEL 已排除)。主要擬合為:

  • βsmooth = +0.115(標準化的 σmicro
  • SE = 0.121,t = +0.95
  • p單側(H1:β < 0)= 0.829
  • pperm(M = 1000)= 0.843
  • f² = 0.038(恰低於 0.04 的升格為文章下限)
  • 跨實作:βwithin = +0.115,Δ = 1.1 × 10⁻¹³

在彙總層級,βsmooth 的號與 H1 所預測的相反:在 SOL_1h_7W 上,樣本內較尖銳的單元平均而言在下一個視窗中略勝於樣本內較平滑的單元。這遠未達顯著,置換虛無以 −0.004 為中心、標準差 0.118,而觀測到的 +0.115 舒適地落於其內(pperm = 0.843)。試行上在彙總層級保留 H0

Fig. 1:SOL_1h_7W 試行。每個點為一個 (家族, 視窗) 單元:x = 樣本內前 K 名的平均 σ_micro,y = R_K(視窗 w+1 的平均基準 OOS Sharpe)。依家族著色。叢集內迴歸線的 β_smooth = +0.115,斜率為正,與方向性 H₁ 相反。ATR 單元(深色)與 RSI 單元(橘色)形成一條清晰的負向次斜率;EMA、STOCHK 與 MACD 將彙總值拉往另一邊。
Fig. 2:SOL 試行上 β_smooth 的置換虛無(M = 1000)。虛無均值 −0.004,虛無標準差 0.118;分位數 q05 = −0.20,q95 = +0.19。觀測到的 β_smooth = +0.115 落於虛無的第 84 百分位。對 H₁ 的單側 p_perm 為 0.843。虛無校準良好:在「以打亂建構」之下,α = 0.05、0.01 時的經驗型一錯誤率重現了名目水準。

逐家族細目

彙總會掩蓋真實的異質性。依家族切分並在八個家族間做 BH 校正,可得更清晰的圖像:

  • ATR:β = −0.33,pBH < 0.0001。強烈支持假設,在 ATR 之內,樣本內較平滑的單元以寬廣的差距在樣本外勝過樣本內較尖銳的單元。
  • RSI:β = −0.38,pBH = 0.28。號正確、量級大,但 RSI 內的 n_cells 小到足以使 BH 不予拒絕。
  • PPO、SMA:β 微弱為負,兩者皆未接近 BH 顯著。
  • EMA、STOCHK、MACD:β 為正。EMA 與 STOCHK 是驅動彙總號翻轉的兩個家族。兩者皆為動量風格家族,具較淺的樣本內 Sharpe 曲面;它們內部的 σmicro = 0 區域,似乎與一個平坦為零的 RK 區域重合,而非與一條高 RK 的山脊重合。

誠實地解讀試行:在族群層級,平滑度在 SOL 上並不預測 OOS 技巧。在家族層級,它在 ATR 之內確實預測(且很可能在 RSI 之內,若有更多單元的話),而在動量家族之內則否。根據此證據,語料庫的那句文字主張是家族條件性的,而非普世性的。

曲面本身

數字解決了經驗問題;曲面則展示我們所稱的平滑與尖銳究竟是什麼。下方:每個家族在中段滾動前推視窗(W = 4)、於 SOL/USDT 1H 上計算的樣本內 Sharpe 地景,展示於 (transformation × confluence) 參數網格上。每個面板皆標註 σL(一個離散拉普拉斯平滑度指標,愈低則幾何上愈平滑)以及來自複製池的逐家族 βsmooth(為負即支持假設)。依平滑 → 尖銳排序。

PPO
β = +0.16
σL = 0.952n = 223
ATR
β = -0.85
σL = 1.120n = 223
STOCHK
β = +0.42
σL = 1.289n = 223
RSI
β = -0.09
σL = 1.328n = 223
MACD
β = +0.63
σL = 1.647n = 220
EMA
β = +0.32
σL = 1.675n = 223
SMA
β = +0.01
σL = 1.899n = 223

Each panel: IS Sharpe surface over the (transformation × confluence) grid for one family on SOL/USDT 1H, mid walk-forward window, median over base-parameter and SL-regime slices. Camera orbits 360° in 20 s. σL = discrete-Laplacian smoothness (lower = smoother). β = per-family OLS slope of RK on σmicro from the replication pool (negative = hypothesis-supporting; positive = anti-hypothesis). Videos are lazy-played: decoding pauses when the section scrolls offscreen. Sorted smoothest → spikiest by σL.

依 σL 最平滑的曲面為 PPO(0.95)與 ATR(1.12);最尖銳的為 EMA(1.68)與 SMA(1.90)。若語料庫的那句文字主張是一條乾淨的線性律,這些 σL 排序應當與逐家族 β 同步。它們並未確切如此。ATR,具大負 β 的家族中最平滑者,落在所假設的那一側;MACD 與 EMA,具最大正 β 的家族,明顯較尖銳,同樣落在所假設的那一側。但 PPO 是最平滑的曲面、卻帶著 β = +0.16,而 SMA 是最尖銳的、卻帶著 β ≈ 0。單一視窗上的幾何平滑度與橫跨所有轉移的預測性平滑度之間的關係是真實的、卻是局部的。那份局部性正是「保留 H0」之彙總結果所反映的。

Fig. 3:SOL 試行上 σ_micro 對 R_K 的逐家族小型多圖。ATR(左上,β = −0.33***)是最乾淨、家族內支持假設的案例。RSI 呈相同的號,但單元不足以拒絕 BH。EMA、STOCHK 與 MACD 呈正的家族內斜率,這些家族中樣本內尖銳的單元在 SOL 上並未付出 OOS 代價。彙總 β = +0.115 是這三種機制的族群加權混合。

在 DOGE + BTC 上的複製

複製解析 DOGE_30m_21W(Δt = 30m,21 個滾動前推視窗)與 BTC_30m_27W(30m,27 個視窗)並將兩者彙總。來自 1badde4 的鎖定超參數原封不動地套用:相同的五擾動套件、相同的 K = 5、相同的 n ≥ 30 下限、相同的 |Sharpe| > 100 丟棄、相同的 OLS + 家族叢集化 SE、相同的 M = 1000 置換虛無。彙總 n_cells ≈ 322;逐資產三角驗證將 SOL、DOGE 與 BTC 各自分列。

將 DOGE(ncells = 140)與 BTC(ncells = 182)彙總得出 βsmooth = −0.058,叢集穩健 SE 0.126,單側置換 pperm = 0.272(M = 1000),效應量 f² = 0.0002。號現在與假設相符,這是此語料庫上三次估計中的頭一次,但相對於跨單元殘差變異數而言量級偏小,且結果舒適地落於虛無之內。OLS 與 within-transform 之間的跨實作檢核在較大樣本中發散至 |Δβ| = 0.016(相對於試行的 1×10−13);此落差由不平衡資產/視窗設計中的對比編碼所驅動,而兩個估計量在號與數量級上一致。

逐資產三角驗證正是圖像變得明確之處。SOL β = +0.115(n = 42);DOGE β = +0.163(n = 140);BTC β = −0.210(n = 182)。號在 DOGE 與 BTC 之間翻轉,且兩者各自皆不顯著。此處不存在一致的族群層級關係。彙總 β < 0 是一個正向押注與一個負向押注的加權代數平均;它並非支持假設的證據。

Fig. 4:主要設定下,附叢集穩健 95% 信賴區間之 β_smooth 的逐資產三角驗證。SOL 試行 β = +0.115(n = 42);DOGE β = +0.163(n = 140);BTC β = −0.210(n = 182)。跨資產分割的號翻轉是此結果最強的單行摘要:在預先註冊所指定之 σ_micro 的運作定義下,擾動敏感度並不以一種能在更換資產後仍存續的方式去預測下一視窗的 OOS Sharpe。

複製池上的逐家族細目(在七個次要檢定家族內做 BH 校正;RSI_LEVEL 因 n ≥ 30 下限而排除)講述了一個更為細緻的故事。ATR β = −0.850(未校正 p = 0.044,pBH = 0.310),整個研究中最大的單一家族內負斜率,也是唯一一個在試行與複製間號能複製的家族。RSI β = −0.090(pBH = 0.888);EMA、MACD、PPO、SMA、STOCHK 全為正(β 介於 +0.011 與 +0.631;所有 pBH = 0.888)。經 BH 校正後沒有任何項跨越 α = 0.05,但其結構性發現,ATR(以及微弱地 RSI)的行為一如那句文字主張所預測;動量家族的行為則相反,在試行與複製間是一致的。

升格為文章的標準(已鎖定、已評估)

預先註冊要求以下三者皆須滿足:

  • 複製 pperm < 0.01,得到 0.272。未通過。
  • 橫跨 SOL / DOGE / BTC 號一致的 βsmooth < 0,得到 +0.115、+0.163、−0.210。未通過。
  • f² ≥ 0.04,得到 0.0002。未通過。

此標準在三個閾值上同時失守。該結果並不升格為一篇文章;語料庫頁面的那句話依下方預先註冊分支 3 改寫。

這對語料庫主張意味著什麼

三個分支已預先指定,並對 /corpus 的改寫計畫事先提交:

  • 強烈支持(複製 pperm < 0.01、β < 0、f² ≥ 0.04)。語料庫的那句話維持其現有形式,並新增一條連往此處的腳註。一篇關於家族條件性結構(ATR/RSI 對動量家族)的獨立文章將會發表。
  • 微弱支持(複製 pperm < 0.05、號一致、f² < 0.04,或三項標準之一未通過)。語料庫的那句話改寫為: “在均值回歸家族之內,平滑的樣本內山脊呈現微弱證據,顯示其在樣本外比尖銳峰刺通用得更好;動量家族並未呈現此型態,且族群層級的主張未獲支持。” 僅限實驗室頁面;無另立文章。
  • 虛無/號翻轉(複製不顯著,或號一致地為正)。語料庫的那句話卸下其絕對化的措辭,並以下文取代: “在我們所檢定的語料庫上,微結構擾動下的樣本內平滑度並非樣本外技巧的族群層級預測因子。需要家族層級的分析。” 實驗室頁面乾淨地回報該虛無結果,並將讀者導向逐家族異質性圖。

試行已給出理由去預期,這份書面報告將落在第二與第三分支之間的某處。ATR 是真實的;族群層級的主張很可能不是。複製的任務是說出兩者之中何者才是頭條。

即時示範

3D 曲面,即時

上方的 MP4 是七個特定語料庫曲面的內建檢視。下方的示範讓你親手塑形一個曲面:將平滑度滑桿往 1 撥以得到一個寬廣的鐘形(「ATR 的樣貌」),往 0 拖以得到一個被塌縮環繞的尖窄峰(「MACD 的樣貌」)。擾動雜訊滑桿加入高頻抖動,即 σmicro 的經驗類比。σL 讀數即時更新。網格刻意採低多邊形(32×32 = 1,024 個頂點、單一材質、一道 wireframe 通道),如此即便是一支孱弱的手機也能以 60 fps 旋轉它而毫不費力。

smoothness (1 = wide bell · 0 = sharp peak)
0.85
perturbation noise (high-freq jitter)
0.020
σL (Laplacian energy)
0.0125
Lower σL = geometrically smoother; the corpus values ranged 0.95 (PPO, smoothest) to 1.90 (SMA, spikiest).
presets
Drag the surface to rotate freely; wheel / pinch to zoom. Auto-rotate stops once you interact.
INITIALIZING WEBGL…

Synthetic IS Sharpe surface, 32×32 mesh, vertex-coloured by height. The smoothness slider interpolates between a wide low bell (smooth basin under perturbation, hypothesised to generalise OOS) and a narrow tall spike with flat collapse around it (brittle peak, hypothesised to overfit). The perturbation noise slider adds high-frequency jitter that approximates what σmicro measures empirically. σL in the panel updates live so you can see how the geometry and the smoothness metric move together.

(σ, R) 散佈圖,即時

不同的鏡頭,同一個專案。這第二個示範讓你在一個可調的底層 β 與樣本大小之下,刷看單一家族中 σmicro 與 RK 之間的模擬關係。它並非對語料庫的擬合,語料庫結果在上方各圖以及複製 parquet 之中,但它建立起對「βsmooth = ±0.3 作為散佈圖實際長什麼樣子」的直覺,以及「被 42 個嘈雜單元愚弄有多容易」。

true β (population)
β = -0.30
n cells
n = 42
residual noise σ
σ_ε = 0.60
fitted slope
H₀ retained (β̂ = -0.09, p = 0.732)
try the per-family β observed on the corpus
-1.0-0.50.00.51.00.51.01.5σ_microR_Kfitted: β̂ = -0.09true: β = -0.30

Synthetic. The dashed grey line is the true β; the amber line is the fitted slope on this sample. Resample to see how often the sign flips at small n. The pre-registered article criterion was f² ≥ 0.04, try setting β = −0.3 with n = 42 vs n = 322 and watch how visibility-of-effect changes. The corpus pilot was n = 42; the replication pool was n = 322.

可重現性

DaruFinance / quant-surface-stability

Python · 開源參考實作

最小調用

# Reproduce: pre-reg locked at 8e62171; hyperparameter lock at 1badde4
git clone https://github.com/DaruFinance/quant-surface-stability.git
cd quant-surface-stability

# 1. Parse strategy text dumps -> parquet (Rust, ~1m per asset)
cargo run --release --bin parse_corpus -- --asset SOL_1h_7W

# 2. Build cell-level (family x asset x window) metrics
python scripts/compute_metrics.py --asset SOL_1h_7W

# 3. Primary fit: sigma_micro x R_K, OLS + family-clustered SEs,
#    permutation null with M=1000, within-transform cross-check.
python scripts/fit.py --asset SOL_1h_7W --primary
# beta_smooth = +0.115   p_perm = 0.843   f^2 = 0.038
# cross-impl. delta = 1.1e-13   --> H_0 retained at aggregate level

參考文獻

  1. [1]Bailey, D. H. & López de Prado, M. (2014). The probability of backtest overfitting. Journal of Computational Finance 20(4), 39–69.
  2. [2]Harvey, C. R. & Liu, Y. (2014). Backtesting. Journal of Portfolio Management 42(1), 13–28.
  3. [3]Carrasco, M. & Maciel, L. (2020). Robustness of in-sample optimisation in trading rule selection: a parameter-stability perspective. Quantitative Finance 20(11), 1799–1816.
  4. [4]Benjamini, Y. & Hochberg, Y. (1995). Controlling the false discovery rate: a practical and powerful approach to multiple testing. Journal of the Royal Statistical Society B 57(1), 289–300.