BACKTEST_SPEC.md
Cortex 訊號回測規格書 v3 三層驗證:Signal Quality → Indicator Combination Search → Strategy Validation Last updated: 2026-02-25
0. 資料現實與執行約定
0.1 可用資料(DB 實查 2026-02-25)
| 資料集 | 期間 | 說明 |
|---|---|---|
stock_ohlc |
2021-02-04 ~ 2026-02-24 | 全市場 2,133 支,~1,220 交易日 |
daily_technical_snapshot 早期批次 |
2024-02-02 ~ 2026-02-24 | TW + TWO 一般個股,~493 天 |
daily_technical_snapshot 大批次 |
2025-08-14 ~ 2026-02-24 | 1,738 支,僅 ~126 天,Route A 不使用 |
daily_chip_snapshot |
2024-08-27 ~ 2026-02-25 | 1,623 支(可用股票池全覆蓋),~18 個月 |
daily_financial_snapshot |
2025-09-18 ~ 2026-02-24 | 僅 ~5 個月,Strategy E 不做 |
0.2 股票池定義
篩選條件(逐層過濾):
| 步驟 | 條件 | 剩餘數量 |
|---|---|---|
| 起始 | daily_technical_snapshot 中 rows >= 400 且 first_date < 2024-06-01 |
2,007 |
| 排除 ETF / 特殊 | ticker 格式為 [1-9]\d{3}\.(TW\|TWO) |
1,886 |
| 流動性 + 品質 | data_quality == "complete" AND avg_volume_20 >= 50,000,至少 200 天符合 |
1,623 |
最終股票池:1,623 支台股上市 + 櫃買個股(TW 958 支 + TWO 665 支)
每月活躍股票數穩定在 1,517~1,602 支之間(2024-02 ~ 2026-02),全期間可用 snapshot 合計約 739,457 筆。
stocks 表有 industry 和 sector 欄位但全部為空。Cluster 分析改用 ticker 規則推斷(見 2.5)。
0.3 執行約定
| 項目 | 規則 |
|---|---|
| 市場 | 台股上市 + 櫃買個股(1,623 支,排除 ETF) |
| 訊號產生時點 | 每日收盤後,基於當日 snapshot |
| 執行價格 | entry = T+1 open(from stock_ohlc);exit = 觸發日 T+1 open |
| 方向 | Long only |
| 資料品質過濾 | data_quality == "complete" |
| 流動性過濾 | avg_volume_20 >= 50,000 |
| Look-ahead bias | 禁止。所有指標取值為當日收盤時的值,執行在次日開盤 |
0.4 回測區間
全區間: 2024-02-02 ~ 2026-02-24(~493 個交易日,~2 年)
不可用區間:COVID crash (2020-01~03)、2021 多頭、2022 空頭 — 無 snapshot 資料,留給 Route B。
0.5 IS / OOS 切分
| 期間 | 範圍 | 交易日 | 用途 |
|---|---|---|---|
| In-Sample | 2024-02-02 ~ 2025-06-30 | ~340 天(~17 個月) | 組合搜尋 + 參數調整 |
| Out-of-Sample | 2025-07-01 ~ 2026-02-24 | ~160 天(~8 個月) | 驗證 |
Walk-Forward:8 個月 IS + 2 個月 OOS,每次滑動 2 個月。僅對有 grid search 的策略做。
注意:2 年資料做 IS/OOS 偏緊。若 OOS 結果不佳,不急於下結論 — 等 Route B 擴大後再確認。
0.6 0050.TW 走勢概覽(2024-02 ~ 2026-02,供市場環境分段)
| 期間 | 0050 走勢 | 幅度 | 環境標籤 |
|---|---|---|---|
| 2024-02 ~ 2024-06 | 32.3 → 44.8 | +38.7% | bull_2024h1 |
| 2024-07 ~ 2024-09 | 44.8 → 44.4 | -0.9% | consolidation_2024q3 |
| 2024-10 ~ 2025-01 | 44.3 → 49.3 | +11.3% | bull_2024q4 |
| 2025-02 ~ 2025-04 | 47.2 → 41.3 | -12.5% | correction_2025q1 |
| 2025-05 ~ 2025-10 | 42.5 → 63.8 | +50.1% | bull_2025h2 |
| 2025-11 ~ 2026-02 | 63.3 → 81.1 | +28.1% | bull_2025q4_2026 |
自動劃分方式:計算 0050 的 60 日滾動報酬率。> +10% → bull,< -10% → bear,其間 → consolidation。最終以實際計算結果為準,上表為參考。
1. Layer 1 — Signal Quality Validation
純統計分析,不涉及交易模擬。 樣本量:1,623 支 × ~493 天 ≈ ~739K usable snapshots。
1.1 Forward Return 計算
forward_return_N = (close[t + N] - close[t]) / close[t]
| 參數 | 值 |
|---|---|
| Horizons | 1, 3, 5, 10, 20 trading days |
| Deadzone | ±0.2%( |
| 價格來源 | stock_ohlc.close(與 snapshot 同日) |
| 儲存位置 | forward_return_label 表(migration 096,issue #569);由 raw_panel_loader LEFT JOIN 回 panel,欄位名維持 forward_return_{h} |
Snapshot 最後 N 天的 forward return 為 NaN,自然排除。
1.2 Bias 準確率
按 bias ∈ {bullish, bearish, neutral} × horizon 分組:
| 輸出指標 | 說明 |
|---|---|
hit_rate |
bullish: return > +deadzone 的比例;bearish: return < -deadzone 的比例 |
avg_return |
平均 forward return |
median_return |
中位數 |
std_return |
標準差 |
sample_count |
樣本數 |
t_statistic |
單樣本 t-test (H0: mean = 0) |
p_value |
雙尾 p-value |
顯著性門檻:p_value < 0.05 且 sample_count >= 50。
1.3 Confidence 分層分析
5 個區間:
| 區間 | 標籤 |
|---|---|
| [0.00, 0.30) | very_bearish |
| [0.30, 0.40) | bearish |
| [0.40, 0.60) | neutral |
| [0.60, 0.70) | bullish |
| [0.70, 1.00] | strong_bullish |
每區間 × horizon 統計 avg_return、median_return、hit_rate、std_return、sample_count。
核心驗證:Spearman rank correlation(confidence vs forward_return),每 horizon 一個 rho。 - rho > 0.05 且 p < 0.05 → confidence 有預測力 - rho ≤ 0 → confidence 設計有問題
1.4 Signal Channel 績效
按 7 個 channel 分組:
| 輸出指標 | 說明 |
|---|---|
trigger_count |
總觸發次數 |
monthly_avg |
每月平均 |
avg_forward_return_N |
各 horizon 的平均 forward return |
hit_rate_N |
各 horizon 的方向正確率 |
channel_sharpe |
假設每次觸發持有到 horizon,用日報酬算 Sharpe |
exclusivity_check |
同一天同一股票是否只落入一個 channel(應 100%) |
Channel 對比矩陣(行 = channel,列 = 1d_ret / 3d_ret / 5d_ret / 10d_ret / 20d_ret / hit_5d / count)。
1.5 ReasonCode / WarningCode Information Coefficient
對每個 ReasonCode 和 WarningCode 計算:
| 輸出指標 | 說明 |
|---|---|
presence_rate |
佔所有 snapshot 的 % |
avg_return_when_present |
出現時的平均 5d forward return |
avg_return_when_absent |
不出現時的平均 5d forward return |
return_diff |
present - absent |
ic_5d |
與 5d forward return 的 Pearson correlation |
t_stat |
return_diff 的 t-statistic |
排序:按 abs(return_diff) 降序。過濾 presence_rate < 1%。
輸出分類: - Top 10 正向預測力 ReasonCode - Top 10 負向預測力 WarningCode - 無效 codes(不顯著或 presence_rate < 1%)
1.6 單一類別預測力基線
對 14 個評分類別(A~N),獨立計算預測力:
solo_score = 0.5 + 該類別的所有分數調整(其他 13 類歸零)
solo_score = clamp(solo_score, 0, 1)
統計:
- solo_rho:solo_score 與 5d forward_return 的 Spearman rho
- solo_hit_rate:solo_score > 0.6 時,5d return > 0 的比例
- solo_signal_count:solo_score > 0.6 的 snapshot 數
輸出 l1_solo_indicator_power.csv,按 solo_rho 降序。
此表決定 Layer 2 Forward Selection 的起始順序。
1.7 Go/No-Go Gate
| 條件 | 門檻 | 說明 |
|---|---|---|
| Bullish hit_rate (5d) | > 52% | 高於隨機 |
| Confidence Spearman rho (5d) | > 0.03 且 p < 0.05 | 最低預測力門檻 |
| 至少 1 個 channel avg 5d return | > 0 且 p < 0.05 | 至少一個 channel 有效 |
| 至少 3 個類別 solo_rho | > 0.02 | 至少 3 個指標有最低預測力 |
全部未通過 → 停止 Layer 2/3,先檢查 scoring 邏輯或等 Route B 擴大資料量。
1.8 Layer 1 產出
| 檔案 | 內容 |
|---|---|
l1_bias_accuracy.csv |
bias × horizon 準確率矩陣 |
l1_confidence_bands.csv |
confidence 區間 × horizon 統計 |
l1_confidence_correlation.json |
Spearman rho per horizon |
l1_channel_performance.csv |
7 channel × horizon 績效 |
l1_reason_ic.csv |
ReasonCode IC 排行 |
l1_warning_ic.csv |
WarningCode IC 排行 |
l1_solo_indicator_power.csv |
14 類別單獨預測力 |
2. Layer 2 — Indicator Combination Search
目的:找出 14 類評分中的最佳子集和權重配置。 使用 IS 期間(2024-02 ~ 2025-06)資料。
2.0 回測引擎規格(組合搜尋用)
| 參數 | 值 |
|---|---|
| 初始資金 | 5,000,000 TWD |
| 買入手續費 | 0.1425% |
| 賣出手續費 | 0.1425% |
| 交易稅(賣出) | 0.30% |
| 來回總成本 | 0.585% |
| 單筆最大部位 | 總資金 10% |
| 同時最多持有 | 10 檔 |
| Cooldown | 5 個交易日 |
| 台股整張 | floor(shares / 1000) * 1000 |
Position sizing:
position_value = min(total_equity * 0.10, available_cash)
shares = floor(position_value / entry_price)
shares = floor(shares / 1000) * 1000 # 整張
if shares == 0: skip
Entry / Exit(組合搜尋固定規則,不做 grid search):
Entry: bias == "bullish" AND confidence >= 0.70
Exit: bias == "bearish" OR confidence < 0.45 OR hold_days >= 20
2.1 Composite Score
用於比較不同組合的綜合品質指標:
composite = 0.4 * norm(sharpe)
+ 0.3 * norm(hit_rate)
+ 0.2 * norm(profit_factor)
+ 0.1 * norm(trade_count_penalty)
norm(x) = min-max normalize 到 [0, 1] across all candidate combos in the same search。
trade_count_penalty:
- trade_count ∈ [30, 2000] → penalty = 0(正常)
- trade_count < 30 → penalty = (30 - count) / 30(樣本不足扣分)
- trade_count > 2000 → penalty = (count - 2000) / count(過度交易扣分)
2.2 Phase A: Elimination(淘汰)
跑 14 個 ablation(與 BACKTEST_CONTEXT 3.1 的 14 類一一對應):
| ABL ID | 歸零類別 | 歸零的分數調整 |
|---|---|---|
| ABL-A | Trend Structure | ma_alignment ±0.20 |
| ABL-B | Trend Strength | adx ≥25 +0.10, adx_accel +0.04 |
| ABL-C | Momentum | vortex ±0.08/±0.04/+0.04, macd_hist ±0.08, expanding +0.03 |
| ABL-D | Volume | volume_expansion ±0.08 |
| ABL-E | Pullback + Breakout Highs | breakout_recent +0.05, ATH +0.10, 52W +0.08 |
| ABL-F | CTI | cti ±0.10 |
| ABL-G | Choppiness | chop_trending +0.05, choppy 拉回 30% |
| ABL-H | WaveTrend | WT cross ±0.10/±0.06, extreme -0.05/-0.03, divergence ±0.06/+0.04 |
| ABL-I | Aroon | aroon uptrend +0.04, downtrend -0.04 |
| ABL-J | TTM Squeeze | squeeze_off +0.08 |
| ABL-K | DMI Derived | di_spread +0.04, adx_sustained +0.03 |
| ABL-L | Supertrend | bullish +0.03, flip ±0.06 |
| ABL-M | Donchian | breakout_20d ±0.05, breakout_55d ±0.08 |
| ABL-N | RS vs Market | rs_outperform +0.04, underperform -0.04 |
額外兩個 warning-specific ablation:
| ABL ID | 歸零內容 |
|---|---|
| ABL-W1 | RSI overbought -0.05, RSI divergence -0.08/+0.06 |
| ABL-W2 | WT extreme -0.05/-0.03, WT divergence -0.06/+0.04 |
每個 ablation: 1. 重算 bias/confidence(scoring_fork:目標類別 score 調整 = 0) 2. 跑快速回測(2.0 固定規則,IS only) 3. 計算 composite_score
分類規則:
| Sharpe delta vs Baseline | 分類 |
|---|---|
| 下降 > 10% | Core(核心驅動力) |
| 下降 1~10% | Useful(有用的補充) |
| 不變或上升 | Noise(噪音,淘汰候選) |
2.3 Phase B: Forward Selection(逐步加入)
從 Layer 1.6 的 solo_rho 最高的 Core 類別開始:
1. enabled_set = { solo_rho 最高的 Core 類別 }
2. 跑回測 → baseline composite_score
3. for each remaining candidate (Core + Useful, sorted by solo_rho desc):
temp_set = enabled_set ∪ { candidate }
跑回測 → new composite_score
delta = new - baseline
record (candidate, delta)
4. 選 delta 最大者加入 enabled_set
5. 更新 baseline = new composite_score
6. 重複 3~5,直到最大 delta < 1% 或所有候選已嘗試
Noise 類別不參與 Forward Selection(已淘汰)。
對 4 個目標分別做 Forward Selection:
| 目標 | 資料範圍 | 說明 |
|---|---|---|
| Universal | 全部 IS snapshots | 全市場通用組合 |
| Momentum | IS 中 channel == momentum_bullish 的 snapshots | momentum 專用組合 |
| Reversal | IS 中 channel == reversal_bullish 的 snapshots | reversal 專用組合 |
| Squeeze | IS 中 channel == squeeze_bullish 的 snapshots | squeeze 專用組合 |
Channel-specific 的回測只看該 channel 觸發時的交易。若某 channel 在 IS 期間 trade_count < 30,跳過該 channel 的專用搜尋,沿用 Universal 結果。
2.4 Phase C: Weight Tuning(權重微調)
對 Phase B 最佳子集中的各 Core 類別,調整其原始 score 調整值的乘數:
Weight grid: [0.5, 0.75, 1.0, 1.25, 1.5]
搜尋空間 = 5^(Core 數量)。
| Core 數 | 組合數 | 搜尋方式 |
|---|---|---|
| ≤ 5 | ≤ 3,125 | Grid search(全跑) |
| 6~7 | ≤ 78,125 | Random search 2,000 組 |
| ≥ 8 | 不太可能 | Random search 2,000 組 |
每組跑快速回測(IS only),取 composite_score 最高者。
2.5 Cluster 分析
stocks 表的 industry / sector 全部為空。改用 ticker 規則推斷:
| Cluster | 規則 | 預估數量 |
|---|---|---|
| 半導體 | ticker ∈ | ~40-60 |
| 金融 | ticker ∈ {28xx, 58xx} 或已知金控清單 | ~50-70 |
| 電子 | ticker ∈ | ~400 |
| 傳產 | 其餘 | ~500 |
| 櫃買 | ticker LIKE '%.TWO'(或獨立標記,與上述產業分群交叉) | 665 |
或者更簡單的做法:直接用 TWSE 的產業代號前 2 位 (ticker 前 2 碼) 分群,報告中標註群組組成。
每個 Cluster 用 Universal combo 跑 IS 回測: - 若某 Cluster 的 Sharpe < Universal Sharpe * 0.5 → 對該 Cluster 單獨跑 Forward Selection - 若所有 Cluster 表現一致 → 不做 Cluster-specific 組合(節省計算量)
2.6 Per-Stock 觀察
對 1,623 支個股,用 Universal combo 統計:
| 指標 | 說明 |
|---|---|
hit_rate_5d |
該股票 bullish signal 的 5d 命中率 |
avg_forward_return_5d |
平均 5d forward return |
trade_count |
訊號觸發次數 |
標記規則:
- hit_rate < 40% 且 trade_count >= 10 → ineffective(訊號對該股票無效)
- hit_rate > 65% → highly_effective
- trade_count < 5 → insufficient_data
2.7 Layer 2 產出
| 檔案 | 內容 |
|---|---|
ablation_summary.csv |
14+2 個 ablation 的 Sharpe delta 和分類 |
forward_selection/universal_steps.csv |
Universal 逐步加入記錄 |
forward_selection/universal_best_combo.json |
最佳組合(啟用的類別列表) |
forward_selection/momentum_bullish_steps.csv |
Momentum channel 逐步加入 |
forward_selection/reversal_bullish_steps.csv |
Reversal channel 逐步加入 |
forward_selection/squeeze_bullish_steps.csv |
Squeeze channel 逐步加入 |
weight_tuning/weight_grid_results.csv |
權重搜尋結果 |
weight_tuning/best_weights.json |
最佳權重配置 |
cluster_analysis/universal_by_cluster.csv |
各 Cluster 的 IS 績效 |
per_stock_quality.csv |
1,623 支個股品質表 |
3. Layer 3 — Strategy Validation
用 Layer 2 找到的最佳組合,跑完整交易模擬(IS + OOS)。
3.1 策略清單
| 策略 | 說明 | Scoring |
|---|---|---|
| Baseline | 現有 scoring(14 類全開,原始權重) | 原始 compute_bias_confidence_reasons_warnings() |
| Universal-Optimized | Layer 2 全市場最佳組合 + 最佳權重 | Phase B+C 結果 |
| Channel-Specific | 進入 momentum channel 用 momentum combo,reversal 用 reversal combo,etc. | 各 channel 獨立 scoring |
| Tech+Chip | Universal-Optimized + chip_bias bullish 確認 | Technical scoring + daily_chip_snapshot.bias |
Strategy E(三維度投票):不做,financial snapshot 僅 5 個月。
Tech+Chip 資料深度:chip snapshot 從 2024-08-27 起(1,623 支全覆蓋),IS 期間 ~11 個月(2024-08 ~ 2025-06),OOS 全覆蓋。報告中標注資料較淺。
3.2 回測引擎規格
| 參數 | 值 |
|---|---|
| 初始資金 | 5,000,000 TWD |
| 買入手續費 | 0.1425% |
| 賣出手續費 | 0.1425% |
| 交易稅(賣出) | 0.30% |
| 來回總成本 | 0.585% |
| 單筆最大部位 | 總資金 10% |
| 同時最多持有 | 10 檔 |
| Cooldown | 5 個交易日 |
| 台股整張 | floor(shares / 1000) * 1000 |
| 無風險利率 | 1.5%(台灣定存) |
3.3 Entry / Exit
所有策略共用框架:
Entry:
channel in ("momentum_bullish", "reversal_bullish", "squeeze_bullish")
AND confidence >= ENTRY_THRESHOLD
Exit(任一觸發):
| 編號 | 條件 | 說明 |
|---|---|---|
| X1 | channel 變為任何 bearish 類 |
訊號翻空 |
| X2 | confidence < EXIT_THRESHOLD |
信心不足 |
| X3 | 持倉超過 MAX_HOLD_DAYS 天 |
時間停損 |
| X4 | close < invalidation_level |
結構性停損(from risk block) |
Strategy Tech+Chip 額外 exit:
| X5 | chip_bias == "bearish" | 籌碼面翻空 |
Grid Search(IS only):
| 參數 | 搜尋範圍 | 組合 |
|---|---|---|
| ENTRY_THRESHOLD | [0.65, 0.70, 0.75] | 3 |
| EXIT_THRESHOLD | [0.40, 0.45, 0.50] | 3 |
| MAX_HOLD_DAYS | [10, 20, 40] | 3 |
| 27 組 |
4 個策略 × 27 = 108 組。OOS 使用各策略的 IS 最佳參數。
3.4 績效指標
報酬類:
| 指標 | 公式 |
|---|---|
| 總報酬率 | (final_equity - initial) / initial |
| CAGR | (final / initial) ^ (252 / trading_days) - 1 |
| 月度報酬分佈 | 均值、中位數、最差月 |
| Alpha vs 0050 | strategy_CAGR - benchmark_CAGR |
風險類:
| 指標 | 公式 |
|---|---|
| Max Drawdown | max((peak - trough) / peak) |
| Max DD Duration | peak 到完全恢復的最長交易日數 |
| 年化波動率 | std(daily_returns) * sqrt(252) |
| Sharpe Ratio | (annualized_return - 0.015) / annualized_vol |
| Sortino Ratio | (annualized_return - 0.015) / downside_vol |
| Calmar Ratio | CAGR / abs(Max_Drawdown) |
交易品質類:
| 指標 | 公式 |
|---|---|
| Win Rate | winning_trades / total_trades |
| Profit Factor | sum(wins) / abs(sum(losses)) |
| Avg Hold Days | mean(exit_date - entry_date) |
| Avg Win | 獲利交易平均報酬 % |
| Avg Loss | 虧損交易平均報酬 % |
| Max Consecutive Wins | 最長連勝 |
| Max Consecutive Losses | 最長連虧 |
| Signal Frequency | 每月平均進場次數 |
| Expectancy | win_rate * avg_win - (1 - win_rate) * abs(avg_loss) |
3.5 交易明細欄位
trade_id : int
strategy : str # "baseline" | "universal_optimized" | "channel_specific" | "tech_chip"
ticker : str
entry_date : date
entry_price : float # T+1 open
exit_date : date
exit_price : float # T+1 open
exit_reason : str # "channel_bearish" | "confidence_drop" | "time_stop" |
# "invalidation_stop" | "chip_flip"
shares : int
position_value : float
pnl_gross : float
cost : float # 手續費 + 交易稅
pnl_net : float
return_pct : float
hold_days : int
entry_confidence : float
entry_channel : str
max_favorable_excursion_pct : float
max_adverse_excursion_pct : float
3.6 每日權益曲線
date : date
equity : float
cash : float
positions_value : float
daily_return : float
drawdown_pct : float
open_positions : int
3.7 Benchmark
| Benchmark | 方法 |
|---|---|
| 0050.TW Buy-and-Hold | 2024-02 以 open 買入,持有至 2026-02 close |
| 等權重市場 | 1,623 支流動性合格個股等權買入持有 |
| Random Baseline | 1,000 次 Monte Carlo |
Random Baseline 方法: 1. 每個交易日以 50% 機率決定是否持有一支隨機個股 2. 持有天數 ~ Uniform[3, 20] 3. 遵守 position sizing、最多 10 檔、cooldown 等規則 4. 重複 1,000 次,取 Sharpe 分佈
3.8 市場環境子區間分析
使用 0.5 的走勢定義(見 0.6):
bull_2024h1 : 2024-02 ~ 2024-06
consolidation_q3 : 2024-07 ~ 2024-09
bull_2024q4 : 2024-10 ~ 2025-01
correction_2025q1 : 2025-02 ~ 2025-04
bull_2025h2 : 2025-05 ~ 2025-10
bull_2025q4_2026 : 2025-11 ~ 2026-02
每策略 × 每子區間計算:Win Rate、Avg Return、Max Drawdown、交易次數。
關鍵問題: - Baseline vs Universal-Optimized 在 correction_2025q1 的表現差異? - Channel-Specific 是否在 consolidation 時自動切換到 squeeze combo? - Tech+Chip 在 bull 期間是否比純技術面更穩定?
3.9 成功標準
| 條件 | 門檻 | 說明 |
|---|---|---|
| Universal-Optimized OOS Sharpe | > Baseline OOS Sharpe | 組合搜尋確實有提升 |
| Universal-Optimized OOS Sharpe | > 0.5 | |
| OOS Win Rate | > 45% | |
| OOS Max Drawdown | < 25% | |
| vs Random Baseline | Sharpe > 97th percentile | |
| 組合搜尋提升 | IS composite_score 提升 > 5% vs Baseline | |
| OOS vs IS 衰減 | Sharpe 衰減 < 40% | 2 年資料更易 overfit,放寬 |
Agent Baseline = Universal-Optimized 的 OOS 績效。
未來 Agent 附加價值需體現在: - OOS Sharpe 提升 >= 15% - OOS Max Drawdown 降低 >= 10% - 在 correction 子區間的 Win Rate 提升 >= 5pp
4. 報告
4.1 目錄結構
backtest_results/
├── data_summary/
│ ├── stock_universe.csv # 1,623 支最終股票池(ticker, name, market, usable_snapshots)
│ ├── daily_active_counts.csv # 每日有效股票數時序
│ └── data_coverage.json # 資料覆蓋範圍摘要
│
├── layer1/
│ ├── l1_bias_accuracy.csv
│ ├── l1_confidence_bands.csv
│ ├── l1_confidence_correlation.json
│ ├── l1_channel_performance.csv
│ ├── l1_reason_ic.csv
│ ├── l1_warning_ic.csv
│ └── l1_solo_indicator_power.csv
│
├── layer2_combo_search/
│ ├── ablation_summary.csv # 14+2 ablation 結果 + Core/Useful/Noise 分類
│ ├── forward_selection/
│ │ ├── universal_steps.csv
│ │ ├── universal_best_combo.json
│ │ ├── momentum_bullish_steps.csv
│ │ ├── reversal_bullish_steps.csv
│ │ └── squeeze_bullish_steps.csv
│ ├── weight_tuning/
│ │ ├── weight_grid_results.csv
│ │ └── best_weights.json
│ ├── cluster_analysis/
│ │ └── universal_by_cluster.csv
│ └── per_stock_quality.csv # 1,623 支個股品質表
│
├── layer3_validation/
│ ├── summary.json # 全策略彙總(IS + OOS)
│ ├── baseline/
│ │ ├── results.json
│ │ ├── trades.csv
│ │ └── equity_curve.csv
│ ├── universal_optimized/
│ │ ├── results.json
│ │ ├── trades.csv
│ │ ├── equity_curve.csv
│ │ ├── grid_search.csv
│ │ └── walk_forward.csv
│ ├── channel_specific/
│ │ ├── results.json
│ │ ├── trades.csv
│ │ └── equity_curve.csv
│ ├── tech_chip/
│ │ ├── results.json # 標注 chip 資料深度
│ │ ├── trades.csv
│ │ └── equity_curve.csv
│ ├── benchmarks/
│ │ ├── buy_hold_0050.csv
│ │ ├── equal_weight_market.csv
│ │ └── random_baseline.csv
│ └── analysis/
│ ├── by_market_regime.csv
│ └── param_sensitivity.csv
│
├── route_b_todo.md
└── metadata.json
4.2 metadata.json
{
"spec_version": "3.0",
"run_timestamp": "ISO 8601",
"data_source": {
"snapshot_table": "daily_technical_snapshot",
"ohlc_table": "stock_ohlc",
"chip_table": "daily_chip_snapshot"
},
"stock_universe": {
"total_stocks": 1623,
"tw_stocks": 958,
"two_stocks": 665,
"filters_applied": [
"snapshot rows >= 400",
"first_date < 2024-06-01",
"ticker format [1-9]\\d{3}\\.(TW|TWO)",
"data_quality == complete AND avg_volume_20 >= 50000, at least 200 days"
],
"monthly_active_range": "1517 ~ 1602"
},
"period": {
"full": "2024-02-02 ~ 2026-02-24",
"in_sample": "2024-02-02 ~ 2025-06-30",
"out_of_sample": "2025-07-01 ~ 2026-02-24",
"trading_days_approx": 493
},
"total_usable_snapshots": 739457,
"strategies_tested": ["baseline", "universal_optimized", "channel_specific", "tech_chip"],
"grid_search_combos_per_strategy": 27,
"ablation_tests": 16,
"random_baseline_iterations": 1000
}
4.3 圖表清單
Layer 1
| 編號 | 圖表 | 內容 |
|---|---|---|
| L1-1 | Bias 準確率長條圖 | bullish/bearish/neutral × 5 horizons 的 hit_rate |
| L1-2 | Confidence vs 5d forward return 散點圖 | x=confidence, y=5d return, 加 Spearman rho 和回歸線 |
| L1-3 | Confidence 分層 Boxplot | 5 區間的 5d forward return 分佈 |
| L1-4 | Channel 績效 Bar Chart | 7 channel 的 avg 5d return + hit_rate 雙軸 |
| L1-5 | ReasonCode IC 排行榜 | 橫向 bar chart,按 return_diff 排序 |
| L1-6 | WarningCode IC 排行榜 | 同上 |
| L1-7 | 單一類別預測力排行榜 | 14 類的 solo_rho bar chart |
Layer 2
| 編號 | 圖表 | 內容 |
|---|---|---|
| L2-1 | Ablation Waterfall Chart | 14 類移除後的 Sharpe delta,按影響大小排序 |
| L2-2 | Forward Selection 過程圖 | 每步加入一個類別,composite_score 折線 |
| L2-3 | Channel 最佳組合比較表 | Universal / Momentum / Reversal / Squeeze 的啟用類別 Venn |
| L2-4 | Weight Tuning Heatmap | Core 類別 weight 組合 vs composite_score |
| L2-5 | Per-Stock Quality 散佈圖 | x=trade_count, y=hit_rate, color=cluster |
Layer 3
| 編號 | 圖表 | 內容 |
|---|---|---|
| L3-1 | 權益曲線對比 | Baseline vs Optimized vs 0050 B&H(IS+OOS 全期間) |
| L3-2 | 回撤曲線 | 各策略 drawdown % over time |
| L3-3 | 月報酬 Heatmap | 行=年-月, 列=策略, 紅綠色階 |
| L3-4 | IS vs OOS 績效對比 | 各策略 IS/OOS Sharpe/CAGR 並排 bar chart |
| L3-5 | Grid Search Heatmap | ENTRY × EXIT × MAX_DAYS 的 Sharpe 矩陣 |
| L3-6 | Random Baseline Sharpe 分佈 | 500 次直方圖 + 各策略垂直標記 |
| L3-7 | 訊號時序圖 | 選 5 支代表股,K 線 + entry/exit 標記 + confidence 曲線 |
5. Route B 待辦事項
Route A 完成後,在 route_b_todo.md 中記錄以下工作項目:
5.1 資料擴充
- 從 OHLCV 重算全市場指標:將
daily_analysis_snapshot.py的計算邏輯抽離成可獨立執行的 scoring 函數,讓回測引擎能直接從stock_ohlc計算 bias/confidence,不依賴daily_technical_snapshot表 - 回測區間擴大至 2021-02 ~ 2026-02(~5 年),覆蓋更多市場環境
- 股票池進一步擴大:降低 snapshot rows 門檻或納入 2025-08 後大批次新增的 1,738 支短歷史股票
5.2 市場環境補充
- 補做 2021 多頭、2022 空頭、2023 盤整復甦的環境分析 — Route A 最大缺陷
- 重新定義市場環境子區間(含 2021~2023 的完整 bull/bear/consolidation 週期)
5.3 驗證
- 在更大樣本上驗證 Route A 找到的最佳組合
- Walk-Forward validation 用更長期間(2 年 IS + 6 個月 OOS,多 fold 滾動)
- 若 Route A 組合在 5 年資料上失效,重新跑 Layer 2 組合搜尋
5.4 擴展
- 美股支援:為 7 支美股補跑 snapshot 計算
- 多維度整合:financial snapshot 累積到 >= 1 年時,啟用 Strategy E
- 做空策略:在 Route B 的 bear 市場區間驗證 bearish signal 的做空價值