跳至主要內容
台股研究 約 7 分鐘閱讀

週轉率高低能選股嗎?台股低週轉、高週轉與突然放大,
27 組回測未勝 0050

週轉率高代表買氣強、周轉率低就有補漲空間嗎?用台股成交股數除以當時已知的發行股數,分別回測低週轉、高週轉與週轉突然放大。2018 年至 2026 年,三種設計共 27 組鄰近參數都沒有贏過含息 0050 的日夏普,放大兩倍版本還出現年化負報酬;附參數熱圖、成本與可下載程式。

免安裝,用 AI 重跑這篇的策略

在瀏覽器開啟 FinLab Studio,AI 依本文的條件重跑回測,接著可以改條件再測。

在 Studio 重跑
27 組未勝基準

週轉率高低與突然放大回測:三種台股設計的日夏普均低於含息0050的1.08

依本文重跑

執行這個策略

複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。

告訴你的AI:

設定 FinLab,重現這篇文章低週轉、高週轉與週轉放大的台股回測,請讀:https://finlab.finance/setup?relatedUrl=/blog/stock-turnover-ratio-backtest

免安裝,開啟 FinLab Studio

在 2018 年 2 月至 2026 年 11 月這段台股資料中,低週轉、高週轉與週轉突然放大,三種設計都沒有通過驗證。原設定的日夏普依序為 0.30、0.38、−0.31,同期含息 0050 為 1.08;把平均天數、持股數或放大門檻往兩邊移,共 27 組參數,沒有一組高於基準。本文以反面教材為主,記錄把「冷門股會補漲」與「換手熱絡會續漲」寫成交易規則之後的結果。

週轉率選股的三種結果

個股週轉率是成交股數相對於流通股數的比例,週轉率與周轉率在這個語境中是同一個詞。它可以協助比較不同股本股票的交易熱度;策略每月換掉多少持股,也常叫周轉率,兩者的分子與分母不同。完整名詞與投組換手的成本關係,見周轉率說明。本文聚焦個股換手速度是否有選股能力。

設計 原設定 年化報酬 日夏普 最大回撤 贏基準的參數組
低週轉 近 40 日平均最低的 30 檔,每月換股 3.0% 0.30 −27.4% 0/9
高週轉 近 40 日平均最高的 30 檔,每月換股 7.2% 0.38 −56.1% 0/9
週轉突然放大 近 5 日平均超過近 40 日平均兩倍,最多 30 檔,每週換股 −11.1% −0.31 −77.5% 0/9
0050 含息持有 還原價買進持有 22.4% 1.08 −34.0% 基準

低週轉的最大回撤比較淺,但長期報酬與日夏普都較低。高週轉雖有正報酬,最大回撤仍超過五成;週轉突然放大則連年化報酬都是負的。這三個觀察指向不同風險,不能合成一句「週轉率越高越好」或「越低越好」。股票選股完整指南介紹如何把單一指標放回多因子研究的架構。

成交股數除以當時已知的股數

本次個股日週轉率=當日成交股數 ÷ 當時可取得的發行股數。分母使用 FinLab 的歷史月資料,沿資料的可得日期往後補到交易日。2330 的資料檢查例子是約 259.32 億股;股數較多的公司,即使成交股數很大,換手比例也未必高。

直接讀歷史股數,可以避免把所有股票的面額都當成 10 元。若從財報股本換算,還要處理金額單位、每股面額與面額變更。用最新股數回填整段歷史,也會把當時不知道的增資、減資與拆股資訊帶回過去,造成前視偏差。這次沒有這樣回填。

已發行股數仍是流通在外股數的近似:沒有另扣庫藏股、限售股或大股東長期不交易的持股;月資料也不會即時反映每一次股數變動。因此,它衡量的是相對整體股數的交易熱度,無法直接回答市場上實際可買到多少籌碼。這個限制對低流通股比例的公司尤其重要。

股票池保留歷史價格表中的四碼普通股,排除代號以 0 開頭的 ETF 等商品,以及 91 開頭的存託憑證;再要求近 20 日平均成交金額大於 2,000 萬元、當天有價格與正成交量。這個成交額門檻先做,才依週轉率排序,避免低週轉組塞滿幾乎沒有交易的股票。金融股與 KY 股沒有一律排除,也沒有另加目前上市名單去刪除已下市公司。

低週轉與高週轉,測的是相反假說

Datar, Naik & Radcliffe(1998)以成交股數占流通在外股數的比例作為流動性代理,檢驗美股流動性與報酬的關係。低週轉可能對應較低流動性,投資人要求補償;這是低週轉設計的研究動機。原研究是跨股票的統計分析,不能直接推出台股每月買最低 30 檔就會有效。

高週轉設計則檢查另一個方向:交易熱絡是否能延續報酬。Lee & Swaminathan(2000)研究歷史成交量與價格動能的交互關係,顯示交易量可以區分不同階段的動能。這並不等同「高週轉率就買進」;本文把高週轉單獨拿出來,檢查省略價格動能後還剩下多少選股能力。

第三種設計看的是股票相對自己的變化。近 5 日平均週轉率除以較長天數平均,超過門檻才入選,按放大倍數取前 30 檔。這能區分「向來熱門」與「最近突然熱起來」,但沒有區分放量上漲與放量下跌。若關心量跟價格方向的組合,可接著看量價背離回測;爆量、漲停與當沖研究處理的是另一些事件條件。

週轉率三種選股設計與0050含息的同日起算淨值,低週轉、高週轉及突然放大均落後基準

四條淨值從共同起始日歸一。低週轉的曲線較平,沒有轉成較好的風險調整報酬;高週轉的波動很大,也沒有以足夠的報酬補償。放大版本持續換進近期交易最活躍的股票,則在這段資料中逐步累積虧損。圖中的對數刻度呈現累積倍率,表格的最大回撤才是從各自高點跌下來的幅度。

鄰近參數:27 組都未形成有效區域

開跑前固定的網格如下,看到結果後沒有改選股條件。

設計 第一個參數 第二個參數 原設定
低週轉、高週轉 平均 20、40、60 個交易日 持有 20、30、40 檔 40 日、30 檔
週轉突然放大 長均值 20、40、60 個交易日,短均值固定 5 日 放大超過 1.5、2、2.5 倍 40 日、兩倍

週轉率選股九宮格參數熱圖:低週轉、高週轉與放大設計的27組日夏普相對0050差值皆為負

熱圖每一格是該設定的日夏普減去同期 0050 的 1.08,三個面板分別對應低週轉、高週轉與突然放大。要有七成以上的鄰近組合勝出,九組至少要有七組;這次三個設計都是零組。沒有理由在其中挑一個比較不差的格子,改稱找到有效的週轉率門檻。

「週轉率多少算高」也難用一個固定百分比回答。不同股本、交易制度與時期,分布會變;本次低、高週轉使用當天股票池內的相對排序,放大設計則使用自己相對自己的倍數。這兩種方式都沒有把單一絕對數字當成全市場通用門檻,結果仍未通過。

前後半段與成本,沒有補回優勢

設計 前半段日夏普 後半段日夏普 是否兩段都贏基準
低週轉 0.47 0.14 否
高週轉 0.11 0.64 否
週轉突然放大 −0.76 0.09 否
0050 含息 0.73 1.36 基準

週轉率三種設計的前後半段日夏普,與同期0050比較,沒有任何設計兩段勝出

回測依交易日數對半切,兩邊都用各自同期基準比較。高週轉的後半段好於前半段,仍低於 0050 的 1.36;突然放大也是後半段才接近正值,無法支撐跨期間穩定的結論。程式另列剔除策略年報酬最好一年後的結果,避免只靠某一年的表現過關;三個設計在鄰近參數與分段兩關已先失敗。

全部策略都使用 sim() 預設交易成本:買賣各收 0.1425% 手續費,賣出另扣 0.3% 證交稅。沒有把成本設成零,也沒有另外加上滑價。低、高週轉每月的目標權重單邊換手平均都約 35%,單月最高 60%;突然放大平均約 335%,最高約 463%,因為一個月裡會換好幾次。

這裡的單邊換手是各次目標權重變化絕對值總和的一半,再加總到月,未計持有期間的價格漂移,最後一個月也尚未結束。它與選股用的個股週轉率完全不同,卻會決定實際要付多少交易成本。高頻替換持股的代價,在回測方法與成本中有更完整的說明。這次沒有額外跑零成本版本,無法把虧損精確拆成選股訊號與成本各占多少。

用 FinLab 重跑原設定

以下核心程式對應低週轉 40 日、30 檔版本。需要資料時套件會引導登入;可將條件交給 AI 修改,但改過之後就是另一個研究,不能沿用本文結果。

顯示程式碼
import pandas as pd
from finlab import data
from finlab.backtest import sim
 
data.truncate_end = "2026-11-09"
volume = pd.DataFrame(data.get("price:成交股數"))
amount = pd.DataFrame(data.get("price:成交金額"))
issued = pd.DataFrame(data.get("internal_equity_changes:發行股數"))
issued = issued.reindex(volume.index, method="ffill")
turnover = volume / issued.where(issued > 0)
 
stocks = [
    s for s in volume.columns
    if len(s) == 4 and s.isdigit() and not s.startswith(("0", "91"))
]
liquid = amount[stocks].rolling(20).mean() > 20_000_000
score = -turnover[stocks].rolling(40).mean()
score = score.where(liquid & volume[stocks].gt(0))
position = (score.rank(axis=1, ascending=False, method="first") <= 30) / 30
month_ends = position.groupby(position.index.to_period("M")).tail(1)
month_ends = month_ends.loc["2017-12-01":]
report = sim(month_ends, resample=month_ends.index, upload=False)
report.to_html("report_low_turnover.html")

完整下載版另含共同區間統計、高週轉與放大版本。三者的比較表統一從 2018-02-01 起算,前面的部位資料供持倉暖機;文章內嵌報告的淨值也裁到共同區間。互動報告的夏普使用套件預設無風險利率 2%,本文表格的日夏普採零利率,因此兩個夏普口徑不同,年化報酬與回撤可直接對照。

回測方法與適用限制

項目 本次設定
日期 資料截至 2026-11-09;執行日 2026-11-10;比較窗 2018-02-01 至 2026-11-09
資料與版本 FinLab 2.3.8;成交股數、成交金額、歷史發行股數、還原收盤價
訊號與成交 當日收盤後計算,下一交易日按 sim() 預設收盤價成交;月、週末取實際交易日
持股權重 等權,最多指定檔數;不足時保留現金,不放大剩餘股票權重
基準 0050 還原價純算術持有,含息、不經 sim()、不扣交易成本
同曝險對照 以相同平均投入比例固定持有 0050;零利率下固定縮放不改變夏普,三設計仍未勝出
股票類別 保留歷史樣本的金融與 KY 股;排除 ETF、存託憑證;未另排除全額交割與處置股
滑價與容量 未額外估算;2,000 萬元成交額門檻無法保證任何資金規模都可成交
驗證範圍 鄰近參數、前後半段、預設成本與剔除最佳年;全段樣本內,未做真正未來樣本外

歷史資料可能修補,套件版本也會變。本文數字使用同一次完整執行的結果,兩篇研究的 0050 基準採相同日期與算法。回測過度擬合說明為何同一段資料反覆試很多規則,容易產生偶然的漂亮結果;本次保留全部失敗組合,沒有換一個參數重新命名。

常見問題

週轉率跟周轉率有差嗎?

在股票成交語境中,通常是同一名詞的不同寫法。閱讀時更應確認指的是個股成交股數占總股數,還是投資組合換掉多少部位;資產周轉率則是財務上的營運效率指標,也不能混用。

週轉率高,表示主力正在買嗎?

每一筆成交同時有買方與賣方。週轉率只描述交易股數相對股數有多大,不能單靠這個比例判斷買方身分、集中度或買超方向。法人籌碼比較測的是另一類資料。

低週轉率是不是比較安全?

本文原設定的回撤較淺,但年化只有 3.0%,也不代表個別股票容易賣出。低週轉可能伴隨較大買賣價差,遇到需要退出時,報價與可成交數量會比歷史收盤價更重要。

週轉率突然放大兩倍,可以追嗎?

本次每週買進放大倍數最高、且超過兩倍的股票,年化為 −11.1%。這不支持把放大量單獨當成追價規則;加上價格方向或其他條件,需要重新驗證。

為什麼先排除低成交金額?

低週轉組容易選到幾乎沒有交易的股票。門檻把研究限制在日均成交額超過 2,000 萬元的股票,但這也代表結論不能直接外推到門檻以下的股票。

27 組都沒過,代表成交量沒有用嗎?

結論只涵蓋這三個選股設計、這段資料與這組成本。價格與成交量的組合、持有時間或其他股票池可以產生不同問題。OBV 台股實測研究累積量能;本文不把兩者視為同一個因子。

下載與研究資料

檔案 內容
strategy.py 三種原設定擇一執行,預設低週轉版本
完整研究包 解壓後執行內附研究程式,重跑兩篇共 11 設計、99 組參數及既有策略對照
data.csv 共同日期的策略與基準淨值
metrics.json 全部參數、分段、成本與最佳年檢查結果
低週轉互動報告 原設定低週轉版本的淨值與交易紀錄

FinLab 量化研究團隊使用套件與歷史資料,研究明確規則在扣除成本後的表現,並檢查鄰近參數與分段結果。本文三種設計均未通過驗證,未新增對應策略頁。

免責聲明:本文所有策略與回測結果僅供教學與研究用途,不構成投資建議。過去績效不代表未來表現。投資一定有風險,請審慎評估自身風險承受能力。

最後更新:2026-11|回測區間:2018-02-01 至 2026-11-09|作者:FinLab 量化研究團隊

FinLab AI

想建立自己的策略?

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

免費開始

更多多因子選股研究

查看全部