尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Taiwan Stock Backtest Dashboard
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗🛍️ ETF 儀表板 — 完整版
此 repo 為開源核心。完整版 ETF 儀表板 ($199) on Gumroad — 自動財報分析、評分系統、歷史回測與每日更新。
大飆股 DNA 策略的量化實作與歷史回測,涵蓋 2004–2026 年,支援全市場逐日掃描與 GitHub Pages 儀表板。
🌐 儀表板:slashmantools.us/twse-backtests
twse-backtests/
│
├── core/ # 策略核心(指標、策略、回測、掃描)
│ ├── indicators.py # 技術指標計算庫
│ ├── strategy.py # 買賣訊號邏輯(9步操作法)
│ ├── data_loader.py # 資料載入與還原權值
│ ├── backtest.py # 單股/全市場歷史回測報表
│ ├── main.py # 每日全市場掃描器 + HTML/CSV 報表
│ └── bulk_charts.py # 批量輸出訊號股 K線圖 JSON
│
├── crawler/ # 資料爬蟲與調整器
│ ├── twse_crawler.py # TWSE 每日 OHLCV 爬蟲(防封 IP)
│ ├── adjuster.py # 還原權值調整器(backward adjustment)
│ ├── run_backtest.py # 全市場年度資金模擬回測
│ ├── build_dividend_file.py # 從除權息日資料估算股利
│ ├── twse_validator.py # 用 yfinance 驗證還原價格 MAPE < 0.5%
│ ├── run_yearly.py # 按年份批量執行爬蟲
│ ├── check_year_progress.py # 檢查各年爬蟲完成進度
│ └── partition_by_year.py # 將全量 parquet 依年份切割
│
├── tests/ # 單元測試
│ ├── test_indicators.py # 指標計算正確性驗證
│ ├── test_data_loader.py # OHLCV 資料約束測試
│ └── test_strategy.py # 買賣訊號邏輯測試
│
├── docs/ # GitHub Pages 網站
│ ├── index.html # 回測儀表板(無需框架,純 HTML/JS)
│ └── data/
│ ├── summary.json # 各年度彙總(報酬率、勝率、交易次數)
│ └── YYYY_trades.json # 每年逐筆交易明細 + 資產曲線
│
└── .gitignore
core/indicators.py)| 指標 | 函數 | 說明 |
|---|---|---|
| MACD | macd(close, fast, slow, signal) | 標準 MACD;支援長週期(如 200/209/210) |
| MACD 四箭頭 | macd_4arrows(close, fast, slow, signal) | 箭頭1=DIF>0,箭頭2=DIF上升,箭頭3=訊號線上升,箭頭4=柱狀圖上升;arrows_count 為 0–4 |
| DMI / ADX | dmi(high, low, close, period) | 方向動量指標;支援 ADX300(超長週期確認主趨勢);輸出 +DI、−DI、ADX、ADXR |
| 威廉指標 WMS%R | wr(high, low, close, period) | 值域 −100 ~ 0;< −80 超賣,> −20 超買 |
| RSI | rsi(close, period) | 標準相對強弱指標;策略使用 RSI60(日)、RSI4(月)等多週期 |
| VR 成交量變異率 | vr(close, volume, period) | (上漲日成交量 + 0.5×平盤) / (下跌日成交量 + 0.5×平盤) × 100;中值≈100,>150 量能偏多 |
N2 = (前2個月最高點 + 前2個月最低點) / 2
備戰區 = N2 − 100
基於日 K 線計算累積攻擊/回調波段,是策略買賣時機的核心輔助指標:
core/strategy.py)實作「九步操作策略法」,分為 8 個獨立訊號模組:
輸入:大盤日 K + MACD(200/209/210)
輸出:BULL / BEAR / ALERT / CRASH
| 條件 | 加分 |
|---|---|
| MACD 四箭頭全上 | +30 |
| DIF > 0 | +20 |
| 收盤 > N2 | +25 |
| 月 DMI +DI1 > 50 | +15 |
| 連續大跌 3 根 | 強制 CRASH |
| 條件 | 說明 |
|---|---|
| B1 MACD 四箭頭 ≥ 3 | 日線 MACD(200/209/210) 至少 3 箭頭向上 |
| B2 ADX > 20 | 日 DMI300 趨勢強度 > 20(主趨勢確認) |
| B3 威廉 < −20 | 日 WMS%R(50) < −20(未超買) |
| B4 RSI60 > 57 | 日 RSI60 > 57(中長期動能偏強) |
| B5 週 VR ≈ 150 | 週 VR 在 100–200(量能健康) |
| B6 月 VR ≈ 150 | 月 VR 在 100–200(月線量能確認) |
| B7 月 +DI1 > 50 | 月 DMI +DI1 > 50(月線方向向上) |
| B8 月 RSI4 > 77 | 月 RSI4 > 77(月線動能強勁) |
| 條件 | 說明 |
|---|---|
| S1 月威廉 < −5 | 月 WMS%R < −5(月線超買) |
| S2a 月 RSI4 初次跌破 77 | 賣出 50% |
| S2b 月 RSI4 站回後再跌破 77 | 賣出剩餘 50% |
| S3 月 6K/9K | 月下跌型 9K 達標 |
| S4 類股輪動 | 同類股出現更強訊號 |
core/data_loader.py)D:/TWSE-Data/Raw/YYYY/_YYYY_daily.parquet
↓ 還原權值(Backward Adjustment)
D:/TWSE-Data/Adjusted/_temp/YYYY.parquet
↓ TWSEStockLoader.load_daily(ticker)
pandas.DataFrame [Date, Adj_Open, Adj_High, Adj_Low, Adj_Close, Adj_Volume, CumFactor]
還原公式(Backward Adjustment):
從最新交易日往前,每遇到除權息日:
CumFactor[t] *= (Close_ExDate / Close_PrevDay)
Adj_Price[t] = Raw_Price[t] × CumFactor[t]
Adj_Volume[t] = Raw_Volume[t] / CumFactor[t] ← 配股後股數增加,歷史量需放大
crawler/twse_crawler.py)_progress_YYYY.json,任意時間點重啟可接續crawler/run_backtest.py)FIXED_ALLOCATION = 100,000)avg_return_pct = ΣP&L / (股票數 × 10萬) × 100%BigStockBuySignalV2)MACD 四箭頭 ≥ 3 AND ADX > 20 AND WMS%R < −20 AND 加分條件 ≥ 1
加分條件(4項,達1項可進場):
月 RSI4 < 77 → 賣出
月 RSI4、週/月 VR、月 +DI1 在每個採樣點都只使用截至當日的歷史資料:
# 每個採樣點 i:
current_date = dates[i]
m_rsi4 = m_rsi4_series[m_rsi4_series.index <= current_date].iloc[-1]
| 資料 | 路徑 | 說明 |
|---|---|---|
| 原始日線 | D:/TWSE-Data/Raw/YYYY/ | TWSE 爬蟲下載 |
| 還原後年度 | D:/TWSE-Data/Adjusted/_temp/YYYY.parquet | adjuster.py 產生 |
| 全量還原 | D:/TWSE-Data/Adjusted/adjusted_all.parquet | 完整歷史合併檔 |
若更換機器,透過環境變數覆蓋路徑:
set ADJ_TEMP_DIR=E:/data/Adjusted/_temp set BACKTEST_OUT_DIR=docs/data python crawler/run_backtest.py
# 執行全市場回測(2004–2026,需先有 Adjusted/_temp/YYYY.parquet)
set ADJ_TEMP_DIR=D:/TWSE-Data/Adjusted/_temp
set BACKTEST_OUT_DIR=docs/data
python crawler/run_backtest.py
# 執行全市場掃描(今日訊號)
python core/main.py --all
# 單股回測報表
python core/backtest.py --ticker 2330 --start 2020 --end 2026
# 執行測試
python -m pytest tests/ -v
| # | 問題 | 修復 |
|---|---|---|
| 1 | Look-ahead bias — 月RSI4/週VR 用年末值判斷全年 | 改為逐點計算,每點只用截至當日資料 |
| 2 | P&L 雙重計算 — 年中賣出與年末結算重複加計 | 統一由 ticker_cash 計算,只做一次差額 |
| 3 | 報酬率分母錯誤 — 除以固定 100 萬而非實際部署資本 | 改為 ΣP&L / (n_tickers × 100k) |
| 4 | Volume 還原方向反向 — × CumFactor(配股後量減少) | 改為 ÷ CumFactor(配股後歷史量應放大) |
| 5 | 爬蟲 sleep 過短 — 2–5 秒會觸發 TWSE IP 封鎖 | 改為 120–300 秒 |
| 6 | S2 二次跌破條件錯誤 — 邏輯判斷月份偏移 | 修正為「前月站回 77 → 本月再跌破」 |
| 7 | 正/負報酬年計算錯誤 — 門檻為 −99.99% | 改為 > 0 / ≤ 0 |
| 8 | 硬碼機器路徑 | 改為環境變數 + 相對路徑 |
| 9 | HTML XSS — ticker/signal 未 escape | 加 html.escape() |
| 10 | 空測試 — test_doji_two_as_one 無 assertion | 補充實際驗證邏輯 |
本專案僅供個人學習與研究用途,不構成任何投資建議。