
「營業現金流正、投資現金流正、融資現金流正的公司,三項全部是正號,體質最好,就是飆股。」這是流傳很廣的一句財報口訣。我們用 finlab 把它放進 2015 年 2 月到 2026 年 7 月的台股實測,兩個結論可以先講清楚。第一,三項現金流全正不是好訊號,它在七種現金流組合裡年化報酬只有 CAGR 7.41%,墊底。第二,把選股條件換成營業現金流正再疊上營收與股價動能、集中選 5 檔的優化版,年化衝到 24.7%,帳面上比含息 0050 的 21.15% 高,但這個高報酬是拿更集中的持股與更深的回撤換來的,風險調整後其實輸給單純持有 0050。這篇文章把兩張真實回測表、逐年勝負和方法口徑全部攤開,程式碼可下載自行重跑。
兩個迷思,一句話講完
在往下看細節之前,先把答案放在最前面:
- 迷思一:三項現金流全正 = 飆股。 回測結果相反。三項全正的年化報酬 7.41%、月夏普 0.35,是七種現金流組合裡最差的一組。表現最好的反而是最單純的「營業現金流正」,年化 13.46%。
- 迷思二:把濾網疊到最猛、集中選 5 檔就穩贏。 也沒有那麼乾脆。優化版策略年化 24.7%,看起來大勝含息 0050 的 21.15%,但它的最大回撤 −49.58% 接近腰斬(0050 只有 −33.96%),日夏普、索提諾、卡爾瑪三個風險調整指標全部輸給 0050,而且 12 個年度裡只有 6 年跑贏,等於擲硬幣。
下面先看七種現金流組合的完整比較,再看優化策略的真實對照。
七種現金流組合比較:三項全正墊底
我們把營業、投資、融資三種現金流的正負號,組合出七種常見的選股條件,各自在同一段視窗(2015-02 至 2026-07)、finlab 預設交易成本下跑月換股回測。年化報酬與月夏普如下:
| 現金流組合 | 年化報酬(CAGR) | 月夏普 |
|---|---|---|
| 營業現金流正 | 13.46% | 0.64 |
| 營業正+投資負 | 13.33% | 0.63 |
| 營業正+融資負 | 13.27% | 0.64 |
| 自由現金流正 | 12.66% | 0.61 |
| 融資現金流正 | 9.60% | 0.46 |
| 投資現金流正 | 9.25% | 0.46 |
| 三項全正 | 7.41% | 0.35 |

上面這張長條圖把七種組合的年化報酬並排,最右邊那根最矮的就是三項全正。表現最好的三組(營業現金流正、營業正+投資負、營業正+融資負)年化都在 13% 出頭,夏普集中在 0.63 到 0.64 之間,彼此差距很小,共通點都是「營業現金流為正」。反觀把三種現金流都要求為正的組合,報酬直接掉到 7.41%,比只看營業現金流正的 13.46% 幾乎少了一半。
為什麼三項全正反而墊底
關鍵在於三種現金流的正負號各自代表不同的財務狀態,把它們的含義攤開就清楚了:
| 現金流 | 正號代表 | 負號代表 |
|---|---|---|
| 營業現金流 | 本業有賺到現金(好) | 本業在燒錢(差) |
| 投資現金流 | 在賣資產、縮減投資(要留意) | 在買設備、擴張投資(成長樣態) |
| 融資現金流 | 在借錢、增資(要留意) | 在還債、發股利(財務穩健) |
把三個正號放在一起讀,一家公司「營業現金流正、投資現金流正、融資現金流正」的真實面貌是:本業有賺錢,但同時在賣資產、縮減投資,還一邊借錢或增資。這是一個「本業還撐得住,卻在縮編又籌錢」的組合,不像積極擴張的成長股。真正的成長樣態應該是營業現金流為正、投資現金流為負,也就是本業賺錢並且把錢再投回擴張,這也是為什麼「營業正+投資負」在上表名列前段。三項全正之所以墊底,是因為把兩個帶警訊的正號(賣資產、借錢)硬綁進條件,反而篩掉了真正在投資未來的公司。
一個優化策略的嘗試,與 0050 的真實對照
既然營業現金流正是最有效的單一條件,我們以它為底,疊上兩個動能條件試著把報酬做高:營收創 12 個月新高(成長動能)、股價創 20 日新高(價格動能),加上流動性過濾,再用營收年增率排序集中選最強的 5 檔,月換股、單檔上限 20%、停損 10%。這個優化版在同一段視窗(2015-02 至 2026-07)的真實成績,和含息 0050 買進持有並排如下。0050 的報酬是把股息再投入的還原口徑,不是只看價格。
| 指標 | 優化版策略 | 0050 含息(基準) |
|---|---|---|
| 總報酬率 | +1122.73% | +781.27% |
| 年化報酬(CAGR) | 24.70% | 21.15% |
| 日夏普 | 0.95 | 1.12 |
| 日索提諾 | 1.32 | 1.53 |
| 最大回撤 | −49.58% | −33.96% |
| 卡爾瑪比率(Calmar) | 0.50 | 0.62 |

上面這張回撤比較圖把兩者的水下曲線疊在一起。優化版策略最大回撤 −49.58%,比 0050 含息的 −33.96% 深了將近 16 個百分點,接近腰斬。原因是這個策略只集中持有 5 檔、又偏向創新高的中小型成長股,個股波動遠大於分散的指數,在系統性下跌時跌得更兇。這正是它「更高年化」背後要付出的代價。

逐年報酬把勝負分佈畫得更清楚。優化版在 12 個年度裡只有 6 年跑贏 0050,逐年報酬(優化版/0050,單位 %)如下:2015 年 9.1/−10.9、2016 年 17.9/19.6、2017 年 53.5/18.1、2018 年 −14.5/−4.9、2019 年 3.7/33.5、2020 年 27.1/31.1、2021 年 77.3/21.9、2022 年 0.2/−21.4、2023 年 48.6/27.5、2024 年 15.9/48.6、2025 年 60.0/36.8、2026 年 12.2/69.0(YTD 未完整年)。策略贏得最漂亮的是 2017、2021、2023、2025 這幾個中小型成長股表態的年份;輸得最明顯的是 2019、2024、2026 這種權值股與 0050 領漲的多頭,集中在 5 檔創新高股的策略在這種行情裡明顯落後。
這個策略到底好不好
把上面的數字合起來看,結論要說清楚,不能只講「年化 24.7% 打敗 0050」。優化版的年化報酬確實比 0050 高約 3.5 個百分點,但這個差距是拿更集中的持股(只有 5 檔)與更深的回撤(−49.58% 對 −33.96%,接近腰斬)換來的。一旦把風險算進去,日夏普 0.95 輸給 0050 的 1.12、日索提諾 1.32 輸給 1.53、卡爾瑪 0.50 輸給 0.62,三個風險調整後的指標全部落後;再看逐年,12 年裡只贏 6 年,勝率等同擲硬幣。換句話說,這個策略更刺激但不見得更好,對多數投資人來說,直接買含息 0050 承擔的波動更小、每單位風險換回的報酬更高,可能是更務實的選擇。這篇文章真正可以帶走的知識,是前面那張七種現金流組合的比較表(看營業現金流、避開三項全正),而不是這個集中策略本身。
回測方法與限制
- 回測區間與換股:2015 年 2 月至 2026 年 7 月,共約 11.3 年。組合比較與優化版都用月換股(
resample="M")。2026 年為 YTD,非完整年度。 - 交易成本與稅:使用 finlab
sim()預設,已內含手續費 0.1425%(未打折)與賣出證交稅 0.3%,未另外假設滑價。實際下單的衝擊成本取決於資金規模與個股成交量,本文未估算策略容量。 - 流動性過濾:優化版要求 20 日均量達門檻,避免回測買得到、實單買不到的情況。
- 集中度與停損:優化版只持有 5 檔、單檔上限 20%、設 10% 停損,集中度高,單一個股漲跌對組合影響大,最大回撤 −49.58% 深於 0050。
- 前視偏差:財報現金流以公布後才可得的資訊對齊,月營收與股價創新高用的都是當期收盤即可得的數據,選股時點不會用到尚未揭露的資料。
- 股票池與生存者偏差:本文未特別排除金融股、ETF、KY 股或全額交割股,也未做上市櫃分層,回測母體以 finlab 資料庫的當期可交易標的為準。過去被下市的個股是否完整涵蓋,會影響生存者偏差,讀者若要做研究應自行檢查母體定義。
- 樣本內結果:本文是單一視窗(2015–2026)的全段回測,未做樣本外切割(
in_sample_only)。優化版的參數是在同一段歷史上選定的,逐年勝負請當成對這段資料的觀察,而非對未來的保證。
現金流因子的學術根據
看「營業現金流」而不是只看帳面盈餘,有其學術基礎。Sloan (1996) 提出著名的應計項目異常(accruals anomaly):他發現盈餘裡屬於現金流的部分,比屬於應計項目(尚未收到現金的帳面調整)的部分,更能預測未來的盈餘,而市場往往沒有正確區分兩者,導致高應計、低現金流的公司未來報酬偏低。這個發現正好對應本文的觀察,選股時把「本業真的有收到現金」(營業現金流為正)當成核心條件,比堆砌一堆現金流正負號的組合更有意義。
可讀版:七種組合怎麼跑出來
下面是七種現金流組合比較的人類可讀版本,登入後即可重跑。完整的優化版策略在可下載的 strategy.py 裡:
顯示程式碼
import finlab
from finlab import data
from finlab.backtest import sim
finlab.login() # finlab 會自動引導登入
# 三種現金流與流動性
operating = data.get("financial_statement:營業活動之淨現金流入_流出")
investing = data.get("financial_statement:投資活動之淨現金流入_流出")
financing = data.get("financial_statement:籌資活動之淨現金流入_流出")
volume = data.get("price:成交股數")
liquidity = volume.average(20) > 300 * 1000
# 七種現金流組合
combos = {
"營業現金流正": (operating > 0),
"投資現金流正": (investing > 0),
"融資現金流正": (financing > 0),
"自由現金流正": (operating + investing > 0),
"營業正+投資負": (operating > 0) & (investing < 0),
"營業正+融資負": (operating > 0) & (financing < 0),
"三項全正": (operating > 0) & (investing > 0) & (financing > 0),
}
# 逐一回測,比較年化報酬與月夏普
for name, cond in combos.items():
position = (cond & liquidity).loc["2015":]
report = sim(position, resample="M", position_limit=0.1, upload=False)
stats = report.get_stats()
print(name, round(stats["cagr"] * 100, 2), round(stats["monthly_sharpe"], 2))結論
在 2015 至 2026 這段期間、本文設定下,「三項現金流全正 = 飆股」這句財報口訣不成立:三項全正年化只有 7.41%,是七種現金流組合裡最差的,因為投資現金流正代表在賣資產、融資現金流正代表在借錢,把這兩個警訊硬綁進條件,反而篩掉了真正在擴張的成長股。表現最好的其實是最單純的「營業現金流正」。至於把它疊到最猛、集中選 5 檔的優化版,年化 24.7% 帳面上贏過含息 0050 的 21.15%,但那 3.5 個百分點是拿接近腰斬的回撤(−49.58%)與只贏一半年份換來的,風險調整後的夏普、索提諾、卡爾瑪全部落後,對多數人而言未必比直接持有 0050 更好。想用最新資料即時重算、或換成自己的現金流條件,跑下方的程式即可。
用 AI 開始 FinLab
把這句話交給你的AI,它會帶你完成設定並做出第一個策略。
告訴你的AI:
幫我設定 FinLab,重現這篇文章的三項現金流組合比較與現金流優化策略回測,請讀:https://finlab.finance/setup?relatedUrl=/blog/triple-cashflow-strategy
延伸閱讀
- 量化交易完整指南 — 三種台股量化策略的真實回測總覽與線上回測器
- 台股選股回測 2026:單因子全輸 0050,複合策略在風險調整後勝出 — 從完整選股總覽比較現金流、品質、動能與低波動因子
- PEG 策略:用本益成長比挖掘被低估的成長股 — 另一種財報選股法,結合成長率與估值
- 創新高策略:營收動能選股 — 用動能指標搭配營收篩選的高績效策略
- F-Score 選股:9 個財報指標升級你的策略 — 用 F-Score 進一步優化現金流選股的品質
- 多因子選股打敗 0050 — 把多個因子合成的完整多因子版本
VIP 區域接著提供完整可下載程式與互動式回測報告:strategy.py 與 data.csv 可自行重現本文優化版 CAGR 24.7%、日夏普 0.95、最大回撤 −49.58% 的全部數字,並附可逐年檢視持股與交易明細的互動式回測儀表板,跑一次即得當月這個策略實際選出的持股清單。
本文內容僅供教學與研究參考,不構成投資建議或推薦。投資有風險,過去績效不代表未來表現。本文優化版策略最大回撤達 −49.58%(接近腰斬),且風險調整後的夏普、索提諾、卡爾瑪皆輸給含息 0050,12 個年度裡只有 6 年跑贏。讀者應自行評估風險承受度,並在做出投資決策前諮詢專業顧問。
VIP 區域包含策略細節
登入後可看策略優化、完整程式碼與互動式回測報告
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

