閱讀時間約 15 分鐘免費試讀
本章核心實戰價值與交付目標
• 你將學會: 掌握「價值投資 + 籌碼集中度」多因子共振架構,學會用自然語言引導 AI 的高階思維。
• 實體收穫: 個人專屬量化系統全局藍圖 + 多因子選股演算法骨架(Python)。
• 解決痛點: 告別散戶賺小賠大、上班提心吊膽盯盤的心理內耗。
本教材為程式設計與資料分析教學,非特許證券投資顧問事業,不構成任何有價證券之推介、買賣建議或獲利保證。文中股票、分點、代號與數字皆為虛構教學資料。歷史回測與模擬結果不代表未來績效;本系統目前僅以模擬交易運作,未以真實資金下單。投資人應獨立判斷並自負風險。

Module 1: 打造不盯盤的個人量化體系:價值投資、籌碼分析與 berich 自動化藍圖

在金融市場的競爭中,絕大多數散戶終其一生都在經歷一場心理內耗:每天上午九點到下午一點半,神經緊繃地盯著券商軟體的五檔報價,看到一根急拉紅K便心跳加速、深怕錯過行情而衝動追高;看到連續幾根急跌黑K又在恐懼中殺在最低點。到了月底結算對帳單,手續費與證交稅繳了數萬元,帳戶本金卻在頻繁短線進出中不斷失血縮水。

許多人以為自己虧損是因為「不懂技術指標」或「消息不夠靈通」,但事實上,散戶在市場中面臨劣勢的根本原因通常有兩個:第一,缺乏一套能夠在不確定性中提供堅固安全邊際的客觀選股哲學;第二,缺乏一套能夠代替人類肉身、嚴格執行紀律且完全不受恐懼與貪婪干擾的自動化系統。

要克服情緒引發的虧損輪迴,可行的方法是把「價值投資的確定性」與「籌碼分析的資金軌跡」融合成一套客觀量化的價值與籌碼多因子體系(待驗證的假設框架),並直接以 berich Lab 的系統架構(PostgreSQL 資料庫、FastAPI 引擎、React 卡片看板與 macOS LaunchAgents 排程守護)為藍本,打造一套自動運轉的個人專屬量化決策輔助體系。


一、為什麼散戶總在賺小賠大的輪迴中痛苦?

1. 行為金融學的真相:處置效應與損失厭惡

在諾貝爾經濟學獎得主康納曼(Daniel Kahneman)與特沃斯基(Amos Tversky)提出的「展望理論(Prospect Theory)」中,揭示了人類大腦在面對金錢決策時的天然缺陷:人類對於「損失」的痛苦感受強度,遠遠大於獲得同等「收益」的快樂感受,兩者的心理權重差距高達 2 到 2.5 倍。

這種天生的心理偏誤在台股實戰中,直接具象化為兩大典型行為模式:

第一個是「賺 5% 就急著獲利了結」。當你買進一檔股票剛開始獲利時,你的大腦會被強烈的焦慮感佔據,你無比害怕這筆剛到手的利潤會在一夕之間回吐,於是在行情剛走出底部、特定資金才剛開始進駐的初期,你就迫不及待地獲利出場,錯失後續波段。

第二個是「賠 20% 反而死抱不放」。當你買進的股票跌破支撐、基本面出現轉折時,大腦為了逃避承認虧損的巨大痛苦,會立刻啟動心理防禦機制,不斷在網路上搜尋安慰自己的利多新聞,催眠自己這只是「短期震盪」,甚至開始用「長期存股」為藉口拒絕停損。最終,一筆原本只需虧損 3% 到 5% 的交易,演變成套牢 40% 甚至腰斬的嚴重虧損。

這種「過早賣出獲利部位、過度抱牢虧損部位」的現象,在金融學上被稱為「處置效應(Disposition Effect)」。只要依然依賴盤中直覺看盤與手動下單,在劇烈波動的情緒壓力下,投資人極易重蹈覆轍。

要改善交易決策,第一步就是認清人類情緒的脆弱。我們必須建立一套客觀冷靜、不受心跳與恐懼影響的系統,讓選股、追蹤、警報與風控全部交由代碼來執行。


2. 價值投資的本質:安全邊際不是信仰,而是數學模型

在傳統的投資教學中,「價值投資」常被過度簡化為「買進好公司然後長期抱著不賣」。然而在台股這個高度受景氣循環與全球供應鏈牽動的市場裡,盲目長期持有往往會帶來巨大的時間成本。

真正的價值投資,其核心靈魂只有四個字:「安全邊際(Margin of Safety)」。

在系統的定義中,安全邊際是一套由代碼客觀審查的量化篩選矩陣:

第一是「合理的估值位階與本益比河流圖(RiverCard)」。一檔體質優良的龍頭企業,其市場估值在歷史長河中通常會在一個倍數區間內震盪(例如 12 倍至 20 倍本益比)。當總體環境出現系統性回檔時,企業的股價往往會回落至歷史估值的下緣(如 10 到 12 倍)。這時候關注,在估值層面具備較佳的安全邊際防護,且具備估值均值回歸的潛在空間。

第二是「自由現金流(Free Cash Flow)的真實含金量」。損益表上的營業收入與每股盈餘(EPS)可能透過會計認列調度美化,但自由現金流較難透過一般手法美化(雖然仍須注意資本支出認列與應收帳款讓售等調整,但相較帳面純益更具檢驗價值)。只有那些在扣除資本支出後,依然能持續產出充沛真金白銀的企業,才具備對抗景氣寒冬並維持營運研發的底氣。

第三是「定價權與產業護城河」。無論是先進製程的技術領先、高階 IC 設計的高市佔率,或是特定關鍵零組件的獨家認證,擁有護城河的企業在通膨與原料上漲時,更能將成本轉嫁給下游客戶,維持穩健的毛利率。

在選股體系中,價值投資是系統的「第一道防護網」。它負責在全市場上千檔上市櫃標的中,客觀篩除大量體質脆弱的投機標的,為投資組合建立扎實的第一層過濾。


3. 籌碼集中度的博弈密碼:大戶如何吸籌與洗盤?

如果你只懂價值投資,有時會遇到所謂的「價值陷阱(Value Trap)」:買進了一檔本益比低、殖利率看似合理的好股票,但股價卻在底部長時間橫盤沉寂。

這是因為基本面決定了內在價值的防禦底線,而籌碼面則反映了市場資金的實際流向。

在台灣這個具備高度資訊透明度的市場中,證交所與集保結算所每天和每週公布的籌碼數據,提供了極具價值的客觀線索:

第一是「集保股權分散表與千張大戶持股比率(Dispersion Table)」。當特定大戶資金在低檔建立部位時,常能觀察到鮮明的背離現象:公司的「總股東人數」在持續減少(散戶失去耐心紛紛出場),但持有「1000 張以上的大戶持股比率」卻呈現攀升(例如由 50% 提高至 60% 以上)。這代表籌碼正流向少數資金實力雄厚之特定人手中。

第二是「券商分點的籌碼集中行為(BSR Scraper & Branch Inventory)」。台股特有的券商分點制度,能記錄全台灣每一家券商分點的每日買賣明細。分點買超不等於知情交易,無法據此推論任何未公開重大資訊,但可以作為客觀的資金聚集指標。

當一檔具備深厚安全邊際的價值股,在低檔同時出現「千張大戶持股攀升」與「特定分點連續五日買超佔比提升」時,這就是價值與籌碼的「雙重共振」,顯示浮額相對沉澱、籌碼結構轉強。


4. berich 的五大數據管線架構

為了實現全自動化運轉,系統將架構解構為五個清晰的模組管線:

  1. 第一階段:資料採集層(Ingestion) 每天盤後自動抓取證交所三大法人買賣超(T86 約 15:0016:00)、券商買賣日報(BSR CSV 約 15:3017:30)、公開資訊觀測站月營收公告,以及晚間約 20:00~21:30 陸續發布之融資融券餘額(MI_MARGN)與借券明細(需設計輪詢機制,待官方資料發布後才進行抓取)。
  2. 第二階段:資料持久化層(PostgreSQL) 將全市場每日數十萬筆分點明細以星型綱要存入資料庫,建立複合索引,確保毫秒級極速查詢。
  3. 第三階段:核心運算層(Analytics) 利用 Pandas 向量化矩陣運算,在數秒內計算全市場上市櫃股票的 5日集中度、買賣家數差與主力 20 日加權成本線(VWAP)。
  4. 第四階段:訊號分發層(FastAPI) 提供非同步高速 RESTful API,供手機、網頁與 Telegram 即時獲取選股與籌碼指標。
  5. 第五階段:終端展現與推播層(React / Telegram) React 看板提供視覺化 K 線與河流圖;Telegram 在盤中偵測異常大單時推播提醒,晚間自動生成 3 分鐘精華決策卡片。

二、價值與籌碼的雙重共振:範例股 A(代號 DEMO_A)全週期模擬復盤

以下案例的股票、分點、代號與數字皆為虛構教學資料。

我們以伺服器概念股「範例股 A(代號 DEMO_A)」的教學情境為例,說明價值與籌碼多因子量化體系如何觀察市場週期變化。

1. 第一階段:低檔潛伏期(價值具安全邊際 + 千張大戶默默吃貨)

  • 估值指標:股價 108.0 元,近四季本益比 11.2 倍,座落在近 5 年本益比河流圖下緣;股價淨值比 1.45 倍,自由現金流殖利率 6.8%,營收年增率 +18.5%。
  • 集保大戶:總股東人數由 68,420 人連續 8 週遞減至 59,150 人,降幅 13.5%;千張大戶持股比由 52.3% 上升至 62.4%。
  • 分點明細:外資分點 X 累計買超 4,850 張(均價 106.8 元),本土分點 Y 累計買超 2,620 張(均價 106.2 元),買賣家數差持續為負。

2. 第二階段:震盪整理期(回測 20 日主力成本線)

  • 股價突破 110 元後拉回,回測 20 日主力加權成本線 106.5 元獲支撐(偏離度僅 +1.4%)。
  • 單日籌碼集中度達 28.5%,5日集中度達 22.4%,外資與特定分點承接浮額,多因子選股引擎給出綜合評分 100.0 分,列入重點觀察清單。

3. 第三階段:突破推升期(量能放大,均線呈多頭排列)

  • 股價帶量突破 118 元頸線,展開波段走勢,隨後持續向上延伸。

實戰參數調校矩陣

監控因子維度嚴格量化門檻 (進攻型)穩健量化門檻 (防守型)實戰業務決策意涵
估值安全邊際 (PE)本益比 <= 12.0 倍本益比 <= 15.0 倍確保買進時具備足夠的下檔防護,估值便宜
營收成長動能 (YoY)營收年增率 >= 10%營收年增率 >= 5%排除陷入產業長期衰退的價值陷阱
5日主力籌碼集中度集中度 >= +20.0%集中度 >= +12.0%確保主力近期有實質且連續的吸籌痕跡
千張大戶持股比率大戶比率 >= 60.0%大戶比率 >= 50.0%確保市場流通籌碼已高度鎖定在少數實力者手中
主力成本線偏離度股價在成本線 ±3%股價在成本線 ±5%尋找回測主力成本支撐的最佳風險報酬進場點
綜合評選通過門檻價值 ≥70 分、籌碼 ≥70 分、總分 ≥75 分價值 ≥60 分、籌碼 ≥60 分、總分 ≥65 分確保價值與籌碼多因子共振,避免單一維度偏誤

三、可直接本地運行的多因子選股引擎源碼

以下提供一套教學示範程式碼(使用示範資料):

  1. 基礎核心架構:包含不可變領域數據模型、多因子指標運算、日誌系統與模擬回測沙盒。
  2. 自訂分點策略擴充介面(Custom Plugin Interface):代碼中定義了 IClusterStrategy Protocol 擴充介面,支援注入自訂分點進出邏輯。

點擊展開:berich 價值與籌碼多因子選股引擎完整源碼 (Python 3.10+)
"""
berich Quantitative Engine - Module 01 Multi-Factor Screener
============================================================
系統名稱:berich Lab 教學示範
核心功能:價值投資安全邊際 + 主力籌碼集中度多因子選股引擎
"""

from __future__ import annotations
import logging
from dataclasses import dataclass
from typing import Dict, List, Optional, Protocol
import pandas as pd
import numpy as np

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] [berich-core] %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)
logger = logging.getLogger("berich")

@dataclass(frozen=True)
class StockSnapshot:
    stock_id: str
    name: str
    current_price: float
    pe_ratio: float
    pb_ratio: float
    fcf_yield: float
    revenue_yoy: float
    major_holder_ratio: float
    shareholder_count_change_pct: float
    chip_concentration_5d: float
    major_cost_line_20d: float
    high_price_60d: float = 125.0

@dataclass(frozen=True)
class ScreeningResult:
    stock_id: str
    name: str
    composite_score: float
    valuation_score: float
    chip_score: float
    is_passed: bool
    signal_tags: List[str]
    stop_loss_price: float
    resistance_price: float

class IClusterStrategy(Protocol):
    def evaluate_cluster_flow(self, stock_id: str) -> float:
        ...

class ValueChipScreener:
    def __init__(self, cluster_plugin: Optional[IClusterStrategy] = None):
        self.cluster_plugin = cluster_plugin

    def evaluate_valuation(self, stock: StockSnapshot) -> tuple[float, List[str]]:
        score = 0.0
        tags = []
        if stock.pe_ratio <= 12.0:
            score += 40.0
            tags.append("PE極度低估")
        elif stock.pe_ratio <= 15.0:
            score += 25.0
            tags.append("PE合理便宜")

        if stock.fcf_yield >= 0.05:
            score += 30.0
            tags.append("自由現金流充沛")

        if stock.revenue_yoy >= 0.10:
            score += 30.0
            tags.append("營收雙位數成長")

        return min(score, 100.0), tags

    def evaluate_chips(self, stock: StockSnapshot) -> tuple[float, List[str]]:
        score = 0.0
        tags = []
        if stock.chip_concentration_5d >= 20.0:
            score += 40.0
            tags.append("5日主力高度集中")
        elif stock.chip_concentration_5d >= 12.0:
            score += 25.0
            tags.append("主力顯著吸籌")

        if stock.major_holder_ratio >= 60.0:
            score += 30.0
            tags.append("千張大戶重度鎖碼")

        cost_diff_pct = ((stock.current_price - stock.major_cost_line_20d) / stock.major_cost_line_20d) * 100.0
        if -3.0 <= cost_diff_pct <= 3.0:
            score += 30.0
            tags.append("回測主力成本強支撐")

        return min(score, 100.0), tags

    def screen_stock(self, stock: StockSnapshot) -> ScreeningResult:
        v_score, v_tags = self.evaluate_valuation(stock)
        c_score, c_tags = self.evaluate_chips(stock)

        composite_score = (v_score * 0.4) + (c_score * 0.6)
        all_tags = v_tags + c_tags
        is_passed = (v_score >= 70.0) and (c_score >= 70.0) and (composite_score >= 75.0)

        stop_loss = round(stock.major_cost_line_20d * 0.95, 2)
        # 技術壓力參考位(由近 60 日波段最高價推導,僅供技術分析參考,非價格預測)
        resistance_price = round(stock.high_price_60d, 2)

        return ScreeningResult(
            stock_id=stock.stock_id,
            name=stock.name,
            composite_score=round(composite_score, 1),
            valuation_score=round(v_score, 1),
            chip_score=round(c_score, 1),
            is_passed=is_passed,
            signal_tags=all_tags,
            stop_loss_price=stop_loss,
            resistance_price=resistance_price,
        )

if __name__ == "__main__":
    demo_a = StockSnapshot(
        stock_id="DEMO_A",
        name="範例股A",
        current_price=108.0,
        pe_ratio=11.2,
        pb_ratio=1.45,
        fcf_yield=0.068,
        revenue_yoy=0.185,
        major_holder_ratio=62.4,
        shareholder_count_change_pct=-0.135,
        chip_concentration_5d=22.4,
        major_cost_line_20d=106.5,
        high_price_60d=125.0
    )

    screener = ValueChipScreener()
    res = screener.screen_stock(demo_a)
    logger.info(f"篩選標的:{res.name} ({res.stock_id})")
    logger.info(f"綜合評分:{res.composite_score} 分 | 符合條件:{res.is_passed}")
    logger.info(f"觸發訊號:{', '.join(res.signal_tags)}")
    logger.info(f"參考防守區:{res.stop_loss_price} 元 | 技術壓力參考位(近60日高點,非價格預測):{res.resistance_price} 元")
後續章節閱讀說明

《自建 berich 系統》實戰手冊全 16 篇(前言+15 章),前言與第 1 章為免費試讀。第 2 章起為進階核心架構與實戰源碼,採 Ko-fi 贊助解鎖:請以與登入相同的信箱在 Ko-fi 贊助,最近 35 天內累計達 NT$390 即可閱讀其餘 14 章;信箱不同請聯絡站長手動開通。

前往 Ko-fi 贊助支持款項由 Ko-fi 代收,到期可再次贊助延續