股票觀測站台指期 · 題材 · 美股 · 論文

MARKET RESEARCH

回測結果

walk-forward 樣本外(h=5,3,841 筆)· 勝率與原因拆解 · 改善流程與追蹤

總體(walk-forward 樣本外)口徑 execution=next_open/interval_model=garch/initial_train_days=1250

方向命中率36.0%多數類基準 38.3%
進場勝率47.2%基準 50%(隨機)|未扣成本;扣成本版見下方原因③
進場比例63.2%2,426/3,841 天
每次進場成本3.07 bp= 0.0307%,一買一賣合計,以全期中位價換算(帳戶權益卡改用成交當日價格);assumed-cost (參數未查證)

訊號統計不是投組權益。h3/h5 持有窗重疊;未從成交、部位、費用、資金帳重建前,訊號累積不能視為帳戶報酬。兩種勝率不可混為一談。 「方向命中率」含中性預測,一個永遠說中性的模型在震盪盤就能拿高分——那正是本專案踩過的退化預測器陷阱。要判斷可交易性看進場勝率(只算真的會下單的日子)與下方的盈虧結構。

原因① 分市場波動狀態(sigma20 三分位)

波動組n方向命中率進場比例進場勝率訊號平均報酬實際震盪佔比
低波動128133.1%72.3%44.5%-0.10%32.0%
中波動128034.7%64.1%49.5%+0.08%36.3%
高波動128040.3%53.1%48.1%-0.04%46.7%

同天期、同表樣本:高波動組進場勝率 48.1%,排名居中。各組報酬未扣成本;此分組比較不能單獨解釋因果或證明交易能力。

原因② 分預測方向

預測方向n方向命中率進場勝率訊號平均報酬實際平均報酬
偏空196627.8%43.5%-0.15%+0.15%
中性141544.9%——+0.39%
偏多46043.9%63.0%+0.51%+0.51%

同一份 h=5 OOS 樣本中,模型預測偏空比例 51.2%。實際標籤分布:跌 24.0%/震 38.3%/漲 37.6%。類別權重是偏向的候選解釋,須以事前登記的消融驗證;這張表本身不支持因果判定。

原因③ 盈虧結構(訊號品質診斷,已扣全期中位價成本)

勝率46.6%2,426 次進場
賺賠比1.085平均賺 +1.95%/賠 -1.79%
獲利因子0.9458<1 = 長期虧損
每次進場期望值-0.0519%已扣成本

⚠️ 這一組是逐筆訊號的診斷,不是帳戶損益。報酬用的是標籤 y_ret_5d(訊號日收盤 → 第 5 天收盤),而訊號在收盤後才產生、那個收盤價成交不到;成本用全期中位價換算成固定 bp。h3/h5 的持有窗互相重疊,逐筆期望值不能乘上筆數當成帳戶報酬。可成交、可重算的版本在下一張「帳戶權益」卡。
勝率高不等於賺錢,這一組數字回答「就算猜對,幅度夠不夠覆蓋成本」。目前獲利因子 0.9458——小於 1,總獲利填不滿總虧損。賺賠比 1.085(贏的時候賺得比較多),勝率 46.6%,兩者相乘後每次進場期望值 -0.0519%(負,已扣成本)。

帳戶權益(h=5,照規則逐筆建帳;2010-01-15 ~ 2025-09-11)

期間總報酬年化最大回撤Sharpe累計成本平均 |淨曝險|
模型訊號-30.3%-2.28%-49.9%-0.1515.3%0.57
同規則一直做多(對照)+254.6%+8.42%-26.8%+0.6122.6%1.00

規則 subaccount-1/h/next_open/v1:5 個子帳各配 1/5 資金,第 t 天的訊號歸子帳 t mod 5;漲 → 做多、跌 → 做空、震 → 該子帳空手;訊號日的下一個交易日開盤進場,進場日算第 1 天、第 5 天收盤出場;第 1 天報酬是開盤→收盤,之後用 ret_roll(轉倉不造假跳空);進場日鎖死 → 不成交、出場日鎖死 → 順延;上一筆還沒出場的子帳跳過,總曝險永遠 ≤ 1 倍名目;成本在成交當日以當天價格換算(按口手續費+按名目期交稅+按 tick 滑價),不是全期中位價。不同子帳的反向部位不互相沖銷。

逐筆:成交 2,422、空手 1,415、鎖死擋下 1、出場順延 1、子帳忙碌跳過 1、資料尾端不足 2。⚠️ 這是曝險比例的帳:口數、保證金、帳戶資金要等帳戶參數填了才算得出來;另一種規則(每天把子帳合成單一目標部位、互相沖銷以省成本)是另一個版本,這裡沒有算。成本仍是 assumed-cost。歷史段已被看過多次,這張表是診斷,不是未見資料的確認。

原因④ 分年度(訊號逐筆加總 8/16 年為正)

年n方向命中率進場勝率訊號逐筆加總(非帳戶)帳戶權益(子帳 1/h,扣成本)同期市場(ret_roll)
201024229.8%43.7%-92.02%-19.99%+14.01%
201124730.8%52.2%+65.04%+9.97%-16.63%
201225038.0%52.6%+51.74%+8.28%+15.85%
201324643.9%63.7%+81.80%+13.23%+20.69%
201424833.5%41.6%-7.88%-2.78%+10.06%
201524441.4%58.5%+83.51%+15.68%-7.30%
201624434.4%47.6%-4.99%-2.79%+23.19%
201724631.3%37.3%-80.76%-12.36%+19.62%
201824734.4%46.8%+47.84%+3.23%-4.64%
201924230.2%35.8%-75.99%-12.77%+30.64%
202024534.7%38.2%-104.56%-14.01%+35.90%
202124439.8%52.7%+34.09%+2.15%+28.72%
202224642.3%58.6%+19.22%+2.39%-17.29%
202323935.6%43.3%-55.35%-13.42%+28.67%
202424240.1%50.0%+18.46%+3.32%+25.69%
202516936.7%32.9%-31.73%-6.91%+13.63%

能力若是真的,應該在多數年份都在;若集中在少數幾年,多半是運氣或特定 regime。訊號逐筆加總 8/16 年為正;最長連續為負:2016–2017(2 年)。「訊號逐筆加總」是該年每一筆 類別 × y_ret_5d 直接相加(未扣成本;h3/h5 的持有窗重疊,同一筆錢被算了好幾次),只能看方向,不能當報酬讀;可以當帳戶讀的是「帳戶權益」那一欄,最右欄是同期市場(期貨連續持有 ret_roll,不扣成本,當背景用)。同期市場上漲、而訊號逐筆加總為負的年份:2010、2014、2016、2017、2019、2020、2023、2025——與偏空傾斜的描述一致,但這張表不支持因果判定。

進步流程每一關的數字 = 目前停在該關的提案數

① 診斷 0
回測把問題量化出來
② 結論 0
證據支持什麼,不多說
③ 提案 0
具體要改什麼
④ 凍結判準 3 項
寫 prereg,先寫死才能跑
⑤ 執行檢定 0
解凍後跑,消耗驗證折
⑥ 再回測驗證 3 項
採用 / 否決 / 假說推翻

🔒 ③ → ⑤ 不可跳關。中間的「凍結判準」就是 prereg——看了成績再訂門檻等於沒有門檻,那樣跑出來的數字不能用來決定要不要拿真錢上場。目前 0 項停在提案階段還沒寫 prereg,排隊中的檢定預計消耗 3 次驗證折(已用 43 次)。

改善提案登記簿(6 項,3 項未完成)每一列都要能回答:從哪個證據來、判準凍結了沒、最後怎麼判的。登記簿裡的數字是提案當時的快照(日期見各列),與本頁現算的卡片可能不同——例如成本參數當時 9 項未查證、現值以頁首橫幅為準;現值一律以卡片為準

發現結論如何提升狀態
bearish-tilt
偏空預測佔 52.40%,實際下跌日僅 25.16%(過度預測 2.1 倍);偏多預測佔 14.77%,實際 31.99%
虧損集中在偏空訊號。偏多訊號的勝率與平均報酬都是正的,只是次數少 3.5 倍。系統性偏空傾斜是目前最大的單一虧損來源。先分辨成因(H1: class_weight=balanced 造成少數類過度預測 / H2: 特徵本身帶偏空傾向或在對抗 TX 年化 15.18% 的上行漂移),再決定矯正方式。階段一只看分布不看績效。
prereg: prereg-2026-08-25-bearish-tilt.toml
卡在:研究凍結中(解凍條件:每 horizon 累積 60 筆 live 樣本)
判準已凍結
prereg 已寫,等待解凍後執行
high-vol-entry
高波動組(sigma20 上三分位)方向命中率最高 40.24%,但進場勝率最低 45.93%、訊號平均報酬 −0.0000
高波動期的高命中率是機械的——動態震盪帶被撐寬,實際震盪日從 38% 升到 49%,模型跟著多說中性。真正進場的那些日子反而最不準。命中率在這裡是誤導性指標。⚠️ 原始提案「高波動期不進場」已在 prereg 中被否決——那是三組挑最差、差距僅約 2.5 SE、分組方式任意,屬資料窺探。改用波動調整曝險(曝險 ∝ σ_target/σ20,無可調門檻),先驗依據是標籤的震盪帶本來就隨波動放大。關鍵判準:必須贏過「等平均曝險的常數縮放版」,否則就只是縮量不是擇時。
prereg: prereg-2026-08-25-vol-scaled-exposure.toml
卡在:研究凍結中(解凍條件:每 horizon 累積 60 筆 live 樣本)
判準已凍結
prereg 已寫,等待解凍後執行
payoff-asymmetry
獲利因子 0.9685(<1)、賺賠比 1.089、勝率 47.07%、期望值 −1.3bp
賺賠比已經大於 1(贏的時候確實賺比較多),問題出在勝率不足 50%。兩者相乘後期望值仍為負,但差距很小——獲利因子 0.9685 距離 1 只差 3.2%。停損/停利取自模型自己的 q10/q90(不引入可調參數)。因缺日內資料,改採保守下界設計:日 OHLC + 「同日雙觸發判停損先」。判讀刻意不對稱——下界過了就成立(真實只會更好),下界沒過不得判定無效,只能記「保守假設下不成立,待日內資料累積後重測」。🔴 2026-10-05 更正(整體審核 A09):這是「指定成交假設下的保守路徑情境」,不是完整的損益下界——它只處理日 K 內停損停利的先後順序;觸價不成交、限幅鎖死、部分成交、跳空後的流動性與延遲都不在其中,所以「過了就成立、真實只會更好」不成立,過了也只能說「在這組成交假設下成立」。所需賺賠比 1.13 是由勝率 47.07% 反算的必要條件,不是挑的。
prereg: prereg-2026-08-25-payoff-asymmetry.toml
卡在:研究凍結中;且日內資料僅 64 天,判定為保守下界
判準已凍結
prereg 已寫,等待解凍後執行
c-grid-boundary
chosen_c 五折全部是 0.01,即網格 [0.01, 0.1, 1.0] 的最小值(最強正則化)
CV 想要比網格能給的更強的正則化,最佳值在網格外——我們並不知道它在哪。把 chosen_c=0.01 當成「選出來的最佳超參數」是誤導,那是撞到牆。這與「特徵沒有訊號」的其他證據一致。延伸網格到 [0.0001 … 10] 並只看訓練段的內折分數曲線。C 的挑選是巢狀的(在訓練段內用 TimeSeriesSplit 做),不碰測試段,所以這個診斷不消耗驗證折、不需等解凍。嚴格邊界:只授權報告曲線,不得把新 C 套進去看 OOS 績效(那要另一張 prereg)。prereg 內已寫下我的預期(曲線單調、最佳貼邊)以便事後檢驗判斷力。
prereg: prereg-2026-08-25-c-grid-boundary.toml
結果:2026-08-25 執行(reports/c-grid-curve-2026-08-25.md,消耗驗證折 0 次)。結果 2:延伸兩個數量級後最佳仍貼在新下界 0.0001,平均曲線單調遞減,依決策規則 2 不延伸網格、不再往下試。最重要的發現不在原本的預期裡——最佳點 −1.09732 相對 ln(1/3) = −1.098612 只超額 +0.00129 nats,即 117 欄特徵在最佳正則化下幾乎正好等於每天說 1/3 / 1/3 / 1/3;但五折超額全部為正,與平衡準確率 t=7.09 一致。判別能力存在、方向一致、量級接近沒有。
已否決
檢定未過——試了效果不夠
cost-assumption
成本敏感度掃描:方向訊號在 ×0 – ×10 整個範圍都沒贏過買進持有,連成本歸零時都還輸 0.6307 Sharpe
9 項未查證的成本參數不是目前沒有 edge 的原因。 這是否定結果,直接排除一條路。無須改善——此路已排除。成本參數仍該查證,但那是為了 L2+ 的口數與風險預算,不是為了讓 edge 出現。
結果:已於 2026-08-25 完成,結論:成本假設不是瓶頸。不再投入。
假說推翻
成因根本不對,與「效果不夠」是兩件事
stationarity
非平穩特徵(tx_ma20 等)訓練段與測試段值域重疊 0–3%
假說被推翻——移除非平穩特徵後,退化並未解除(本來就沒有退化),且 live 情境下準確率反而從 47.5% 掉到 42.4%。無須改善——假說已推翻。值域漂移與共線性仍是真實缺陷,但造成的傷害不是退化,要另開 prereg 用針對性的判準。
prereg: prereg-2026-08-24-stationarity.toml
結果:2026-08-24 檢定完成,假說推翻,不採用精簡特徵集。
假說推翻
成因根本不對,與「效果不夠」是兩件事

「已否決」與「假說推翻」刻意分開。前者是試了效果不夠,後者是連成因都想錯了——對後續決策的意涵完全不同:前者可能值得換個做法再試,後者該整條線停掉。

執行次數3涵蓋 3 個提案
採用率0%0/3 次通過判準
已花驗證折1 次這些執行各自消耗的加總
預期命中1/2執行前寫下的預期對了幾次

採用率的分母是「執行次數」而不是「提案數」,這是刻意的。那個分母就是多重比較的次數——試十次中一次,跟試一次中一次,是完全不同的證據強度,而只看「採用了什麼」的紀錄會把這件事藏起來。

改善驗證履歷(3 次執行,其中 0 個提案被重測過)append-only:寫下去就不改。判定要更正就再寫一筆指回原本那筆

日期/提案判定結果驗證折
2026-08-25
cost-assumption
假說推翻
成因根本不對,與「效果不夠」是兩件事
假說推翻:9 項未查證的成本參數不是目前沒有 edge 的原因。方向訊號在 ×0 – ×10 整個掃描範圍都沒贏過買進持有,連成本歸零時都還輸 0.6307 的 Sharpe。結論對成本假設不敏感。
sharpe_diff_at_zero_cost=-0.6307 · sweep_range=×0 – ×10 · flips_at=None · unverified_cost_params=9
測試期:同一組 walk-forward OOS 預測,只換成本假設(不重新擬合)
報告:reports/cost-sensitivity-2026-08-25.md
無 prereg——這是在既有 OOS 預測上換成本假設,不重新擬合、不消耗驗證折。判定為 refuted 而非 failed:被推翻的是「成本是瓶頸」這個成因,不是某個改善的效果不夠。
0(不消耗)
2026-08-25
c-grid-boundary
未過
判準未滿足——試了,效果不夠
判準 A 未過:延伸網格兩個數量級後最佳 C 仍貼在新下界 0.0001,平均曲線單調遞減,沒有內部最佳點 → 依決策規則 2 不延伸網格。最重要的發現不在預期裡:最佳點相對 ln(1/3) 只超額 0.00129 nats,即 117 欄特徵在最佳正則化下幾乎正好等於每天說 1/3 / 1/3 / 1/3;但五折超額全部為正,與平衡準確率 t=7.09 一致。
best_c=0.0001 · best_inner_cv_loglik=-1.09732 · ln_one_third=-1.098612 · excess_nats=0.00129
測試期:訓練段內折 TimeSeriesSplit(n_splits=3) —— 未接觸任何測試段
執行前的預期:✅ 命中 結果 2:曲線單調,最佳仍貼在最小值(理由:曝險 0.095、準確率低於基礎率、成本歸零仍輸 0.63 Sharpe)
報告:reports/c-grid-curve-2026-08-25.md
消耗 0 次驗證折(C 的挑選是巢狀的)。誠實記一處與平均曲線不符:逐折最佳是 [0.001, 0.0001×4],4/5 貼邊而非 5/5;但那一段曲線是平的,平段裡的 argmax 是雜訊。
0(不消耗)
2026-08-24
stationarity
假說推翻
成因根本不對,與「效果不夠」是兩件事
假說推翻:移除非平穩特徵後退化並未解除(本來就沒有退化),且精簡特徵集在 live 情境下更差。被移除的水準類特徵在長跨度訓練下顯然仍攜帶資訊,不是純粹的雜訊源。
live_accuracy_baseline_58cols=0.475 · live_accuracy_reduced_45cols=0.424 · flat_class_baseline=0.428 · dominant_share_baseline=0.467
測試期:近 60 個交易日逐日重擬合(比照 live 全歷史訓練)
執行前的預期:❌ 落空 十八輪判定 live 是退化預測器,病因是非平穩特徵
報告:status.md 十九輪
第 9 次動用驗證折。重現 live 是前提——第一版背景測試給出 p_flat≈0.34 與 live 對不上,那個數字已作廢。對不上 live 的模擬不能拿來下結論。
1 次

「未過」與「無法判定」也刻意分開。payoff-asymmetry 使用指定成交假設下的保守路徑情境(日內 1 分 K 在 2026-08-25 提案當時僅 64 天;現有天數見日內頁),此情境未過不代表無效——把「測不出來」記成「無效」,會讓一個可能有用的想法被永久誤殺。

版本 5f92ccf(第 163 次提交,2026-10-14) | 資料建置於 2026-10-14 10:30 UTC | 行情與研究結果供查看;會員可管理觀察清單並要求更新個股分析