散戶反向策略:融資、當沖、集保數據的賺錢密碼
台灣散戶每年虧損超過 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%。
接下來,我會告訴你:
- 散戶為什麼總是賠錢(四大心理陷阱)
- 如何從公開數據看出散戶在幹嘛
- 怎麼用反向策略打敗大盤
- 用 AI 手把手教你實作

圖 1:散戶與法人的績效差距——每年約 5.3 個百分點
你知道嗎?如果從 2015 年開始,100 萬資金跟著散戶操作 vs 跟著法人操作,10 年後會差多少?答案是:50 萬以上。
📊 圖 1 繪製方法與程式碼
繪製邏輯:用三大法人(外資 + 投信)60 日累計買賣超,將所有股票分為「法人買超前 20%」和「法人賣超前 20%(散戶承接)」兩組,計算各組的前瞻超額報酬(未來一個月報酬 - 市場等權平均報酬),再年化比較。
你對 AI 說:
幫我用 finlab 資料驗證散戶 vs 法人的報酬差距:
- 用 etl:adj_close 計算前瞻報酬:adj_close.shift(-21) / adj_close.shift(-1) - 1
- 市場基準 = 所有股票前瞻報酬的等權平均(mean(axis=1))
- 超額報酬 = 個股前瞻報酬 - 市場基準
- 取外資和投信 60 日累計買賣超,每月分組
- 比較法人最愛(前 20%)vs 法人最不愛(後 20%)的年度超額報酬
- 畫成 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 說:
幫我驗證「當沖比例高的股票後續表現較差」:
- 用 intraday_trading:當日沖銷交易成交股數 / price:成交股數 算出個股當沖比例(20 日均值)
- 用 etl:adj_close 計算前瞻報酬:adj_close.shift(-21) / adj_close.shift(-1) - 1
- 超額報酬 = 個股前瞻報酬 - 等權市場平均
- 每月將股票依當沖比例分為 10 組
- 畫成長條圖,看當沖越高超額報酬是否越差
顯示程式碼
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 的集保數據實際驗證這個籌碼口訣:

圖 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 說:
幫我驗證「散戶增持的股票後續表現較差」:
- 用 etl:inventory:小於十張佔比 的 4 週變化作為散戶籌碼流向
- 用 etl:adj_close 計算前瞻報酬:adj_close.shift(-21) / adj_close.shift(-1) - 1
- 超額報酬 = 個股前瞻報酬 - 等權市場平均
- 每月將股票依散戶持股變化分為 10 組
- 畫成長條圖
顯示程式碼
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 理財研究室)
關鍵不在於「融資增加」本身,而在於「增加的速度與幅度」是否達到極端水平。

圖 3:融資餘額與大盤指數的關係——注意極端值出現的時機
📊 圖 3 繪製方法與程式碼
繪製邏輯:將全市場融資餘額加總,與 0050 還原股價(etl:adj_close,已處理除權息)疊圖,觀察融資極端值與市場轉折的關係。資料期間 2020-2025。
你對 AI 說:
幫我畫融資餘額 vs 大盤走勢的雙軸圖:
- 用 etl:adj_close 的 0050 代表大盤(注意要用還原股價,0050 有配息)
- 用 margin_transactions:融資今日餘額 加總全市場
- 畫成雙軸折線圖,標註 2025/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')
# ... 標註事件、設定標題