FinLab

散戶反向策略:融資、當沖、集保數據的賺錢密碼

January 25, 2026

台灣散戶每年虧損超過 GDP 2%,約等於 5,000 億台幣。如果我們反著做呢?

前言:一個驚人的數字

先看這組數據:台灣散戶每年虧損超過 GDP 的 2%

這不是我瞎編的,是加州大學柏克萊分校教授 Brad Barber 與 Terrance Odean 的研究結果。他們用了台灣完整的股市交易數據,發現個人投資者每年落後大盤 3.8 個百分點,而法人每年則賺 1.5%(來源:Barber et al. SSRN)。

更讓人驚訝的是:85% 的散戶賣掉賺錢的股票比賣掉賠錢的股票更快。你有沒有這種經驗?股票漲 10% 就急著賣,跌 30% 卻死抱不放?

這叫做「處置效應」,是散戶賠錢的四大元凶之一。

如果散戶總是錯的,那...「跟散戶反著做」能不能賺錢?

我花了一週分析台股 10 年數據,用 AI 跑了幾十次回測。結論是:可以,而且年化報酬 33.77%

接下來,我會告訴你:

  1. 散戶為什麼總是賠錢(四大心理陷阱)
  2. 如何從公開數據看出散戶在幹嘛
  3. 怎麼用反向策略打敗大盤
  4. 用 AI 手把手教你實作

台股散戶 vs 法人年度報酬對比

圖 1:散戶與法人的績效差距——每年約 5.3 個百分點

你知道嗎?如果從 2015 年開始,100 萬資金跟著散戶操作 vs 跟著法人操作,10 年後會差多少?答案是:50 萬以上

📊 圖 1 繪製方法與程式碼

繪製邏輯:用三大法人(外資 + 投信)60 日累計買賣超,將所有股票分為「法人買超前 20%」和「法人賣超前 20%(散戶承接)」兩組,計算各組的前瞻超額報酬(未來一個月報酬 - 市場等權平均報酬),再年化比較。

你對 AI 說:

幫我用 finlab 資料驗證散戶 vs 法人的報酬差距:

  1. 用 etl:adj_close 計算前瞻報酬:adj_close.shift(-21) / adj_close.shift(-1) - 1
  2. 市場基準 = 所有股票前瞻報酬的等權平均(mean(axis=1))
  3. 超額報酬 = 個股前瞻報酬 - 市場基準
  4. 取外資和投信 60 日累計買賣超,每月分組
  5. 比較法人最愛(前 20%)vs 法人最不愛(後 20%)的年度超額報酬
  6. 畫成 2015-2025 年度對比長條圖
顯示程式碼
import numpy as np
from finlab import data
 
adj_close = data.get("etl:adj_close")
foreign_buy = data.get("institutional_investors_trading_summary:外陸資買賣超股數(不含外資自營商)")
trust_buy = data.get("institutional_investors_trading_summary:投信買賣超股數")
 
# 對齊 index 和 columns
common_idx = adj_close.index.intersection(foreign_buy.index).intersection(trust_buy.index)
common_cols = adj_close.columns.intersection(foreign_buy.columns).intersection(trust_buy.columns)
adj = adj_close.loc[common_idx, common_cols]
foreign_a = foreign_buy.loc[common_idx, common_cols]
trust_a = trust_buy.loc[common_idx, common_cols]
 
# 法人 60 日累計買賣超
institutional_net = foreign_a.rolling(60).sum() + trust_a.rolling(60).sum()
 
# 前瞻報酬
fwd_return = adj.shift(-21) / adj.shift(-1) - 1
 
# 市場基準:等權平均
market_return = fwd_return.mean(axis=1)
 
# 超額報酬 = 個股 - 市場
excess_return = fwd_return.sub(market_return, axis=0)
 
# 每年每月取樣,法人買超前 20% vs 後 20%
inst_yearly, retail_yearly = [], []
for year in range(2015, 2026):
    inst_year = institutional_net.loc[f'{year}-01-01':f'{year}-12-31']
    exc_year = excess_return.loc[f'{year}-01-01':f'{year}-12-31']
 
    inst_excess, retail_excess = [], []
    for i in range(0, len(inst_year), 20):  # 每月取樣一次
        if i >= len(exc_year):
            break
        row = inst_year.iloc[i].dropna()
        exc_row = exc_year.iloc[i].dropna()
        common = row.index.intersection(exc_row.index)
        if len(common) < 50:
            continue
        row, exc_row = row[common], exc_row[common]
        top_q = row.quantile(0.8)
        bot_q = row.quantile(0.2)
        if top_q == bot_q:
            continue
        inst_excess.append(exc_row[row >= top_q].mean())    # 法人組
        retail_excess.append(exc_row[row <= bot_q].mean())   # 散戶組
 
    inst_yearly.append(np.nanmean(inst_excess) * 12 * 100 if inst_excess else np.nan)
    retail_yearly.append(np.nanmean(retail_excess) * 12 * 100 if retail_excess else np.nan)

一、為什麼散戶總是賠錢?四大行為偏誤解密

1.1 過度自信(Overconfidence)

過度自信:對自己判斷能力的過度信任,導致無法認識到投資錯誤。

你有沒有這樣的經驗?研究了一支股票三天,覺得自己超懂,然後重壓。結果呢?

根據 Chen, Kim, Nofsinger, and Rui (2007) 的研究,華人投資者比美國投資者更過度自信。他們發現中國投資者持有較少股票,但交易非常頻繁(來源:Wiley Online Library)。

過度自信的表現:

行為 正常投資者 過度自信投資者
交易頻率 月均 2-3 次 月均 10+ 次
持股數量 5-10 檔 2-3 檔(集中押注)
對虧損的態度 檢討策略 「市場錯了,不是我錯」
對消息的反應 查證後決策 聽到就買

關鍵指標:如果你每個月交易超過 10 次,你可能有過度自信的問題。

1.2 處置效應(Disposition Effect)

處置效應:投資者傾向於賣出獲利股票,但持有虧損股票。

這是最致命的行為偏誤。

根據 Barber 等人對台灣投資者的研究:

  • 個人投資者賣出獲利股票的可能性是賣出虧損股票的將近 4 倍
  • 85% 的投資者有處置效應
  • 台灣投資者的處置效應指數(PGR/PLR)= 2.5,美國只有 1.5

(來源:Taylor & Francis)

這代表什麼?假設你買了兩支股票:

股票 買入價 現價 漲跌 散戶的決策 正確決策
A 股 100 120 +20% 賣掉(鎖定利潤) 持有(趨勢向上)
B 股 100 70 -30% 死抱(等待回本) 停損(避免更大損失)

結果:你賣掉會繼續漲的,留著會繼續跌的。小賺大賠,越操作越窮。

想知道自己有沒有處置效應?問自己一個問題:過去一年,你賣掉的股票裡,賺錢的多還是賠錢的多?如果答案是「賺錢的比較多」,你已經中招了。

1.3 從眾行為(Herding Behavior)

從眾行為(羊群效應):模仿多數人的行動,認為「大家不會錯」。

還記得 2021 年的航運股嗎?長榮從 40 漲到 230,PTT 上人人喊著「All in 航運」。結果呢?

台股歷年來多次出現題材炒作熱潮:

  • 2020-2021:航運股
  • 2023-2024:AI 概念股
  • 2025:HBM、機器人

每次熱潮的結尾都很像:最後一批追高的散戶被套在山頂

根據華藝線上圖書館的研究,投資人對金融股存在一定程度的從眾行為,短期可獲利,但長期報酬率卻低於大盤(來源:華藝線上圖書館)。

如何避免從眾

危險訊號 說明
身邊菜籃族都在討論 代表「聰明資金」早就進場完畢
PTT/FB 一面倒看多 代表已經沒有新買盤
融資餘額暴增 散戶正在用槓桿追高
新聞媒體大篇幅報導 通常是出貨訊號

1.4 損失趨避(Loss Aversion)

損失趨避:損失帶來的痛苦是獲利帶來快樂的 2-2.5 倍。

這是諾貝爾經濟學獎得主 Daniel Kahneman 的研究發現(來源:維基百科)。

實際表現在投資上:

情境 理性決策 實際行為
股票虧損 10% 評估基本面決定持有或賣 不敢賣,怕「認賠」
股票獲利 10% 評估基本面決定持有或賣 趕快賣,怕「利潤消失」
面對高波動標的 計算期望值 過度恐懼,不敢買

你有沒有這種經驗——某支股票跌了 20%,你心裡想「再等等,會回來的」?這就是損失趨避在作祟。你不是在「等回本」,你是在「逃避認錯」。


二、散戶行為數據從哪裡看?三大公開指標

好,我們知道散戶有這些心理偏誤,但要怎麼「看到」散戶在幹嘛?

台灣股市的透明度很高,有三個公開數據可以追蹤散戶行為:

2.1 融資餘額:散戶的槓桿溫度計

融資:跟券商借錢買股票,可以用 4 成資金買進股票。

因為法人受限於法規不能做融資融券,所以融資餘額幾乎等於散戶的風向(來源:Yahoo 股市)。

融資狀態 代表意義 後續走勢傾向
融資餘額創新高 散戶極度樂觀 小心反轉下跌
融資餘額急凍 散戶恐慌出清 可能接近底部
融資緩步增加 正常多頭 趨勢可能持續

歷史案例:2025 年 4 月融資斷頭風暴

日期 事件 指數變化 融資變化
04/02 川普宣布對台加徵 32% 關稅 - -
04/07 恐慌性下跌 -2,065 點(-9.7%) -
04/08 斷頭潮 - -284 億(創新高)
04/09 持續崩跌 -千點 三日共減 750 億

(來源:Vocus 事件分析)

2025 年 4 月這三天,融資餘額蒸發了 750 億。這些錢去哪了?被強制賣出了。這就是「融資斷頭」——當維持率跌破 130%,券商會強制賣掉你的股票。

2.2 當沖數據:短線投機熱度

當沖:當天買進、當天賣出的交易方式。

當沖比例高,代表投機氛圍濃厚。

根據 Barber 等人 14 年的研究:

  • 超過八成的當沖交易者虧損
  • 頂尖 500 名當沖客日報酬 37.9 bps(約 0.38%)
  • 最差的當沖客日報酬 -28.9 bps

(來源:Barber & Odean, Taiwan Day Trading Study)

這代表什麼?當沖是「零和遊戲中的負和遊戲」(因為有交易成本)。80% 的人注定虧損,只有極少數人能賺錢

當沖交易者獲利分布

圖 2:當沖比例 vs 市場調整後超額報酬——兩端都差,呈現 U 型

從圖中可以看到一個有趣的 U 型分布——不只高當沖的股票跑輸市場,低當沖的也是:

分組 特徵 年化超額報酬 為什麼差
低當沖(第 1-2 組) 冷門、流動性差 約 -2.6% ~ -0.2% 流動性折價:沒人關注、買賣價差大
中等(第 3-6 組) 正常交易 約 -0.3% ~ +0.8% 接近市場平均
高當沖(第 9-10 組) 投機過熱 約 -1.8% ~ -3.5% 散戶追高殺低的標的

散戶集中的兩個極端——冷門股死抱不放熱門股追漲當沖——都跑輸市場。這與前面提到的四大行為偏誤完全吻合:低當沖反映損失趨避(不敢賣),高當沖反映過度自信與從眾行為(頻繁交易、追逐熱門)。

📊 圖 2 繪製方法與程式碼

繪製邏輯:用 intraday_trading:當日沖銷交易成交股數 / price:成交股數 計算個股當沖比例(20 日均值),將股票分為 10 組,觀察各組的前瞻超額報酬(未來一個月報酬 - 等權市場平均)。資料期間 2015-2025。

你對 AI 說:

幫我驗證「當沖比例高的股票後續表現較差」:

  1. 用 intraday_trading:當日沖銷交易成交股數 / price:成交股數 算出個股當沖比例(20 日均值)
  2. 用 etl:adj_close 計算前瞻報酬:adj_close.shift(-21) / adj_close.shift(-1) - 1
  3. 超額報酬 = 個股前瞻報酬 - 等權市場平均
  4. 每月將股票依當沖比例分為 10 組
  5. 畫成長條圖,看當沖越高超額報酬是否越差
顯示程式碼
import pandas as pd
import numpy as np
from finlab import data
 
adj_close = data.get("etl:adj_close")
volume = data.get("price:成交股數")
daytrade_vol = data.get("intraday_trading:當日沖銷交易成交股數")
 
# 當沖比例 = 當沖成交股數 / 總成交股數(20 日均值平滑)
dt_ratio = daytrade_vol.rolling(20).mean() / volume.rolling(20).mean()
 
# 前瞻報酬
fwd_return = adj_close.shift(-21) / adj_close.shift(-1) - 1
 
# 市場基準 & 超額報酬
market_return = fwd_return.mean(axis=1)
excess_return = fwd_return.sub(market_return, axis=0)
 
# 每月取樣,按當沖比例分 10 組
group_returns = {i: [] for i in range(10)}
for i in range(0, len(dt_ratio), 20):
    row_dt = dt_ratio.iloc[i].dropna()
    row_exc = excess_return.iloc[i].dropna()
    common = row_dt.index.intersection(row_exc.index)
    row_dt, row_exc = row_dt[common], row_exc[common]
    row_dt = row_dt[row_dt > 0]       # 只看有當沖的股票
    row_exc = row_exc[row_dt.index]
    if len(row_dt) < 100:
        continue
    labels_q = pd.qcut(row_dt, 10, labels=False, duplicates='drop')
    for g in range(labels_q.max() + 1):
        group_returns[g].append(row_exc[labels_q == g].mean())
 
# 年化超額報酬
for g in range(10):
    annual = np.nanmean(group_returns[g]) * 12 * 100
    print(f"第{g+1}組: {annual:+.2f}%")

2.3 集保數據:籌碼流向的溫度計

集保數據:集保中心每週公布的「股權分散表」,顯示股票握在誰手上。

持股規模 分類 說明
零股 極小散戶 最小單位投資人
< 10 張 一般散戶 小額投資人
10-50 張 中戶 中等規模投資人
400-1,000 張 大戶 主力級別
> 1,000 張 千張大戶 法人/大股東

(來源:Mr.Market 市場先生、StockFeel 股感)

籌碼判斷口訣

  • 50 張以下持股增加 + 千張以上持股減少 → 籌碼流向散戶 → 易跌難漲
  • 50 張以下持股減少 + 千張以上持股增加 → 籌碼集中大戶 → 易漲難跌

(來源:凱基投資充電站)

台積電的千張大戶持股比例是多少?答案是 86.28%。這代表什麼?這家公司的籌碼幾乎都被大戶掌握,散戶只佔很小一部分。所以當大股東開始賣股票,股價波動會很明顯。

我們用 finlab 的集保數據實際驗證這個籌碼口訣:

集保籌碼流向 vs 超額報酬

圖 2.5:散戶持股變化 vs 後續超額報酬——散戶減持的股票大幅跑贏市場

結果一目了然:

分組 散戶持股 4 週變化 年化超額報酬 說明
第 1-3 組 散戶減少最多 +8% ~ +22% 大戶接手,後續大幅跑贏
第 4-7 組 持平 -7% ~ +18% 分布較散
第 8-10 組 散戶增加最多 -10% ~ -33% 散戶追買,後續大幅跑輸

散戶增持最多的股票(第 10 組)年化超額報酬 -33%,這就是「籌碼流向散戶 = 易跌難漲」的數據證據。

📊 圖 2.5 繪製方法與程式碼

繪製邏輯:用 etl:inventory:小於十張佔比 的 4 週變化作為散戶籌碼流向指標,將股票分為 10 組,觀察各組的前瞻超額報酬(未來一個月報酬 - 等權市場平均)。資料期間 2015-2025。

你對 AI 說:

幫我驗證「散戶增持的股票後續表現較差」:

  1. 用 etl:inventory:小於十張佔比 的 4 週變化作為散戶籌碼流向
  2. 用 etl:adj_close 計算前瞻報酬:adj_close.shift(-21) / adj_close.shift(-1) - 1
  3. 超額報酬 = 個股前瞻報酬 - 等權市場平均
  4. 每月將股票依散戶持股變化分為 10 組
  5. 畫成長條圖
顯示程式碼
import pandas as pd
import numpy as np
from finlab import data
 
adj_close = data.get("etl:adj_close")
small_holder = data.get("etl:inventory:小於十張佔比")
 
# 散戶持股 4 週變化
small_change = small_holder - small_holder.shift(4)
 
# 前瞻報酬 & 超額報酬
fwd_return = adj_close.shift(-21) / adj_close.shift(-1) - 1
market_return = fwd_return.mean(axis=1)
excess_return = fwd_return.sub(market_return, axis=0)
 
# 每月取樣,按散戶持股變化分 10 組
group_returns = {i: [] for i in range(10)}
for i in range(0, len(small_change), 20):
    row_sc = small_change.iloc[i].dropna()
    row_exc = excess_return.iloc[i].dropna()
    common = row_sc.index.intersection(row_exc.index)
    row_sc, row_exc = row_sc[common], row_exc[common]
    if len(row_sc) < 100:
        continue
    labels_q = pd.qcut(row_sc, 10, labels=False, duplicates='drop')
    for g in range(labels_q.max() + 1):
        group_returns[g].append(row_exc[labels_q == g].mean())
 
# 年化超額報酬
for g in range(10):
    annual = np.nanmean(group_returns[g]) * 12 * 100
    print(f"第{g+1}組: {annual:+.2f}%")

三、反向策略的科學根據

知道散戶在幹嘛之後,我們來看看「反著做」到底有沒有用。

3.1 學術研究怎麼說?

根據 Andrade, Chang, and Seasholes (2008) 使用 1994-2002 年台灣融資帳戶的研究:

  • 被個人投資者大量買進的股票,隔週報酬 -23 bps
  • 被個人投資者大量賣出的股票,隔週報酬 +29 bps

(來源:芝加哥聯邦儲備銀行)

這代表什麼?跟散戶反著做,每週可以多賺 0.52%。一年 52 週,理論上可以多賺 27%。

3.2 Smart Money vs. Dumb Money

在美國市場,有一個指標叫做「Smart Money Flow Index」(SMFI),專門追蹤「聰明資金」與「愚蠢資金」的動向。

群體 定義 行為特徵
Smart Money 機構投資者、市場內部人士 逆向投資,下跌時買、上漲時賣
Dumb Money 小型散戶、短線投機者 追漲殺跌,極端時刻做出錯誤決策

根據 SentimenTrader 的研究:

  • 當 Dumb Money Confidence > 70% 時,S&P 500 年化報酬只有 3%
  • 使用特定的 Smart/Dumb Money 利差門檻,6-12 月後報酬 100% 為正

(來源:SentimenTrader)

3.3 台灣市場的反向策略應用

FM Studio 理財研究室提出了一個很好的觀點:

「融資餘額更像是一個『市場情緒指標』而非單純的『散戶指標』。與其將其視為絕對的反向指標,不如將其看作是衡量市場『體溫』的溫度計。」

(來源:FM Studio 理財研究室)

關鍵不在於「融資增加」本身,而在於「增加的速度與幅度」是否達到極端水平。

融資餘額 vs 加權指數

圖 3:融資餘額與大盤指數的關係——注意極端值出現的時機

📊 圖 3 繪製方法與程式碼

繪製邏輯:將全市場融資餘額加總,與 0050 還原股價(etl:adj_close,已處理除權息)疊圖,觀察融資極端值與市場轉折的關係。資料期間 2020-2025。

你對 AI 說:

幫我畫融資餘額 vs 大盤走勢的雙軸圖:

  1. 用 etl:adj_close 的 0050 代表大盤(注意要用還原股價,0050 有配息)
  2. 用 margin_transactions:融資今日餘額 加總全市場
  3. 畫成雙軸折線圖,標註 2025/4 融資斷頭事件
  4. 時間範圍 2020-2025
顯示程式碼
from finlab import data
 
# 注意:0050 有配息,必須用還原股價
adj_close = data.get("etl:adj_close")
margin_balance = data.get("margin_transactions:融資今日餘額")
 
taiex = adj_close['0050'].dropna()
margin_total = margin_balance.sum(axis=1).dropna()
 
# 雙軸折線圖
fig, ax1 = plt.subplots(figsize=(12, 6))
ax1.plot(taiex.index, taiex.values, color='#2563EB', label='0050 還原股價')
ax2 = ax1.twinx()
ax2.fill_between(margin_total.index, margin_total.values / 1e12,
                 alpha=0.3, color='#EF4444')
# ... 標註事件、設定標題

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始