Daily Stock Picker — 每日 15 檔選股推薦系統設計規格
1. 系統概述
從台股前 300 大市值股票,透過多因子評分模型,每日推薦:
- 短期投資 5 檔(週~月)
- 中期投資 5 檔(季)
- 長期投資 5 檔(年+)
每檔給予 1-10 評分 + S/A/B/C 等級。
2. 資料庫擴充(Phase 2 前置)
2.1 歷史資料延長至 60 天
目前 daily_prices_YYYYMMDD 只保留 5 天。需修改 update_batch_1.py 的 rotate_old_dates():
| 項目 | 現狀 | 目標 |
|---|
| 保留天數 | 5 天 | 60 天 |
| 表格數 | 5 個 | 60 個(或合併月表) |
| 實作 | 超過刪最舊 | 超過 60 天刪最舊 |
2.2 未來:動量因子
60 天資料到位後,可加入:
momentum_60d = (close_today − close_60d_ago) / close_60d_ago
volatility_20d = 20 日年化標準差
3. 評分模型
3.1 因子清單
| 因子 | 來源 | 方向 | 說明 |
|---|
| PE | daily_prices | ↓ 越低越好 | 本益比 |
| PB | daily_prices | ↓ 越低越好 | 股價淨值比 |
| 殖利率 (DY) | daily_prices | ↑ 越高越好 | 股息殖利率 |
| ROE | stock_overview | ↑ 越高越好 | 淨值報酬率 |
| 毛利率 (GM) | stock_overview | ↑ 越高越好 | 營業毛利率 |
| 負債比 (DR) | stock_overview | ↓ 越低越好 | 負債佔資產比 |
| 成交量 (VOL) | daily_prices | ↑ 越高越好 | 日均成交量 |
3.2 正規化方法
每因子用百分位排名(Percentile Rank)轉 0-1:
正向因子(越高越好): rank = (排名 − 1) / (N − 1)
反向因子(越低越好): rank = 1 − (排名 − 1) / (N − 1)
3.3 各期程權重
| 因子 | 短期 | 中期 | 長期 |
|---|
| PE 反向 | — | — | 0.35 |
| PB 反向 | 0.35 | — | — |
| 殖利率 | — | — | 0.40 |
| ROE | 0.30 | 0.40 | — |
| 毛利率 | — | 0.30 | — |
| 負債比反向 | — | 0.30 | — |
| 成交量 | 0.35 | — | — |
| EPS 穩定度 | — | — | 0.25 |
3.4 評分公式
總分 = Σ(因子排名 × 權重) × 10
3.5 等級對應
| 等級 | 分數區間 | 含義 |
|---|
| S | 9.0 - 10.0 | 極度推薦,核心因子頂尖 |
| A | 7.0 - 8.9 | 強烈推薦,整體表現優異 |
| B | 5.0 - 6.9 | 推薦,表現良好 |
| C | < 5.0 | 觀察,部分因子偏弱 |
4. Skill 架構
4.1 Skill 名稱
daily-stock-picker
4.2 目錄結構
/root/.hermes/skills/user/daily-stock-picker/
├── SKILL.md
├── scripts/
│ ├── daily_stock_pick.py # 核心評分引擎
│ ├── init_60day_history.py # DB 遷移到 60 天保留
│ └── web_server.py # Phase 3: FastAPI 伺服器
└── references/
├── scoring-model.md # 評分模型詳細說明
└── factor-guide.md # 各因子經濟意義
4.3 核心腳本 daily_stock_pick.py
# 輸入:DB 路徑、日期、期程(short/mid/long)
# 輸出:前 5 檔推薦 + 評分明細
def score_stocks(db_path: str, term: str, top_n: int = 5) -> list[dict]:
"""
term: 'short' | 'mid' | 'long'
返回: [{stock_id, stock_name, score, grade, factors: {pe, pb, ...}}, ...]
"""
4.4 執行流程
1. 讀取 daily_prices(最新日期)+ stock_overview
2. JOIN 兩表,排除 ETF(PE/PB/殖利率三項全 NULL)
3. 篩選市值前 300 大(若 stock_overview 無市值,用 close × 近似值)
4. 對每因子做百分位排名
5. 依期程權重加總 × 10 = 評分
6. 評分排序取前 5
7. 輸出報告
5. 輸出格式
5.1 Telegram 推送
📊 每日選股推薦(2026-06-29)
🔥 短期投資(週~月)
| # | 代號 | 名稱 | 評分 | 等級 | PB | 量 | ROE |
| 1 | 2330 | 台積電 | 8.7 | A | 10.3 | 5380萬 | 24.5% |
| 2 | ... | ... | ... | ... | ... | ... | ... |
| 3 | ... | ... | ... | ... | ... | ... | ... |
| 4 | ... | ... | ... | ... | ... | ... | ... |
| 5 | ... | ... | ... | ... | ... | ... | ... |
💎 中期投資(季)
| # | 代號 | 名稱 | 評分 | 等級 | ROE | 毛利率 | 負債比 |
| 1 | ... | ... | ... | ... | ... | ... | ... |
...
🏦 長期投資(年+)
| # | 代號 | 名稱 | 評分 | 等級 | 殖利率 | PE | EPS |
| 1 | ... | ... | ... | ... | ... | ... | ... |
...
評分模型:多因子百分位排名加權
資料來源:TWSE OpenAPI + MOPS
免責聲明:本研究僅供參考,不構成投資建議
5.2 網頁顯示(Phase 3)
- 表格 + 篩選器(按等級、產業、評分排序)
- 點擊股票展開雷達圖(各因子分數)
- 歷史回顧(不同日期推薦 vs 實際表現)
6. Cron 排程
| 時間 | 任務 |
|---|
| 14:00 | twstock-daily-update-split(更新 DB) |
| 14:15 | daily-stock-picker(執行評分 + 推送) |
7. 路線圖
| Phase | 內容 | 狀態 |
|---|
| 1 | Skill + CLI 選股 + cron 推送 | 🔜 本次實作 |
| 2 | DB 擴充 60 天 + 動量因子 | 📋 規劃中 |
| 3 | FastAPI 動態網頁 | 📋 遠期目標 |
8. 所需資料驗證
| 需求 | DB 現狀 | 是否足夠 |
|---|
| PE / PB / 殖利率 | ✅ daily_prices | 足夠 |
| ROE / 毛利率 / 負債比 | ✅ stock_overview | 足夠 |
| 成交量 | ✅ daily_prices.volume | 足夠 |
| 60 天歷史 | ❌ 只有 5 天 | 需擴充 |
| 市值前 300 | ⚠️ 無直接欄位 | 用 close × 近似或從 TWSE 補 |
9. 風險與限制
- 前 300 大篩選:DB 無「市值」欄位,Phase 1 用全部 1,368 檔評分(ETF 已排除),Phase 2 補市值資料
- 歷史資料不足:Phase 1 無動量因子,Phase 2 補入
- 免責聲明:系統僅供研究參考,需附風險提示