巴菲特量化篩選清單

10 條可程式化規則 + 4 條硬性 disqualifier。
對映到 stockTracker data/latest_prices.csv 欄位 + 補抓欄位。
機器可讀版本:/Users/apple/Projects/agentS/buffet_agent/agent/rules.json


評分制度

結果 總分 行動
BUY ≥ 80 進入估值階段,等安全邊際
HOLD 60–79 已持有可繼續,新進需等更佳價格
WATCH 40–59 加入觀察清單,等基本面好轉
AVOID < 40 結構性問題,跳過
OUT_OF_CIRCLE 任意分數 觸發任一硬性 disqualifier,立即退出

滿分 110 分(100 基礎分 + 10 分 ground truth bonus)。


A. 10 條量化規則(核心評分表)

# 規則 欄位(CSV) 條件 滿分 來源概念
R1 ROE 持續高水準 roe ≥ 0.15 15 經濟商譽
R2 毛利率高(定價權) gross_margin ≥ 0.30 10 特許經營權
R3 淨利率達標 net_margin ≥ 0.10 10 護城河
R4 EPS 5 年成長率 earn_growth ≥ 0.10 10 複利
R5 槓桿低 debt_equity ⚠️補 < 0.5 15 槓桿與借貸
R6 自由現金流邊際 fcf_margin ⚠️補 ≥ 0.15 10 股東收益
R7 回購紀律(有回購) buyback_yield ⚠️補 > 0 5 股票回購
R8 估值合理 fwd_pe, peg PE < 25 OR PEG < 1.5 10 安全邊際
R9 不在 52 週高點 w52_pos < 0.80 5 市場先生
R10 Berkshire 持有(ground truth) 13F berkshire 在 13F 10 (驗證)

⚠️補 = stockTracker 目前未抓,需 Phase 3 補進 tracker.py細節


B. 4 條硬性 disqualifier(觸發即 OUT_OF_CIRCLE)

# 規則 條件 來源概念
D1 槓桿過高 debt_equity > 2.0 槓桿與借貸
D2 衍生品大量曝險 derivative_notional / total_capital > 0.5 衍生性金融商品
D3 行業在能力圈外(黑名單) sector ∈ 能力圈
D4 連續 3 年 EPS 為負 trailing 3y EPS < 0 雪茄煙蒂投資 反向

C. 5 條軟性加分(bonus)

# 規則 條件 加分 來源
B1 Berkshire 重倉(>1% 組合) 13F berkshire +5 ground truth
B2 ROIC > 20% 連續 5 年 roic_5y_avg ⚠️補 +5 經濟商譽
B3 CEO 持股 / 淨值 > 5% insider_ownership ⚠️補 +3 經理人選擇
B4 其他價值名家持股 (Munger trust / Li Lu / Bill Ackman) 13F +2 ground truth
B5 連續 10 年股利成長 dividend_growth_10y ⚠️補 +3 複利

D. 評分流程(伪代碼)

def score(ticker: str) -> dict:
    data = load_ticker(ticker)  # stockTracker CSV + 補抓欄位

    # Step 1: 硬性篩除
    if data.debt_equity > 2.0: return OUT_OF_CIRCLE("D1: 槓桿過高")
    if data.derivative_ratio > 0.5: return OUT_OF_CIRCLE("D2: 衍生品過大")
    if data.sector in BLACKLIST: return OUT_OF_CIRCLE("D3: 能力圈外")
    if data.eps_3y_negative: return OUT_OF_CIRCLE("D4: 連續虧損")

    # Step 2: 跑 10 條核心規則
    base = sum(rule.points for rule in RULES if rule.passes(data))  # 0-100

    # Step 3: 加分項
    bonus = sum(b.points for b in BONUSES if b.passes(data))  # 0-18

    total = min(base + bonus, 110)

    # Step 4: 結論
    if total >= 80: bias = "BUY"
    elif total >= 60: bias = "HOLD"
    elif total >= 40: bias = "WATCH"
    else: bias = "AVOID"

    return {"total": total, "bias": bias, "breakdown": ...}

E. 預期回測結果(ground truth 驗證)

應該 BUY 或 HOLD(已知重倉股)

Ticker 預期分數 預期 bias 引用
AAPL ~85 BUY 蘋果
KO ~78 HOLD 可口可樂
AXP ~72 HOLD 美國運通
MCO ~88 BUY 穆迪
BAC ~70 HOLD (Buffett 持有)

應該 AVOID 或 OUT_OF_CIRCLE

Ticker 預期分數 預期 bias 為什麼
TSLA OUT_OF_CIRCLE D3 能力圈外(Buffett 從未投資)
COIN OUT_OF_CIRCLE D3 能力圈外(加密交易所)
GME < 30 AVOID R1/R3/R4 全敗(無 ROE、無利潤)
AMC OUT_OF_CIRCLE D1 槓桿過高 + D4 連虧
IBM ~45 WATCH Buffett 已認錯出清;現在指標有起色但護城河疑慮

F. 缺值與例外處理

情況 策略
規則欄位缺值 該規則 graceful skip(不扣分但 confidence -10%)
規則需歷史資料(如 ROE 持續 5 年) Phase 2 用最新單年 + 文字 caveat;Phase 3 補完整歷史
公司剛 IPO < 3 年 跳過 R4(成長率)+ B5(股利連續),加註「資料不足」
金融業(保險、銀行) R5(D/E)放寬至 < 5;R2(毛利)改用 net interest margin
不是美股 ADR R10(Berkshire 13F)跳過

G. 規則調整原則

何時更新規則: - 巴菲特公開新立場(年度股東信、大會 Q&A) - 知識庫新增重要概念節點 - 回測發現系統性偏差(例:科技股全部低估)

每次調整需: 1. 在 巴菲特交易邏輯總綱 補新立場引用 2. 修改 rules.json 3. 跑 ground truth 回測(5+5 樣本) 4. 寫進 CHANGELOG


相關筆記