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.pyrotate_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 因子清單

因子來源方向說明
PEdaily_prices↓ 越低越好本益比
PBdaily_prices↓ 越低越好股價淨值比
殖利率 (DY)daily_prices↑ 越高越好股息殖利率
ROEstock_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
ROE0.300.40
毛利率0.30
負債比反向0.30
成交量0.35
EPS 穩定度0.25

3.4 評分公式

總分 = Σ(因子排名 × 權重) × 10

3.5 等級對應

等級分數區間含義
S9.0 - 10.0極度推薦,核心因子頂尖
A7.0 - 8.9強烈推薦,整體表現優異
B5.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:00twstock-daily-update-split(更新 DB)
14:15daily-stock-picker(執行評分 + 推送)

7. 路線圖

Phase內容狀態
1Skill + CLI 選股 + cron 推送🔜 本次實作
2DB 擴充 60 天 + 動量因子📋 規劃中
3FastAPI 動態網頁📋 遠期目標

8. 所需資料驗證

需求DB 現狀是否足夠
PE / PB / 殖利率✅ daily_prices足夠
ROE / 毛利率 / 負債比✅ stock_overview足夠
成交量✅ daily_prices.volume足夠
60 天歷史❌ 只有 5 天需擴充
市值前 300⚠️ 無直接欄位用 close × 近似或從 TWSE 補

9. 風險與限制

  1. 前 300 大篩選:DB 無「市值」欄位,Phase 1 用全部 1,368 檔評分(ETF 已排除),Phase 2 補市值資料
  2. 歷史資料不足:Phase 1 無動量因子,Phase 2 補入
  3. 免責聲明:系統僅供研究參考,需附風險提示