TL;DR: 投票引擎是 v3.85.0 起加入的「非參數共識引擎」,把風險面 8 群 + 量化面 5 群 + 元投票 2 群(共 11 群)的判斷拆成數十張獨立的方法票,按時段加權聚合成 verdict。設計鐵則:禁常態 VaR、禁 √t 縮放、禁單方法獨大,所有分歧都直接揭露給使用者(Rule B 跨面向旗示)。
觀念篇
為什麼要投票引擎?
傳統做法:挑一個 VaR / Beta / Sharpe 公式,直接給一個數字當風險評估。
問題:任何單一公式都有假設。常態 VaR 假設報酬常態分布(實際不是);√t 規則假設報酬獨立同分布(實際有自相關);GARCH 假設條件變異數有特定結構。一個公式錯,結論就錯。
新做法:同一個 horizon 用 4 種不同方法算 VaR,4 票合成一個共識。任一方法假設失效,還有 3 票兜底;4 票全錯 → 模型可信度元投票會抓出來。
11 個群組分工
| 面向 | 群組 | 在量什麼 |
|---|---|---|
| 風險 | G1 回撤 | MDD / CDaR / 平均回撤 / 復原日數 |
| G2 VaR 多期矩陣 | 4 方法 × 6 天期 = 24 票/檔(歷史 / 區塊 Bootstrap / FHS / EVT POT) | |
| G3 下行 | Sortino / 下行偏差 / Omega | |
| G4 系統性風險 | Beta_60 / Beta_250 / 相關係數 / R² | |
| G5 報酬風險比 | Sharpe / Calmar / M² | |
| G6 平穩性 | Hurst / ADF / KPSS | |
| G7 尾部依賴 | 大盤左尾 5% / 1% tail β / 不對稱 β | |
| G8 波動 regime | σ_20 z-score / vol-of-vol / clustering | |
| 量化 | Q1 趨勢 | MA 5/20 / 20/60 / 60/200 / Donchian |
| Q2 動能 | RSI / MACD / Stoch K | |
| Q3 波動 forward | EWMA / GARCH σ_{t+1} / 已實現 σ | |
| Q4 季節性 | 同月份 / 同週幾 / 月初效應 | |
| Q6 預期報酬 | FHS Monte Carlo 5d / 20d / 60d μ | |
| 元投票 | G9 風險模型可信度 | Kupiec POF / Christoffersen / Basel(週日跑) |
| Q5 預測模型可信度 | rolling backtest hit-rate(週日跑) |
4 種非參數 VaR
G2 多期矩陣是引擎核心。對每個天期(5/10/20/60/120/220d)用 4 個方法各投一票:
| 方法 | 假設 | 怎麼算 |
|---|---|---|
| M-A 直接歷史 | 0 | overlapping h 天累積報酬取 5% 分位 |
| M-B 區塊 Bootstrap | 2 | 抽連續區塊保留波動聚集,n_sims=5000 |
| M-C FHS | 2 | GARCH(1,1) 過濾 + 標準化殘差重抽 |
| M-D EVT POT | 2 | GPD 擬合尾部超門檻部分,深尾外推 |
假設權重:0 假設 ×1.0、2 假設 ×0.8、3 假設 ×0.6、4+ 假設(常態 / √t) ×0(直接排除)。
期間切片
每群結果按四個時段切:
- 極短期:H1=5d
- 短期:H2=10d, H3=20d
- 中期:H4=60d
- 長期:H5=120d, H6=220d
切完按 horizon 聚合 → 給「參考總結」卡內的「風險面」/「量化面」塊用。
Rule B 跨面向分歧
同一時段同時出現:
- 風險面共識 = high(風險高)
- 量化面共識 = bull(看多)
→ 後端 cross_panel_divergence API 直接旗示。前端在卡頭亮「⚠ 分歧」。
設計理念:這種分歧不該被加權平均抹平,使用者必須知道「訊號矛盾」這件事本身。
操作篇
怎麼在頁面上看到?
開個股 → 總評 → 訊號 → 滑到「參考總結」下面 → 展開 ▶ 投票引擎詳細 — 風險面 × 量化面 11 群組。
每群可點開看:
- overall 整體共識方向 + 信心
- per_horizon 4 期間共識(極短/短/中/長)
- 18 票細項表:方法 × 期間 × 方向 × 值 × 信心
訊號層級
讀法由粗到細:
- 參考總結 4 卡的 verdict 籌碼(看多/偏多/中性/觀望/偏空/看空)
- 卡內「風險面」/「量化面」塊(該期共識,4-5 行核心指標)
- 底部 11 群面板(想知道是哪個方法投了什麼票)
模型可信度(G9 / Q5)
每週日深夜跑 250 天 backtest:
- G9 Kupiec POF:VaR 突破率是否符合名義 α(5%)?
- G9 Christoffersen:突破是否聚簇?(GARCH 漏了波動聚集 → 紅燈)
- G9 Basel Traffic Light:紅 / 黃 / 綠燈
- Q5:ARIMA-MC 預測誤差 hit-rate
紅燈 → 該方法當週票權重降到 40%(自我校正)。
常見問題
Q1:為什麼禁常態 VaR?
常態分布假設尾部太薄。實證:股市報酬有 fat tail(峰度 > 3),常態 VaR 系統性低估極端風險。投票引擎排除是規格鐵則,不是參數設定。
Q2:為什麼禁 √t 規則?
√t 規則(用 1 天 σ × √h 推 h 天 VaR)需要報酬 i.i.d.,實證有自相關(短期動量、長期均值回歸)。每個 horizon 獨立估計 → 不用縮放公式。
Q3:每天會重算嗎?
Daily 跑短窗群(G2 5-20d / G8 σ_20 / Q1-Q3 / Q6),約 30 分鐘/天。 Weekly 跑長窗群(G1 / G3-G7 / Q4)+ 元投票 G9 / Q5,約 5 小時/週,排在週日深夜。
這樣每天的關鍵訊號(短期)是最新的,長期慢數據不必每天浪費 CPU 重算。
Q4:看到「無資料」怎麼辦?
新上市股(< 260 天歷史)會 skip。元投票 G9/Q5 需要 weekly cron 跑完才有資料。