Oracle3
Open-source trading engine and MCP server for prediction markets. Fee-aware no-arbitrage trading across related contracts, live on Kalshi, Polymarket and Solana or on paper.
2004–2026 全市場逐年回測、訊號股 K 線與技術指標。免費。
Translation pending
FinancePythonGitHub @slashman413OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Taiwan Stock Backtest Dashboard
Translation pending
Taken from the repository README
Loading the full README.
Read the full 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 | 補充實際驗證邏輯 |
本專案僅供個人學習與研究用途,不構成任何投資建議。